python之字符串和常用數據結構

第二次世界大戰促使了現代電子計算機的誕生,當初的想法很簡單,就是用計算機來計算導彈的彈道,因此在計算機剛剛誕生的那個年代,計算機處理的信息主要是數值,而世界上的第一臺電子計算機ENIAC每秒鐘能夠完成約5000次浮點運算。隨着時間的推移,雖然對數值運算仍然是計算機日常工作中最爲重要的事情之一,但是今天的計算機處理得更多的數據都是以文本信息的方式存在的,而Python表示文本信息的方式我們在很早以前就說過了,那就是字符串類型。

使用字符串

我們可以通過下面的代碼來了解字符串的使用。

def main():
    str1='hello world'

    #通過len函數計算字符串的長度
    print(len(str1))
    #獲取字符串首字母大寫的拷貝
    print(str1.capitalize())
    # 獲得字符串變大寫後的拷貝
    print(str1.upper())
    # 從字符串中查找子串所在位置
    print(str1.find('or'))
    print(str1.find('el'))
    # 檢查字符串是否以指定的字符串開頭
    print(str1.startswith("he"))
    print(str1.startswith("He"))
    # 檢查字符串是否以指定的字符串結尾
    print(str1.endswith('D'))
    # 將字符串以指定的寬度居中並在兩側填充指定的字符
    print(str1.center(50,"*"))
    # 將字符串以指定的寬度靠右放置左側填充指定的字符
    print(str1.rjust(50,' '))
    str2 = 'abc123456'
    # 從字符串中取出指定位置的字符(下標運算)
    print(str2[2])
    # 字符串切片(從指定的開始索引到指定的結束索引)
    print(str2[2:5])
    print(str2[2:])
    print(str2[2::2])# 對字符串進行切片,從2開始,每隔兩個字符切一次 結果爲c246
    print(str2[::2])# 對字符串進行切片,從頭開始,每隔兩個字符切一次 結果爲ac246
    print(str2[-3:-1])
    # 檢查字符串是否由數字構成
    print(str2.isdigit())
    # 檢查字符串是否以數字和字母構成
    print(str2.isalnum())
    str3 = '  [email protected] '
    print(str3)
    # 獲得字符串修剪左右兩側空格的拷貝
    print(str3.split())
if __name__ == '__main__':
  main()

除了字符串,Python還內置了多種類型的數據結構,如果要在程序中保存和操作數據,絕大多數時候可以利用現有的數據結構來實現,最常用的包括列表、元組、集合和字典。

使用列表

下面的代碼演示瞭如何定義列表、使用下標訪問列表元素以及添加和刪除元素的操作。

def main():
    list1=[1,3,5,7,100]
    print (list1)
    list2=['hello']*5
    print(list2)
    # 計算列表長度(元素個數)
    print(len(list2))
    # 下標(索引)運算
    print(list1[0])
    print(list1[4])
    print(list1[-1])
    print(list1[-3])

    list1[2]=300
    print(list1)
    # 添加元素
    list1.append(200)
    list1.insert(1,400)
    list1+=[1000,2000]
    print(list1)
    #刪除元素
    list1.remove(3)
    if 200 in list1:
        list1.remove(200)
    del list1[0]
    print list1

if __name__ == '__main__':
  main()

和字符串一樣,列表也可以做切片操作,通過切片操作我們可以實現對列表的複製或者將列表中的一部分取出來創建出新的列表,代碼如下所示。

def main():
    fruits= ['grape', 'apple', 'strawberry', 'waxberry']
    fruits+= ['pitaya', 'pear', 'mango']
    for fruit in fruits:
        print(fruit.title())


    fruits2=fruits[1:4]
    print(fruits2)
    fruits3 = fruits[:]
    print(fruits3)
    fruits4=fruits[-3:-1]
    print(fruits4)
    # 可以通過反向切片操作來獲得倒轉後的列表的拷貝
    fruits5=fruits[::-1]
    print(fruits5)

if __name__ == '__main__':
  main()

對列表的排序操作

def main():
    list1 = ['orange', 'apple', 'zoo', 'internationalization', 'blueberry']
    # sorted函數返回列表排序後的拷貝不會修改傳入的列表
    list2=sorted(list1)
    list3 = sorted(list1, reverse=True)
    # 通過key關鍵字參數指定根據字符串長度進行排序而不是默認的字母表順序
    list4=sorted(list1,key=len)
    print(list1)
    print(list2)
    print(list3)
    print(list4)
    # 給列表對象發出排序消息直接在列表對象上進行排序
    list1.sort(reverse=True)
    print(list1)

