Hi! 大家好,我是Eric,這次教大家Python的迭代器(iterator)!
■ 遍歷列表
iter([2, 4, 6, 8, 10])
I = iter([2, 4, 6, 8, 10])
print(next(I))
print(next(I))
■ 不總是列表的列表:range()
range(10)
iter(range(10)) #range具有迭代器介面
N = 10 ** 12
for i in range(N):
if i >= 10: break
print(i, end=', ')
#Python的itertools套件中的count(),功能為無窮range
from itertools import count
for i in count():
if i >= 10:
break
print(i, end=', ')
■ 實用迭代器介紹
L =[2, 4, 6, 8, 10]
for i in range((L)):
print(i, L(i))
for i,val in enumerate(L):
print(i, val)
L = [2, 4, 6, 8, 10]
R = [3, 6, 9, 12, 15]
for lval, rval in zip(L, R):
print(lval, rval)
#任意數量的可迭代物件都可被連在⼀起,其中最短的那個列表將決定整個 zip 迭代器的長度。
# map 迭代器接受⼀個函式,並將它套用到迭代器中每⼀個值
square = lambda x: x ** 2
for val in map(square, range(10)):
print(val, end=' ')
# filter 迭代器看上去類似,但它只保留可以讓過濾函式為真的值
is_even = lambda x: x % 2 == 0
for val in filter(is_even, range(10)):
print(val, end=' ')
# *args 語法不僅僅適用於序列,同樣適⽤於任意迭代器
print(*range(10))
# 我們可以將之前的 map 例子用⼀個技巧整合進下面的函式呼叫
print(*map(lambda x: x ** 2, range(10)))
L1 = (1, 2, 3, 4)
L2 = ('a', 'b', 'c', 'd')
z = zip(L1, L2)
print(*z)
z = zip(L1, L2)
new_L1, new_L2 = zip(*z)
print(new_L1, new_L2)
# itertools.permutations 函式在一個列表的全排(full permutation)中進行迭代
from itertools import permutations
p = permutations(range(3))
print(*p)
# itertools.combinations 函式在⼀個列表中將所有不同的 N 組合中進行迭代
from itertools import combinations
c = combinations(range(4), 2)
print(*c)
# product這個迭代器對兩個或多個可迭代物件進⾏兩兩配對(實際上是求兩個或多個集合的笛卡爾積(Cartesian Product)) ,最終產生⼀個集合進行迭代
from itertools import product
p = product('ab', range(3))
print(*p)
■ Refer to《Python 旋風之旅,[正體中文]Will保哥》的第11章