>: ').strip() print(msg)# 獲取到返回值num_list = [0, 1, 2, 3, 4, 5]count = 0while count ? ? 【二】可迭代對(duì)象 【1】什么是可迭代對(duì)象 從語(yǔ)法上講,內(nèi)置有 __ iter __ 方法的對(duì)象都是可迭代對(duì)象 【2】" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

yield + next搭配著使用

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2025-01-14 11:21 ? 次閱讀

【一】迭代器

【1】介紹

迭代器即用來(lái)迭代取值的工具,而迭代是重復(fù)反饋的過(guò)程的活動(dòng)

其目的通常是為了逼近所需的目標(biāo)或結(jié)果,每一次對(duì)過(guò)程的重復(fù)稱為一次”迭代“

而每一次迭代得到的結(jié)果會(huì)作為下一次迭代的初始值,單純的重復(fù)并不是迭代

while True:
    msg = input('>>: ').strip()
    print(msg)

# 獲取到返回值
num_list = [0, 1, 2, 3, 4, 5]
count = 0
while count < len(num_list):
    # 每一次使用的索引位置就是上一次 +1 后的索引位置
    print(num_list[count])
    count += 1

【二】可迭代對(duì)象

【1】什么是可迭代對(duì)象

從語(yǔ)法上講,內(nèi)置有 __ iter __ 方法的對(duì)象都是可迭代對(duì)象

【2】八大基本數(shù)據(jù)類型

# 【1】數(shù)字類型
# 【1.1】整數(shù)類型 --- 不是
num = 1
print(num.__iter__)
'''
Traceback (most recent call last):
  File "E:PythonProjects迭代器.py", line 10, in 
    print(num.__iter__)
AttributeError: 'int' object has no attribute '__iter__'. Did you mean: '__str__'?
'''

# 【1.2】浮點(diǎn)類型 --- 不是
num_float = 1.0
print(num_float.__iter__())
'''
Traceback (most recent call last):
  File "E:PythonProjects迭代器.py", line 20, in 
    print(num_float.__iter__)
AttributeError: 'float' object has no attribute '__iter__'. Did you mean: '__str__'?
'''

# 【2】字符串類型
name = 'chosen'
print(name.__iter__)
# 
print(name.__iter__())
# 

# 【3】布爾類型
is_right = False
print(is_right.__iter__)
'''
Traceback (most recent call last):
  File "E:PythonProjects迭代器.py", line 37, in 
    print(is_right.__iter__)
AttributeError: 'bool' object has no attribute '__iter__'. Did you mean: '__str__'?
'''

# 【4】列表類型
name_list = [1, 2, 3]
print(name_list.__iter__)
# 
print(name_list.__iter__())
# 

# 【5】字典類型
info_dict = {"name": "chosen"}
print(info_dict.__iter__)
# 
print(info_dict.__iter__())
# 

# 【6】元祖類型
num_tuple = (1,)
print(num_tuple.__iter__)
# 
print(num_tuple.__iter__())
# 

# 【7】集合類型
num_set = {1}
print(num_set.__iter__)
# 
print(num_set.__iter__())
# 

【3】總結(jié)

非可迭代對(duì)象

整數(shù)類型

浮點(diǎn)類型

布爾類型

可迭代類型

字符串類型

列表類型

字典類型

元組類型

集合類型

【三】迭代器對(duì)象

【1】什么是迭代器對(duì)象

調(diào)用obj.__iter__()方法返回的結(jié)果就是一個(gè)迭代器對(duì)象(Iterator)。

迭代器對(duì)象是內(nèi)置有 iter 和 next 方法的對(duì)象,打開的文件本身就是一個(gè)迭代器對(duì)象

執(zhí)行迭代器對(duì)象.iter()方法得到的仍然是迭代器本身

而執(zhí)行迭代器.next()方法就會(huì)計(jì)算出迭代器中的下一個(gè)值。

迭代器是Python提供的一種統(tǒng)一的、不依賴于索引的迭代取值方式,只要存在多個(gè)“值”,無(wú)論序列類型還是非序列類型都可以按照迭代器的方式取值

【2】八大基本數(shù)據(jù)類型

# 【1】字符串類型
name_str = 'chosen'
name_iter = name_str.__iter__()
name_iter_two = iter(name_str)
print(name_iter)
print(name_iter_two)
# 
# 
print(name_iter.__next__())
# c
print(next(name_iter))
# h