if __name__ == '__main__':
  main()

我們還可以使用列表的生成式語法來創建列表,代碼如下所示。

import sys

def main():
    f=[x for x in range(1,10)]
    print(f)
    f=[x+y for x in 'ABCDE' for y in '1234567']
    print(f)
    # 用列表的生成表達式語法創建列表容器
    # 用這種語法創建列表之後元素已經準備就緒所以需要耗費較多的內存空間
    f = [x ** 2 for x in range(1,1000)]
    print(sys.getsizeof(f))# 查看對象佔用內存的字節數
    print(f)
    # 請注意下面的代碼創建的不是一個列表而是一個生成器對象
    # 通過生成器可以獲取到數據但它不佔用額外的空間存儲數據
    # 每次需要數據的時候就通過內部的運算得到數據(需要花費額外的時間)
    f=(x**2 for x in range(1,1000))
    print (sys.getsizeof(f))# 相比生成式生成器不佔用存儲數據的空間
    print(f)
    for val in f:
        print(val)

if __name__ == '__main__':
  main()

使用元組

Python 的元組與列表類似,不同之處在於元組的元素不能修改,在前面的代碼中我們已經不止一次使用過元組了。顧名思義,我們把多個元素組合到一起就形成了一個元組,所以它和列表一樣可以保存多條數據。下面的代碼演示瞭如何定義和使用元組。

def main():
    t=('張三', 38, True, '某某')
    # 獲取元組中的元素
    print(t[0])
    print(t[3])
    # 遍歷元組中的值
    for member in t:
        print(member)
    # 變量t重新引用了新的元組原來的元組將被垃圾回收
    t=('王大錘', 20, True, '雲南昆明')
    # 將元組轉換成列表
    person=list(t)
    print(person)
    # 列表是可以修改它的元素的
    person[0]='李小龍'
    person[1]=25
    print(person)
    # 將列表轉換成元組
    fruits_list=['apple', 'banana', 'orange']
    fruits_tuple=tuple(fruits_list)
    print(fruits_tuple)
if __name__ == '__main__':
  main()

使用字典

字典是另一種可變容器模型,類似於我們生活中使用的字典,它可以存儲任意類型對象,與列表、集合不同的是,字典的每個元素都是由一個鍵和一個值組成的“鍵值對”,鍵和值通過冒號分開。下面的代碼演示瞭如何定義和使用字典。

def main():
    scores = {'張三': 95, '白元芳': 78, '狄仁傑': 82}
    print(scores['張三'])
    print(scores['狄仁傑'])
    # 對字典進行遍歷(遍歷的其實是鍵再通過鍵取對應的值)
    for elem in scores:
        print('%s\t--->\t%d' % (elem, scores[elem]))

    # 更新字典中的元素
    scores['白元芳']=65
    scores['諸葛王朗']=71

    # 刪除字典中的元素
    print(scores.popitem())

if __name__ == '__main__':
  main()

強化練習

練習1:在屏幕上顯示跑馬燈文字

import os
import time

def main():
    content="北京歡迎你爲你開天闢地...."
    while True:
        os.system('cls')
        print(content)
        time.sleep(0.2)
        content=content[1:]+content[0]

if __name__ == '__main__':
    main()

練習2:設計一個函數產生指定長度的驗證碼,驗證碼由大小寫字母和數字構成。

import random


def generate_code(code_len=4):
    """
    生成指定長度的驗證碼

    :param code_len: 驗證碼的長度(默認4個字符)

    :return: 由大小寫英文字母和數字構成的隨機驗證碼
    """
    all_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
    last_pos = len(all_chars) - 1
    code = ''
    for _ in range(code_len):
        index = random.randint(0, last_pos)
        code += all_chars[index]
    return code


tmp=generate_code(code_len=5)
print tmp

練習3:計算指定的年月日是這一年的第幾天

#計算指定的年月日是這一年的第幾天
def is_leap_year(year):
    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0

def which_day(year,month,date):
    days_of_month=[
        [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
        [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    ][is_leap_year(year)]
    total=0
    for index in range(month - 1):
        total+=days_of_month[index]
    return total+date


def main():
    #print(is_leap_year(1980))
    print(which_day(1980,11,28))


if __name__ == '__main__':
    main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章