迭代器, 生成器

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

set() 函數

建立一個無序不重複元素集,可進行關係測試,刪除重複數據,還能夠計算交集、差集、並集等。函數

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()
 
相關文章
相關標籤/搜索