国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

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

服務(wù)器之家 - 腳本之家 - Python - python基礎(chǔ)之迭代器與生成器

python基礎(chǔ)之迭代器與生成器

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

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

1. 迭代器

1.1 迭代器的使用

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

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

iter和next使用舉例

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

for循環(huán)使用舉例:

?
1
2
3
4
lst = [1,2,3,4]
it = iter(lst) #創(chuàng)建迭代器對象
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)  # 創(chuàng)建迭代器對象
 
while True:
    try:
        print(next(it))
    except StopIteration:
        sys.exit()

輸出:

1
2
3
4

1.2 創(chuàng)建類的迭代器

把一個類作為一個迭代器使用需要在類中實(shí)現(xiàn)兩個方法 __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: #迭代次數(shù),要不然for循環(huán)會一直執(zhí)行
            x = self.a
            self.a += 1
            return x
        else:
            raise StopIteration
 
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter: #這里也可以直接用對象,因?yàn)樗念愐呀?jīng)定義iter和next。
    print(x,end = " ") # 1 2 3 4 5 6 7 8 9 10

2. 生成器

2.1 生成器的使用

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

生成器的簡單使用舉例:

?
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)) # 報(bào)錯!!!因?yàn)檫@個函數(shù)只返回了一個迭代器

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

?
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循環(huán)操作時(shí),遍歷了5次,最后一次會調(diào)用StopIteration,所以會輸出5次"I am a generator!"。但是如果使用next則會不同,因?yàn)樗粫詣诱{(diào)用下一次的函數(shù),如下例所示:

?
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,迭代器的值

輸出結(jié)果為:

<generator object func at 0x7fd74460b308>
10

可以看到,因?yàn)闆]有繼續(xù)調(diào)用函數(shù),而不會執(zhí)行yield后面的程序!

2.2 生成器表達(dá)式

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

?
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

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注服務(wù)器之家的更多內(nèi)容!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 精品国产一区探花在线观看 | 国产成人精品一区二区 | 日韩免费高清视频 | 欧美日本在线观看 | 精品天堂 | 国产精品久久久久久久久 | 国产精品污www一区二区三区 | 精品国产91亚洲一区二区三区www | 久久亚洲精品国产精品紫薇 | 亚洲三级在线观看 | 国产精品成人国产乱一区 | 亚洲精品一二三区 | 日日爱影视 | 色版视频在线观看 | 四虎影院网 | 欧美日韩一区在线 | 国产成人在线播放 | 久久精品一区二区三区不卡牛牛 | 免费观看黄视频 | 91最新视频| 日韩欧美三级在线观看 | 亚洲一区二区视频在线观看 | 一级片视频在线观看 | 黄色电影免费在线观看 | 黄色国产 | 国产电影一区二区 | 中文在线视频 | 亚洲第一视频 | 久久99精品久久久久久 | 国产精品久久久久久久久久久久 | 成人性生交大片免费看网站 | 亚洲第一黄色网 | 国产精品欧美一区二区三区 | 久久国产精品免费一区二区三区 | 四虎影视永久免费观看 | 夜夜爽av福利精品导航 | 日韩中文字幕一区二区三区 | 在线永久免费观看黄网站 | 美女视频一区 | 91视频观看| 免费伊人网 |