# 【2】列表類型
name_list = [1, 2, 3]
name_list_iter = iter(name_list)
print(name_list_iter)
# 
print(name_list_iter.__next__())
# 1
print(next(name_list_iter))
# 2

# 【3】字典類型
info_dict = {"name": "chosen", "age": 18}
info_dict_iter = iter(info_dict)
print(info_dict_iter)
# 
print(info_dict_iter.__next__())
# name
print(next(info_dict_iter))
# age

# 【4】元祖類型
num_tuple = (1, 2)
num_tuple_iter = iter(num_tuple)
print(num_tuple_iter)
# 
print(num_tuple_iter.__next__())
# 1
print(next(num_tuple_iter))
# 2

# 【5】集合類型
num_set = {1, 2, 3}
num_set_iter = iter(num_set)
print(num_set_iter)
# 
print(num_set_iter.__next__())
# 1
print(next(num_set_iter))
# 2

【3】總結(jié)

# 具有 __iter__() 和 __next__() 的對(duì)象就是迭代器對(duì)象
# 在八大基本數(shù)據(jù)類型中
# 除了 整數(shù)、浮點(diǎn)數(shù)、布爾
# 其他的都是迭代器對(duì)象

# 迭代器對(duì)象一定是可迭代對(duì)象

# 可迭代對(duì)象是 具有 __iter__() 的對(duì)象 ---> 生成一個(gè)可迭代對(duì)象
# 迭代器對(duì)象是 具有 __iter__()  和 __next__() 的對(duì)象 --> 調(diào)用上面可迭代對(duì)象的 next 方法

【四】迭代器的優(yōu)缺點(diǎn)

【1】?jī)?yōu)點(diǎn)

為序列和非序列類型提供了一種統(tǒng)一的迭代取值方式

不使用索引進(jìn)行取值

取到值的時(shí)候會(huì)保存到當(dāng)前的狀態(tài),下一次從這個(gè)位置開始向下取值

【2】缺點(diǎn)

除非取盡,否則無(wú)法獲取迭代器的長(zhǎng)度

只能取下一個(gè)值,不能回到開始,更像是’一次性‘的,迭代器產(chǎn)生后的唯一目標(biāo)就是重復(fù)執(zhí)行next方法直到值取盡,否則就會(huì)停留在某個(gè)位置,等待下一次調(diào)用next;

若是要再次迭代同個(gè)對(duì)象,你只能重新調(diào)用iter方法去創(chuàng)建一個(gè)新的迭代器對(duì)象,如果有兩個(gè)或者多個(gè)循環(huán)使用同一個(gè)迭代器,必然只會(huì)有一個(gè)循環(huán)能取到值。

【五】什么是生成器

通過(guò)生成器,可以逐個(gè)生成序列中的元素,而無(wú)需一次性生成整個(gè)序列

生成器在處理大數(shù)據(jù)集時(shí),具有節(jié)省內(nèi)存、提高效率的特點(diǎn)。

# 假設(shè)一個(gè)數(shù)據(jù)庫(kù)里 表里面存了1億條數(shù)據(jù)
# 讀數(shù)據(jù)時(shí)---> 使用 read() 內(nèi)存會(huì)直接爆滿導(dǎo)致電腦卡死
# 使用生成器--->一次取100行進(jìn)行處理 ---->再取100行進(jìn)行處理,以此類推

【六】生成器的創(chuàng)建方式

【1】列表推導(dǎo)式

使用列表推導(dǎo)式時(shí),可以將列表推導(dǎo)式的方括號(hào)改為圓括號(hào),即可創(chuàng)建一個(gè)生成器。

# 列表生成式生成列表
start_list = [x * 2 for x in range(5)]

print(start_list)
# [0, 2, 4, 6, 8]

# 將列表改成元祖,看起來(lái)像元祖推導(dǎo)式,其實(shí)是一個(gè)生成器對(duì)象
G = (x * 2 for x in range(5))

print(G)
#  at 0x000001873491CC80>

# 生成器對(duì)象可以強(qiáng)轉(zhuǎn)成列表
print(list(G))
# [0, 2, 4, 6, 8]

【2】yield關(guān)鍵字

使用yield關(guān)鍵字定義一個(gè)生成器函數(shù)時(shí),生成器函數(shù)中的yield語(yǔ)句會(huì)暫停函數(shù)執(zhí)行并返回一個(gè)值,下一次調(diào)用該函數(shù)時(shí)會(huì)繼續(xù)執(zhí)行并返回下一個(gè)值。

def my_generator():
    yield 1
    yield 2
    yield 3

