激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美一级理论 | 国产人成免费爽爽爽视频 | 国产亚洲精品美女久久久 | 污视频在线免费 | 欧美成人免费香蕉 | av电影免费播放 | 免费黄色入口 | 日韩精品99久久久久久 | 美女视频免费一区二区 | 亚洲精品有限 | 国产一级不卡毛片 | 欧美一级黄视频 | 曰批全过程120分钟免费69 | 欧美日韩国产中文字幕 | av免费av| 成人青青草 | 国产一区网址 | 欧美日韩亚洲另类 | 久久久电影电视剧免费看 | 亚洲精品无码不卡在线播放he | 在线观看一区二区三区四区 | 国产精品一区在线免费观看 | 成人久久久精品国产乱码一区二区 | 日韩中字幕 | 欧美性生交xxxxx久久久 | 国产成人av免费观看 | 99久久电影 | av在线免费观看网 | 91短视频版高清在线观看免费 | 国产在线一区二区三区 | 亚洲免费视频一区 | 国产在线观看av | 精品国产一区二区三区久久久蜜月 | 日本成人二区 | 精品免费国产一区二区三区 | 色视频91| 黄色av网站在线观看 | 欧美成人免费 | 久色乳综合思思在线视频 | 99影视电影电视剧在线播放 | 欧美视频国产 |