>: ').strip() print(msg)# 獲取到返回值num_list = [0, 1, 2, 3, 4, 5]count = 0while count ? ? 【二】可迭代對象 【1】什么是可迭代對象 從語法上講,內(nèi)置有 __ iter __ 方法的對象都是可迭代對象 【2】" />

色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

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

yield + next搭配著使用

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2025-01-14 11:21 ? 次閱讀

【一】迭代器

【1】介紹

迭代器即用來迭代取值的工具,而迭代是重復反饋的過程的活動

其目的通常是為了逼近所需的目標或結(jié)果,每一次對過程的重復稱為一次”迭代“

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

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

【二】可迭代對象

【1】什么是可迭代對象

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

【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】浮點類型 --- 不是
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é)

非可迭代對象

整數(shù)類型

浮點類型

布爾類型

可迭代類型

字符串類型

列表類型

字典類型

元組類型

集合類型

【三】迭代器對象

【1】什么是迭代器對象

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

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

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

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

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

【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__() 的對象就是迭代器對象
# 在八大基本數(shù)據(jù)類型中
# 除了 整數(shù)、浮點數(shù)、布爾
# 其他的都是迭代器對象

# 迭代器對象一定是可迭代對象

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

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

【1】優(yōu)點

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

不使用索引進行取值

取到值的時候會保存到當前的狀態(tài),下一次從這個位置開始向下取值

【2】缺點

除非取盡,否則無法獲取迭代器的長度

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

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

【五】什么是生成器

通過生成器,可以逐個生成序列中的元素,而無需一次性生成整個序列

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

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

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

【1】列表推導式

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

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

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

# 將列表改成元祖,看起來像元祖推導式,其實是一個生成器對象
G = (x * 2 for x in range(5))

print(G)
#  at 0x000001873491CC80>

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

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

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

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 得到的生成器對象
        g = func(*args, **kwargs)
        # 調(diào)用自己生成器向下走
        next(g)
        # 走回來的返回值返回出去
        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 得到的生成器對象
        g = func(*args, **kwargs)
        # 調(diào)用自己生成器向下走
        next(g)
        # 走回來的返回值返回出去
        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'當前后廚已經(jīng)做好了 :>>>> {food_list}')


res = eater()
res.send("魚香肉絲")
res.send("宮保雞丁")
# 輸出結(jié)果:
開始吃飯 ovo 
得到的食物是 :>>>> 魚香肉絲, 開始吃飯嘍 :>>>> 魚香肉絲
當前后廚已經(jī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
# 這里會報錯 ---》 把我掏空了 --- 沒有可迭代的值可以被獲取了
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)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    585

    瀏覽量

    20593
  • Next
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

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

    關(guān)注

    0

    文章

    44

    瀏覽量

    4340

原文標題:【十】yield + next搭配著使用

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

收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

    HarmonyOS Next MQTT演示

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

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

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

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

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

    華為HarmonyOS NEXT 10月8日開啟公測

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

    OpenAI今年啟動GPT Next計劃

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

    OpenAI宣布啟動GPT Next計劃

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

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

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

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

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

    HDC 2024上,HarmonyOS NEXT有哪些精彩亮點值得期待?

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

    Flutter首次亮相Google Cloud Next大會

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

    HarmonyOS NEXT上手體驗:無法使用原生安卓應用

    該博主強調(diào),HarmonyOS NEXT 對原生的安卓應用不再兼容,原因是本地數(shù)據(jù)過多可能導致用戶體驗不佳。“例如微信聊天記錄、筆記軟件等需要盡快找到解決方案,以確保用戶盡可能少地受到影響。”
    的頭像 發(fā)表于 04-15 14:22 ?2107次閱讀

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

    的內(nèi)存保證了流暢的運行體驗。5.2英寸屏幕1920*1080高分辨率的全觸摸設(shè)計使操作更加簡單便捷。而后置13M變焦攝像頭和前置5M攝像頭搭配著LED閃光燈,使圖像采集更加清晰快速。
    的頭像 發(fā)表于 02-28 19:40 ?496次閱讀
    手持終端PDA_智能手持機安卓主板定制方案
    主站蜘蛛池模板: 一天不停的插BB十几次 | 无人影院在线播放 | JIZZ19学生第一次 | 天美传媒果冻传媒入口视频 | 久久99AV无色码人妻蜜 | jiapanese50欧美熟妇 | 边摸边吃奶边做带声音 | 真人做受120分钟免费看 | 国色精品VA在线观看免费视频 | 国产又黄又粗又爽又色的视频软件 | 婚后被调教当众高潮H喷水 回复术士勇者免费观看全集 | 恋夜影院安卓免费列表uc | 国产无遮挡色视频免费观看性色 | tube69hdxxxx日本| 久久国语露脸精品国产 | 少妇人妻偷人精品视蜜桃 | 99热热在线精品久久 | 久久精品日本免费线 | 公交车轮C关老师 | 99RE久久精品国产 | 在线播放日韩欧美亚洲日本 | 日本吃孕妇奶水免费观看 | 亚洲爆乳少妇精品无码专区 | 诱人的秘书BD在线观看 | 乳色吐息未增删樱花ED在线观看 | 迅雷哥在线观看高清 | 国产人妻人伦精品久久无码 | 99国产在线精品观看二区 | 中文字幕不卡一区二区三区 | 色网址在线观看 | 看 视频一一级毛片 | 妞干网手机免费视频 | 乳交高H糙汉宠文 | 福利视频一二三在线观看 | 久久无码AV亚洲精品色午夜 | 欧洲-级毛片内射八十老太婆 | 国产亚洲精品a在线观看app | 欧美精品一区二区蜜臀亚洲 | 18video性欧美19sex高清 | 亚洲精品沙发午睡系列 | 囯产免费久久久久久国产免费 |