Python3學習筆記06——列表創建

  • 2020 年 1 月 12 日
  • 筆記

在Python中使用for循環是,只要作用於一個可迭代對象,for循環就可以正常運行,而我們不太關心該對象究竟是list還是其他數據類型。 那麼,如何判斷一個對象是可迭代對象呢?方法是通過collections模組的Iterable類型判斷:

from collections.abc import Iterable    r=isinstance('ABC',Iterable) # str是否可迭代    print(r)

結果: TRUE 表明是可迭代對象。

#用循環生成列表

L=[]  for x in range(1,11):      L.append(x*x)    print(L)

#列表生成式

print([x*x for x in range(1,11)])

#for 循環後邊還可以加上if判斷 #比如只生成偶數的平方

print([x*x for x in range(1,11) if x%2==0])

#還可以使用兩層循環,生成全排列

print([m+n for m in 'ABC' for n in 'XYZ'])

#把一個list中的所有的字元串變成小寫:

L=['Hello','World','IBM','Apple']  print([s.lower() for s in L])

運行結果依次為: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] [4, 16, 36, 64, 100] [『AX』, 『AY』, 『AZ』, 『BX』, 『BY』, 『BZ』, 『CX』, 『CY』, 『CZ』] [『hello』, 『world』, 『ibm』, 『apple』]

如果list中既包含字元串,又包含整數,由於非字元串類型沒有lower()方法,所以里欸報生成式會報錯。 L= L=[『Hello』,『World』,18,『IBM』,『Apple』] 此時,可使用內建的isinstance函數判斷一個變數是不是字元串:

#list中既包含字元串,有包含整數

L=['Hello','World',18,'Apple',None]  print([s.lower() for s in L if isinstance(s,str) ])

生成器: 不創建完整的list,一邊循環一邊計算的機制,成為生成器:generator,此方法可節省大量空間。

要創建一個generator,有很多種方法。第一種很簡單,只要把一個列表生成式的【】改成(),就創建了一個generator():

g=(x*x for x in range(10))  print(g)

輸出結果: <generator object at 0x0000010EA9D3FD68>

generator保存的是演算法,每次調用next(g),就計算出g的下一個元素的值,直到計算到最後一個元素,沒有更多元素時,拋出StopIteration的錯誤。 當然,不斷調用next(g)這種列印返回值的方法太變態了,正確的方法是使用for循環,因為generator也是可迭代對象:

第二種方法:用函數生成 斐波拉契數列的推算規則,可以從第一個元素開始,推算出後續任意的元素,這種邏輯其實非常類似generator,也就是說,斐波拉契函數和generator僅一步之遙。要把fib函數變成generator,只需要把print(b)改為yield b 就可以了。

def fib(max):      n,a,b=0,0,1      while n<max:          yield b          a,b=b,a+b          n=n+1      return 'done'    print(fib(6))

這裡最難理解的就是generator和函數的執行流程不一樣。函數是順序執行,遇到return語句或者最後一行函數語句就返回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。

#楊輝三角

def yanghui(t):      print([1])      line=[1,1]      print(line)      for i in range(2,t):            r=[]            for i in range(0,len(line)-1):                r.append(line[i]+line[i+1])            line=[1]+r+[1]            print(line)  print(yanghui(6))

輸出結果: [1] [1, 1] [1, 2, 1] [1, 3, 3, 1] [1, 4, 6, 4, 1] [1, 5, 10, 10, 5, 1] None