自學Python--迭代、列表生成式、生成器、迭代器
阿新 • • 發佈:2019-01-23
可迭代物件:可通過for迴圈遍歷的物件。通過collections模組的Iterable判斷
from collections import Iterable
print(isinstance('abc', Iterable)) # True
如果對列表實現類似java的下標迴圈,可通過內建函式enumerate
for i, v in enumerate([1, 2, 3, 4, 5, 6]): print(i, '-->', v) ''' 0 --> 1 1 --> 2 2 --> 3 3 --> 4 4 --> 5 5 --> 6 '''
列表生成式:
l1 = [x * x for x in range(1, 10) if x % 2 == 0]
print(l1) # [4, 16, 36, 64]
l2 = [m + n for m in 'ABC' for n in 'XYZ']
print(l2) # ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
生成器generator:一邊迴圈一邊計算的機制
建立一個生成器:
把列表生成式的[]改成()即可,使用next()或者__next()__可獲取生成器的下一個返回值:
l1 = (x * x for x in range(1, 10) if x % 2 == 0) print(type(l1)) # <class 'generator'> print(next(l1)) # 4 print(l1.__next__()) # 16 l2 = (m + n for m in 'ABC' for n in 'XYZ') print(type(l2)) # <class 'generator'>
生成器是可迭代物件,因此也可以使用for迴圈遍歷
斐波拉契數列:除前兩個數外,任意一個屬都是前兩個數相加得到,如1,1,2,3,5,8,13,21
斐波拉契數列用列表生成式寫不出來,但可以用函式打印出來:
def fib(max):
a, b = 0 ,1
for i in range(0, max):
print(b)
a, b = b, a + b
return 'ok'
fib(8) # 1 1 2 3 5 8 13 21
把fib函式變成生成器generator:如果一個函式包含yield關鍵字,這個函式就是一個generator
def fib(max):
a, b = 0 ,1
for i in range(0, max):
yield b
a, b = b, a + b
return 'ok'
res = fib(8)
for i in res:
print(i) # 1 1 2 3 5 8 13 21
楊輝三角:todo
def triangles(n):
current_list = [1]
pre_list = [1 ,1]
for i in range(1,n+1):
if i == 1:
yield [1]
elif i == 2:
yield [1, 1]
else:
for j in range(1,i-1):
current_list.append(pre_list[j-1] + pre_list[j])
current_list.append(1)
yield current_list
pre_list = current_list
current_list = [1]
res = triangles(6)
for i in res:
print(i)
迭代器:
可迭代物件:
可直接用for迴圈遍歷的物件,如list、tuple、dict、set、str、generator
迭代器:
可以被next()函式呼叫並不斷返回下一個值的物件稱為迭代器Iterator