zip() 函數
用於將可迭代的對象做爲參數,將對象中對應的元素打包成一個個元組,而後返回由這些元組組成的對象,這樣作的好處是節約了很多的內存。能夠使用 list() 轉換來輸出列表。python
若是各個迭代器的元素個數不一致,則返回列表長度與最短的對象相同,利用 * 號操做符,能夠將元組解壓爲列表。
編程
a = [1,2,3] b = [4,5,6] c = [4,5,6,7,8] # 返回一個對象 p = zip(a,b) # <zip at 0x1b09a917388> list(p) # list() 轉換爲列表 Out: [(1, 4), (2, 5), (3, 6)] list(zip(a, c)) # 元素個數與最短的列表一致 Out: [(1, 4), (2, 5), (3, 6)] # 與 zip 相反,zip(*) 可理解爲解壓,返回二維矩陣式 a1 ,a2 = zip(*zip(a,b)) list(a1) Out: [1, 2, 3] strs = ["flower","flow","flight"] tmp = zip(*strs) next(tmp) # ('f', 'f', 'f') next(tmp) # ('l', 'l', 'l')
建立一個無序不重複元素集,可進行關係測試,刪除重複數據,還能夠計算交集、差集、並集等。函數
tmp = ['s','s','l'] set(tmp) Out[25]: {'l', 's'} x = set('runoob') y = set('google') Out : set(['b', 'r', 'u', 'o', 'n']), set(['e', 'o', 'g', 'l'])) # 重複的被刪除 x & y # 交集 set(['o']) x | y # 並集 set(['b', 'e', 'g', 'l', 'o', 'n', 'r', 'u']) x - y # 差集 set(['r', 'b', 'u', 'n'])
迭代
是Python最強大的功能之一,是訪問集合元素的一種方式。迭代器是一個能夠記住遍歷的位置的對象。測試
迭代器對象從集合的第一個元素開始訪問,直到全部的元素被訪問完結束。迭代器只能往前不會後退。google
迭代器有兩個基本的方法:iter() 和 next()。spa
字符串,列表或元組對象均可用於建立迭代器:code
list = [1,2,3,4]
it = iter(list) # 建立迭代器對象
print (next(it)) # 輸出迭代器的下一個元素 1
print (next(it)) # 2
for x in it: # for 後加迭代器,依次獲取其值
print(x)
對象
建立一個迭代器
把一個類做爲一個迭代器使用須要在類中實現兩個方法 __iter__() 與 __next__() 。blog
若是瞭解的面向對象編程,就知道類都有一個構造函數,Python 的構造函數爲 __init__(), 它會在對象初始化的時候執行。ip
__iter__() 方法返回一個特殊的迭代器對象, 這個迭代器對象實現了 __next__() 方法並經過 StopIteration 異常標識迭代的完成。
__next__() 方法會返回下一個迭代器對象。
建立一個返回數字的迭代器,初始值爲 1,逐步遞增 1:
class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): x = self.a self.a +=1 return x myclass = MyNumbers() myiter = iter(myclass) print(next(myiter)) # 1 print(next(myiter)) # 2 print(next(myiter)) # 3 print(next(myiter)) # 4 print(next(myiter)) # 5
生成器
在 Python 中,使用了 yield 的函數 被稱爲生成器(generator)。
跟普通函數不一樣的是,生成器是一個返回 迭代器的函數,只能用於迭代操做,更簡單點理解 生成器就是一個迭代器。
在調用生成器運行的過程當中,每次遇到 yield 時函數會暫停並保存當前全部的運行信息,
返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續運行。調用一個生成器函數,返回的是一個迭代器對象。
如下實例使用 yield 實現斐波那契數列:
import sys def fibonacci(n): # 生成器函數 - 斐波那契 a, b, counter = 0, 1, 0 while True: if (counter > n): return yield a a, b = b, a + b counter += 1 f = fibonacci(10) # f 是一個迭代器,由生成器返回生成 while True: try: print (next(f), end=" ") except StopIteration: sys.exit()