g = my_generator()
print(next(g))  # 輸出:1
print(next(g))  # 輸出:2
print(next(g))  # 輸出:3

【七】生成器案例

def eater():
    print('開始吃飯 ovo ')
    while True:
        food = yield
        print(f'得到的食物是 :>>>> {food}, 開始吃飯嘍 :>>>> {food}')

【1】調(diào)用函數(shù)

res = eater()
print(res)  # 
print(res.__next__())
# 打印開始吃飯
# None   原因就是在生成器內(nèi)部的 yield 中沒有返回值
print(res.__next__())
# 打印 得到的食物是 :>>>> None, 開始吃飯嘍 :>>>> None
# None  原因就是在生成器內(nèi)部的走完了上面的 又回到了 yield 中結(jié)果 yield 沒有返回值

【2】向生成器中傳值

res = eater()
print(res)  # 
print(res.__next__())
res.send("魚香肉絲") #得到的食物是 :>>>> 魚香肉絲, 開始吃飯嘍 :>>>> 魚香肉絲 # 想yield 傳值并且讓生成器向下走一下
print(res.__next__()) #得到的食物是 :>>>> None, 開始吃飯嘍 :>>>> None
print(res.send("宮保雞丁")) #得到的食物是 :>>>> 宮保雞丁, 開始吃飯嘍 :>>>> 宮保雞丁
#None

【八】裝飾器 + 生成器

def init_iter(func):
    # func 我的生成器函數(shù)
    def inner(*args, **kwargs):
        # g 得到的生成器對(duì)象
        g = func(*args, **kwargs)
        # 調(diào)用自己生成器向下走
        next(g)
        # 走回來(lái)的返回值返回出去
        return g

    return inner

@init_iter
def eater():
    print('開始吃飯 ovo ')
    while True:
        food = yield
        print(f'得到的食物是 :>>>> {food}, 開始吃飯嘍 :>>>> {food}')

res = eater()
res.send("魚香肉絲")
res.send("宮保雞丁")

【九】生成器內(nèi)部修改可變數(shù)據(jù)類型

def init_iter(func):
    # func 我的生成器函數(shù)
    def inner(*args, **kwargs):
        # g 得到的生成器對(duì)象
        g = func(*args, **kwargs)
        # 調(diào)用自己生成器向下走
        next(g)
        # 走回來(lái)的返回值返回出去
        return g

    return inner


@init_iter
def eater():
    print('開始吃飯 ovo ')
    food_list = []
    while True:
        food = yield
        food_list.append(food)
        print(f'得到的食物是 :>>>> {food}, 開始吃飯嘍 :>>>> {food}')
        print(f'當(dāng)前后廚已經(jīng)做好了 :>>>> {food_list}')


res = eater()
res.send("魚香肉絲")
res.send("宮保雞丁")
# 輸出結(jié)果:
開始吃飯 ovo 
得到的食物是 :>>>> 魚香肉絲, 開始吃飯嘍 :>>>> 魚香肉絲
當(dāng)前后廚已經(jīng)做好了 :>>>> ['魚香肉絲']
得到的食物是 :>>>> 宮保雞丁, 開始吃飯嘍 :>>>> 宮保雞丁
當(dāng)前后廚已經(jīng)做好了 :>>>> ['魚香肉絲', '宮保雞丁']

【十】yield + next搭配著使用

def my_range(start, stop, step):
    '''

    :param start: 0
    :param stop: 5
    :param step: 1
    
    '''
    print("start")
    while start < stop:
        yield start
        start += step
    print("end")


res = my_range(0, 5, 1)
print(res)  # 
print(res.__next__()) # 0
print(res.__next__()) # 1
print(res.__next__()) # 2 
print(res.__next__()) # 3
print(res.__next__()) # 4
# 這里會(huì)報(bào)錯(cuò) ---》 把我掏空了 --- 沒有可迭代的值可以被獲取了
print(res.__next__())  # StopIteration
def init_iter(func):
    def inner(*args, **kwargs):
        try:
            generator = func(*args, **kwargs)
            next(generator)
            return generator
        except StopIteration:
            pass

    return inner

def range_(start, stop, step):
    while start < stop:
        yield start
        start += step

# for 循環(huán)內(nèi)部做了異常捕獲
for i in range_(0,5,1):
    print(i)

def my_range(start, stop, step):
    def range_(start, stop, step):
        while start < stop:
            yield start
            start += step

    res = range_(start, stop, step)
    while True:
        try:
            print(res.__next__())
        except StopIteration:
            break

