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()