一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python基礎之迭代器與生成器

python基礎之迭代器與生成器

2022-03-09 12:58非晚非晚 Python

這篇文章主要為大家介紹了python迭代器與生成器,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1. 迭代器

1.1 迭代器的使用

迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會后退。迭代器有兩個基本的方法:iter() 和 next()。字符串,列表或元組對象都可用于創建迭代器。

iter(iterable):用于返回可迭代對象的一個迭代器。
next(iterator): 從迭代器iterator中獲取下一條記錄。如果無法獲取下 一條記錄,則觸發StopIteration異常

iter和next使用舉例

?
1
2
3
4
5
lst = [1,2,3,4]
it = iter(lst) #創建迭代器對象
print(it) # <list_iterator object at 0x7fb8e443ed30>
print(next(it)) # 1
print(next(it)) # 2

for循環使用舉例:

?
1
2
3
4
lst = [1,2,3,4]
it = iter(lst) #創建迭代器對象
for x in it:
    print(x, end=" ") # 1 2 3 4

也可以使用next替代上例:

?
1
2
3
4
5
6
7
8
9
10
import sys  # 引入 sys 模塊
 
lst = [1, 2, 3, 4]
it = iter(lst)  # 創建迭代器對象
 
while True:
    try:
        print(next(it))
    except StopIteration:
        sys.exit()

輸出:

1
2
3
4

1.2 創建類的迭代器

把一個類作為一個迭代器使用需要在類中實現兩個方法 __iter__() 與 __next__() 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyNumbers:
    def __iter__(self):
        self.a = 1
        return self
 
    def __next__(self):
        if self.a <= 10: #迭代次數,要不然for循環會一直執行
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration
 
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter: #這里也可以直接用對象,因為它的類已經定義iter和next。
    print(x,end = " ") # 1 2 3 4 5 6 7 8 9 10

2. 生成器

2.1 生成器的使用

在 Python 中,使用了 yield 的函數被稱為生成器(generator)。跟普通函數不同的是,生成器是一個返回迭代器的函數,只能用于迭代操作,更簡單點理解生成器就是一個迭代器。

生成器的簡單使用舉例:

?
1
2
3
4
5
6
7
def func(n):
    yield n*2
 
f = func(5)
print(f) # <generator object func at 0x7f36613ad308>
print(next(f)) # 10,迭代器的值
print(next(f)) # 報錯?。。∫驗檫@個函數只返回了一個迭代器

便于理解,可以把yield當做return操作,不同的是,yield后面的代碼會在下一次調用函數的時候繼續執行。所以遇到yield操作時,首先需要先返回迭代器的值,而不會立馬執行yield后面的代碼,等到下一次調用函數的時候,會繼續執行上一次沒有完成的操作。顯然,使用生成器比迭代器簡單,而且性能是一樣高效的,我們再來舉一個例子進行說明。

?
1
2
3
4
5
6
7
8
9
10
11
def fib(n):
    pre,curr = 0,1
    while n > 0:
        n-=1
        yield curr
        pre,curr = curr,curr+pre
        print("I am a generator!")
 
for i in fib(5):
    print(i)
    print("-----------------------")

輸出:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1
-----------------------
I am a generator!
1
-----------------------
I am a generator!
2
-----------------------
I am a generator!
3
-----------------------
I am a generator!
5
-----------------------
I am a generator!

使用for循環操作時,遍歷了5次,最后一次會調用StopIteration,所以會輸出5次"I am a generator!"。但是如果使用next則會不同,因為它不會自動調用下一次的函數,如下例所示:

?
1
2
3
4
5
6
7
def func(n):
    yield n*2
    print("I am a generator!")
 
f = func(5)
print(f) # <generator object func at 0x7f36613ad308>
print(next(f)) # 10,迭代器的值

輸出結果為:

<generator object func at 0x7fd74460b308>
10

可以看到,因為沒有繼續調用函數,而不會執行yield后面的程序!

2.2 生成器表達式

生成器表達式與列表推導式很像,唯一的區別就是一個使用綜括號一個使用小括號,生成器表達式返回生成器對象,而列表推導式返回列表對象。

?
1
2
3
4
5
g = (i*2 for i in range(10))
print(type(g)) # <class 'generator'>
 
for i in g:
    print(i,end=" ") # 0 2 4 6 8 10 12 14 16 18

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/QLeelq/article/details/121597427

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久婷婷丁香五月色综合啪免费 | 亚洲偷窥图区色 | 波多野结衣178部中文字幕 | 亚洲免费在线观看 | 久久爽狠狠添AV激情五月 | 亚洲色影 | caoporm碰最新免费公开视频 | 波多野结衣伦理在线观看 | 国产福利片在线 易阳 | 欧美日韩亚洲成人 | 视频在线观看高清免费看 | 男人女人日批 | 四虎精品视频在线永久免费观看 | 国产精品一级视频 | 精品亚洲国产一区二区 | www.九九| 无码AV免费精品一区二区三区 | 日本人啪啪 | 99热国产这里只有精品 | 国产好痛疼轻点好爽的视频 | 亚洲精品乱码久久久久久蜜桃欧美 | 国产在线观看精品香蕉v区 国产在线观看a | 美味情缘韩国在线观看视频 | a毛片免费全部在线播放毛 a级在线看 | 男人天堂网址 | 99re热| 欧美特欧美特级一片 | 97国产影院| 美女视频ww8888网网 | 国产欧美日韩一区二区三区在线 | 日本黄大片影院一区二区 | 国产精品一区二区三 | 短篇小说肉| 精品久久国产 | 亚洲电影不卡 | 日韩欧美一区二区在线 | 亚洲男人的天堂视频 | 免费一看一级欧美 | 亚洲 欧美 国产 综合 播放 | 天堂中文在线免费观看 | 欧美性xxxxxx爱 |