res = my_range(start=1, stop=5, step=1)
res

#輸出結(jié)果
0
1
2
3
4
1
2
3
4

鏈接:https://www.cnblogs.com/chosen-yn/p/18143555

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    585

    瀏覽量

    20583
  • Next
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    6000
  • 迭代器
    +關(guān)注

    關(guān)注

    0

    文章

    44

    瀏覽量

    4336

原文標(biāo)題:【十】yield + next搭配著使用

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    小安派BW21-CBV-Kit入門教程:中斷控制LED

    作為一款本地AI圖象識(shí)別開發(fā)板,BW21-CBV-Kit它能夠獨(dú)自運(yùn)行目標(biāo)識(shí)別模型。2.4GHz+5GHz的雙頻Wi-Fi,提供高性能的無(wú)線傳輸能力,讓圖象傳輸更加流暢。豐富的接口,搭配著AI識(shí)別
    的頭像 發(fā)表于 01-21 11:32 ?170次閱讀
    小安派BW21-CBV-Kit入門教程:中斷控制LED

    BW21-CBV-Kit快速入門之Arduino環(huán)境搭建

    作為一款本地AI圖象識(shí)別開發(fā)板,BW21-CBV-Kit它能夠獨(dú)自運(yùn)行目標(biāo)識(shí)別模型。2.4GHz+5GHz的雙頻Wi-Fi,提供高性能的無(wú)線傳輸能力,讓圖象傳輸更加流暢。豐富的接口,搭配著AI識(shí)別,可以擴(kuò)展出無(wú)限可能。
    的頭像 發(fā)表于 01-15 17:07 ?101次閱讀
    BW21-CBV-Kit快速入門之Arduino環(huán)境搭建

    華為鴻蒙NEXT系統(tǒng)的優(yōu)勢(shì)與劣勢(shì)

    隨著華為鴻蒙NEXT系統(tǒng)的推出,關(guān)于其性能與體驗(yàn)的討論在網(wǎng)絡(luò)上引起了廣泛關(guān)注。本文綜合了多個(gè)角度的用戶評(píng)價(jià),從優(yōu)勢(shì)與劣勢(shì)兩方面,帶您了解這一備受矚目的操作系統(tǒng)。
    的頭像 發(fā)表于 12-30 10:30 ?1016次閱讀

    HarmonyOS Next MQTT演示

    HarmonyOS Next MQTT演示
    發(fā)表于 11-07 16:54

    OBOO鷗柏丨VS6.0多媒體信息發(fā)布系統(tǒng)讓廣告宣傳屏智能化

    隨著數(shù)字科技的越來(lái)越發(fā)達(dá),OBOO鷗柏VS6.0多媒體信息發(fā)布系統(tǒng)云平臺(tái)為城市數(shù)字化、智能化做出巨大貢獻(xiàn)。搭配著液晶廣告商顯屏一體機(jī)所帶來(lái)的超高清顯示讓群眾隨時(shí)隨地可以看到醫(yī)院、高鐵站、機(jī)場(chǎng)、地鐵站
    的頭像 發(fā)表于 11-06 22:17 ?223次閱讀
    OBOO鷗柏丨VS6.0多媒體信息發(fā)布系統(tǒng)讓廣告宣傳屏智能化

    華為大氣??!HarmonyOS NEXT公測(cè)發(fā)福利~這個(gè)可以有

    HarmonyOS NEXT火熱公測(cè)中,首批100萬(wàn)名公測(cè)用戶速來(lái)領(lǐng)取多重權(quán)益!這波福利不錯(cuò)
    的頭像 發(fā)表于 11-06 10:26 ?402次閱讀
    華為大氣??!HarmonyOS <b class='flag-5'>NEXT</b>公測(cè)發(fā)福利~這個(gè)可以有

    華為HarmonyOS NEXT 10月8日開啟公測(cè)

    華為宣布,萬(wàn)眾矚目的HarmonyOS NEXT操作系統(tǒng)將于10月8日正式開啟公測(cè),標(biāo)志著這一創(chuàng)新力作即將與廣大用戶見面。HarmonyOS NEXT作為華為自研操作系統(tǒng)的最新成果,不僅全面升級(jí)了系統(tǒng)內(nèi)核,實(shí)現(xiàn)了跨設(shè)備無(wú)縫協(xié)同,更在性能優(yōu)化、流暢度提升上取得了顯著突破。
    的頭像 發(fā)表于 09-24 15:41 ?874次閱讀
    華為HarmonyOS <b class='flag-5'>NEXT</b> 10月8日開啟公測(cè)

    OpenAI今年啟動(dòng)GPT Next計(jì)劃

    在近期舉行的KDDI峰會(huì)上,OpenAI Japan揭開了公司未來(lái)發(fā)展藍(lán)圖的一角,正式宣布將于2024年全面啟動(dòng)備受矚目的GPT Next計(jì)劃。這一計(jì)劃的推出,標(biāo)志著OpenAI在推動(dòng)人工智能領(lǐng)域持續(xù)創(chuàng)新與突破的決心與實(shí)力。
    的頭像 發(fā)表于 09-04 16:11 ?415次閱讀

    OpenAI宣布啟動(dòng)GPT Next計(jì)劃

     9月4日最新資訊,OpenAI Japan 在KDDI峰會(huì)上亮相,揭開了其即將問(wèn)世的下一代AI模型的神秘面紗,并正式宣布了旨在2024年啟動(dòng)的GPT Next宏偉計(jì)劃。
    的頭像 發(fā)表于 09-04 14:51 ?659次閱讀

    華為HarmonyOS NEXT鴻蒙星河版正式開啟Beta計(jì)劃

    在剛剛落幕的華為開發(fā)者大會(huì)(HDC 2024)盛會(huì)上,華為震撼宣布HarmonyOS NEXT鴻蒙星河版正式邁入Beta測(cè)試階段,并預(yù)告其商用版本將于今年第四季度璀璨登場(chǎng),預(yù)示著今年10月,搭載全新鴻蒙星河系統(tǒng)的華為手機(jī)即將與消費(fèi)者見面。
    的頭像 發(fā)表于 07-15 15:59 ?978次閱讀

    鴻蒙NEXT首次將AI能力融入系統(tǒng)

    在科技日新月異的今天,鴻蒙NEXT再次引領(lǐng)了行業(yè)的新潮流,首次將強(qiáng)大的AI能力深度融入系統(tǒng)之中。這一創(chuàng)新性的舉措不僅為用戶帶來(lái)了前所未有的智能體驗(yàn),更為整個(gè)行業(yè)樹立了新的標(biāo)桿。
    的頭像 發(fā)表于 06-24 10:37 ?875次閱讀

    HDC 2024上,HarmonyOS NEXT有哪些精彩亮點(diǎn)值得期待?

    6月21日至6月23日,備受矚目的HDC2024華為開發(fā)者大會(huì)將在松山湖盛大舉辦。近日,官方對(duì)外發(fā)出了亮點(diǎn)日程海報(bào),圍繞HarmonyOS?NEXT,大會(huì)都將帶來(lái)哪些精彩內(nèi)容呢?讓我們一探
    的頭像 發(fā)表于 06-19 17:02 ?585次閱讀
    HDC 2024上,HarmonyOS <b class='flag-5'>NEXT</b>有哪些精彩亮點(diǎn)值得期待?

    Flutter首次亮相Google Cloud Next大會(huì)

    Flutter 團(tuán)隊(duì)在近期首次參加了 Google Cloud Next 大會(huì),這意味著 Flutter 在開發(fā)社區(qū)中的影響力正在日益增長(zhǎng)。
    的頭像 發(fā)表于 05-09 10:15 ?518次閱讀

    HarmonyOS NEXT上手體驗(yàn):無(wú)法使用原生安卓應(yīng)用

    該博主強(qiáng)調(diào),HarmonyOS NEXT 對(duì)原生的安卓應(yīng)用不再兼容,原因是本地?cái)?shù)據(jù)過(guò)多可能導(dǎo)致用戶體驗(yàn)不佳?!袄缥⑿帕奶煊涗?、筆記軟件等需要盡快找到解決方案,以確保用戶盡可能少地受到影響?!?/div>
    的頭像 發(fā)表于 04-15 14:22 ?2091次閱讀

    手持終端PDA_智能手持機(jī)安卓主板定制方案

    的內(nèi)存保證了流暢的運(yùn)行體驗(yàn)。5.2英寸屏幕1920*1080高分辨率的全觸摸設(shè)計(jì)使操作更加簡(jiǎn)單便捷。而后置13M變焦攝像頭和前置5M攝像頭搭配著LED閃光燈,使圖像采集更加清晰快速。
    的頭像 發(fā)表于 02-28 19:40 ?490次閱讀
    手持終端PDA_智能手持機(jī)安卓主板定制方案