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

日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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)維 ? 來源:馬哥Linux運(yùn)維 ? 2025-01-14 11:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【一】迭代器

【1】介紹

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

其目的通常是為了逼近所需的目標(biāo)或結(jié)果,每一次對(duì)過程的重復(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ì)象

從語法上講,內(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è)“值”,無論序列類型還是非序列類型都可以按照迭代器的方式取值

【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】優(yōu)點(diǎn)

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

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

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

【2】缺點(diǎn)

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

只能取下一個(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)能取到值。

【五】什么是生成器

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

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

# 假設(shè)一個(gè)數(shù)據(jù)庫里 表里面存了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]

# 將列表改成元祖,看起來像元祖推導(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語句會(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)
        # 走回來的返回值返回出去
        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)
        # 走回來的返回值返回出去
        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)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    596

    瀏覽量

    23224
  • Next
    +關(guān)注

    關(guān)注

    0

    文章

    8

    瀏覽量

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

    關(guān)注

    0

    文章

    45

    瀏覽量

    4639

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Google Cloud Next 2026大會(huì)亮點(diǎn)回顧

    本周,我們在 Next 26 大會(huì)上宣布了一系列創(chuàng)新技術(shù),包括全新統(tǒng)一的 AI 技術(shù)棧、第八代 TPU (Tensor Processing Unit),以及在數(shù)據(jù)、安全和生產(chǎn)力領(lǐng)域引入全方位的智能
    的頭像 發(fā)表于 04-29 16:35 ?748次閱讀

    華為發(fā)布Next Generation FAN解決方案

    ?;顒?dòng)期間,華為發(fā)布Next Generation FAN(Fixed Access Network)解決方案,以AI+全光雙引擎為全球互聯(lián)網(wǎng)服務(wù)提供商(ISP)打造智能時(shí)代核心網(wǎng)絡(luò)能力,拓展商業(yè)增長
    的頭像 發(fā)表于 03-06 17:41 ?415次閱讀
    華為發(fā)布<b class='flag-5'>Next</b> Generation FAN解決方案

    小安派BW21-CBV-Kit入門教程之BLE傳輸DHT數(shù)據(jù)

    作為一款本地AI圖像識(shí)別開發(fā)板,BW21-CBV-Kit它能夠獨(dú)自運(yùn)行目標(biāo)識(shí)別模型。2.4GHz+5GHz的雙頻Wi-Fi,提供高性能的無線傳輸能力,讓圖像傳輸更加流暢。豐富的接口,搭配著AI識(shí)別,可以擴(kuò)展出無限可能。
    的頭像 發(fā)表于 01-22 09:55 ?667次閱讀
    小安派BW21-CBV-Kit入門教程之BLE傳輸DHT數(shù)據(jù)

    Next Pathway成為Snowflake最高級(jí)別合作伙伴

    領(lǐng)先的自動(dòng)化云遷移與現(xiàn)代數(shù)據(jù)轉(zhuǎn)型解決方案提供商Next Pathway Inc.宣布,其已獲得 Snowflake最高級(jí)別合作伙伴稱號(hào):AI數(shù)據(jù)云服務(wù)精英級(jí)(AI Data Cloud
    的頭像 發(fā)表于 12-04 18:08 ?1178次閱讀
    <b class='flag-5'>Next</b> Pathway成為Snowflake最高級(jí)別合作伙伴

    瑞芯微(EASY EAI)RV1126B 4G通訊

    1.4G模塊使用簡介4G模塊需要搭配著SIM卡(【普通SIM卡】或【物聯(lián)網(wǎng)卡】)使用,因此需要通過AT指令進(jìn)行撥號(hào)上網(wǎng)。而且在Linux系統(tǒng)中,它作為一個(gè)網(wǎng)卡設(shè)備被使用,因此也需要對(duì)其進(jìn)行網(wǎng)絡(luò)
    的頭像 發(fā)表于 12-04 09:00 ?1357次閱讀
    瑞芯微(EASY EAI)RV1126B 4G通訊

    小安派BW21-CBV-Kit入門教程之驅(qū)動(dòng)ILI9341 TFT顯示屏

    作為一款本地AI圖象識(shí)別開發(fā)板,BW21-CBV-Kit它能夠獨(dú)自運(yùn)行目標(biāo)識(shí)別模型。2.4GHz+5GHz的雙頻Wi-Fi,提供高性能的無線傳輸能力,讓圖象傳輸更加流暢。豐富的接口,搭配著AI識(shí)別,可以擴(kuò)展出無限可能。
    的頭像 發(fā)表于 11-13 17:19 ?1265次閱讀
    小安派BW21-CBV-Kit入門教程之驅(qū)動(dòng)ILI9341 TFT顯示屏

    第三屆大會(huì)回顧第6期 | HarmonyOS NEXT原生智能,助力應(yīng)用低成本生而智能

    原生智能是HarmonyOS NEXT的核心能力之一,通過將人工智能(AI)技術(shù)與操作系統(tǒng)深度融合,實(shí)現(xiàn)了從底層到應(yīng)用層的全面智能化。HarmonyOS NEXT的原生智能是如何實(shí)現(xiàn)的?對(duì)開
    的頭像 發(fā)表于 07-14 18:04 ?1344次閱讀
    第三屆大會(huì)回顧第6期 | HarmonyOS <b class='flag-5'>NEXT</b>原生智能,助力應(yīng)用低成本生而智能

    小安派BW21-CBV-Kit入門教程之MPU6050 IMU零點(diǎn)檢測

    作為一款本地AI圖象識(shí)別開發(fā)板,BW21-CBV-Kit它能夠獨(dú)自運(yùn)行目標(biāo)識(shí)別模型。2.4GHz+5GHz的雙頻Wi-Fi,提供高性能的無線傳輸能力,讓圖象傳輸更加流暢。豐富的接口,搭配著AI識(shí)別,可以擴(kuò)展出無限可能。
    的頭像 發(fā)表于 07-04 17:33 ?1631次閱讀
    小安派BW21-CBV-Kit入門教程之MPU6050 IMU零點(diǎn)檢測

    NEXT(Near-End Crosstalk,近端串?dāng)_)

    一、什么是NEXT(近端串?dāng)_)? NEXT(Near-End Crosstalk,近端串?dāng)_)是指在線纜傳輸信號(hào)時(shí),靠近發(fā)射端處,相鄰線對(duì)之間因電磁干擾所產(chǎn)生的串?dāng)_信號(hào)。這種干擾通常發(fā)生在配線架、模塊
    的頭像 發(fā)表于 06-23 17:35 ?2202次閱讀

    請(qǐng)問P-NUCLEO-53L8A1搭配的主控是哪個(gè)板子?

    P-NUCLEO-53L8A1搭配的主控是哪個(gè)板子?看著用的還是miniUSB接口呢
    發(fā)表于 06-23 06:48

    CY4500可以搭配無線充的發(fā)射板子去進(jìn)行協(xié)議分析嗎?

    請(qǐng)問Cy4500可以做到搭配其他支持PD3.0協(xié)議的功率傳輸板子么?
    發(fā)表于 06-03 12:16

    小安派BW21-CBV-Kit入門教程之主機(jī)模式對(duì)Arduino UNO發(fā)送數(shù)據(jù)

    作為一款本地AI圖象識(shí)別開發(fā)板,BW21-CBV-Kit它能夠獨(dú)自運(yùn)行目標(biāo)識(shí)別模型。2.4GHz+5GHz的雙頻Wi-Fi,提供高性能的無線傳輸能力,讓圖象傳輸更加流暢。豐富的接口,搭配著AI識(shí)別,可以擴(kuò)展出無限可能。
    的頭像 發(fā)表于 05-29 10:33 ?1055次閱讀
    小安派BW21-CBV-Kit入門教程之主機(jī)模式對(duì)Arduino UNO發(fā)送數(shù)據(jù)

    小安派BW21-CBV-Kit入門教程之主機(jī)模式讀取Arduino UNO從機(jī)

    作為一款本地AI圖象識(shí)別開發(fā)板,BW21-CBV-Kit它能夠獨(dú)自運(yùn)行目標(biāo)識(shí)別模型。2.4GHz+5GHz的雙頻Wi-Fi,提供高性能的無線傳輸能力,讓圖象傳輸更加流暢。豐富的接口,搭配著AI識(shí)別,可以擴(kuò)展出無限可能。
    的頭像 發(fā)表于 05-21 15:38 ?1339次閱讀
    小安派BW21-CBV-Kit入門教程之主機(jī)模式讀取Arduino UNO從機(jī)

    第三屆大會(huì)回顧第2期 | HarmonyOS NEXT內(nèi)核驅(qū)動(dòng)生態(tài)兼容與競爭力思考

    隨著HarmonyOS NEXT生態(tài)和技術(shù)的發(fā)展,驅(qū)動(dòng)框架作為北向和南向的生態(tài)中樞,有很多的機(jī)會(huì)。例如,提供更多的信息到應(yīng)用層,實(shí)現(xiàn)精準(zhǔn)的性能功耗控制;打破傳統(tǒng)的分層解耦,簡化關(guān)鍵協(xié)議、關(guān)鍵路徑等等。
    的頭像 發(fā)表于 05-19 19:17 ?2011次閱讀
    第三屆大會(huì)回顧第2期 | HarmonyOS <b class='flag-5'>NEXT</b>內(nèi)核驅(qū)動(dòng)生態(tài)兼容與競爭力思考

    小安派BW21-CBV-Kit入門教程之OLED顯示

    作為一款本地AI圖象識(shí)別開發(fā)板,BW21-CBV-Kit它能夠獨(dú)自運(yùn)行目標(biāo)識(shí)別模型。2.4GHz+5GHz的雙頻Wi-Fi,提供高性能的無線傳輸能力,讓圖象傳輸更加流暢。豐富的接口,搭配著AI識(shí)別,可以擴(kuò)展出無限可能。
    的頭像 發(fā)表于 05-17 10:54 ?1672次閱讀
    小安派BW21-CBV-Kit入門教程之OLED顯示
    孟村| 革吉县| 开阳县| 阿拉善左旗| 井陉县| 靖远县| 青河县| 冀州市| 泰和县| 广平县| 二连浩特市| 桐庐县| 论坛| 珲春市| 江城| 沙湾县| 大邑县| 南投县| 新兴县| 中超| 全南县| 中宁县| 常山县| 奉化市| 蒙山县| 高安市| 富顺县| 东海县| 定陶县| 杭锦旗| 图木舒克市| 惠州市| 岱山县| 罗城| 双辽市| 新河县| 龙口市| 商城县| 长汀县| 大方县| 新龙县|