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

在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

yield + next搭配著使用

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

【一】迭代器

【1】介紹

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

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

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

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】什么是可迭代對象

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

【2】八大基本數據類型

# 【1】數字類型
# 【1.1】整數類型 --- 不是
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】總結

非可迭代對象

整數類型

浮點類型

布爾類型

可迭代類型

字符串類型

列表類型

字典類型

元組類型

集合類型

【三】迭代器對象

【1】什么是迭代器對象

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

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

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

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

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

【2】八大基本數據類型

# 【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】總結

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

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

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

【四】迭代器的優缺點

【1】優點

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

不使用索引進行取值

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

【2】缺點

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

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

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

【五】什么是生成器

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

生成器在處理大數據集時,具有節省內存、提高效率的特點。

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

【六】生成器的創建方式

【1】列表推導式

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

# 列表生成式生成列表
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>

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

【2】yield關鍵字

使用yield關鍵字定義一個生成器函數時,生成器函數中的yield語句會暫停函數執行并返回一個值,下一次調用該函數時會繼續執行并返回下一個值。

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】調用函數

res = eater()
print(res)  # 
print(res.__next__())
# 打印開始吃飯
# None   原因就是在生成器內部的 yield 中沒有返回值
print(res.__next__())
# 打印 得到的食物是 :>>>> None, 開始吃飯嘍 :>>>> None
# None  原因就是在生成器內部的走完了上面的 又回到了 yield 中結果 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 我的生成器函數
    def inner(*args, **kwargs):
        # g 得到的生成器對象
        g = func(*args, **kwargs)
        # 調用自己生成器向下走
        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("宮保雞丁")

【九】生成器內部修改可變數據類型

def init_iter(func):
    # func 我的生成器函數
    def inner(*args, **kwargs):
        # g 得到的生成器對象
        g = func(*args, **kwargs)
        # 調用自己生成器向下走
        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'當前后廚已經做好了 :>>>> {food_list}')


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

【十】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 循環內部做了異常捕獲
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

#輸出結果
0
1
2
3
4
1
2
3
4

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 字符串
    +關注

    關注

    1

    文章

    585

    瀏覽量

    20560
  • Next
    +關注

    關注

    0

    文章

    6

    瀏覽量

    5995
  • 迭代器
    +關注

    關注

    0

    文章

    44

    瀏覽量

    4329

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

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

收藏 人收藏

    評論

    相關推薦

    華為鴻蒙NEXT系統的優勢與劣勢

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

    TAS5711規格書中搭配的喇叭是8歐姆的喇叭,當搭配4歐姆的喇叭,輸出電感應該時如何選擇?

    TAS5711規格書中搭配的喇叭是8歐姆的喇叭,當搭配4歐姆的喇叭,輸出電感應該時如何選擇?2個輸出電感上的跨接電容如何選擇?是否有公式可以參考?請賜教。
    發表于 11-08 07:54

    HarmonyOS Next MQTT演示

    HarmonyOS Next MQTT演示
    發表于 11-07 16:54

    OBOO鷗柏丨VS6.0多媒體信息發布系統讓廣告宣傳屏智能化

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

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

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

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

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

    OpenAI今年啟動GPT Next計劃

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

    OpenAI宣布啟動GPT Next計劃

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

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

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

    鴻蒙NEXT首次將AI能力融入系統

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

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

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

    Flutter首次亮相Google Cloud Next大會

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

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

    該博主強調,HarmonyOS NEXT 對原生的安卓應用不再兼容,原因是本地數據過多可能導致用戶體驗不佳?!袄缥⑿帕奶煊涗?、筆記軟件等需要盡快找到解決方案,以確保用戶盡可能少地受到影響。”
    的頭像 發表于 04-15 14:22 ?2044次閱讀

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

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

    淘寶與華為合作將基于HarmonyOS NEXT啟動鴻蒙原生應用開發

    1月25日,淘寶與華為舉辦鴻蒙合作簽約儀式,宣布將基于HarmonyOS NEXT啟動鴻蒙原生應用開發。
    的頭像 發表于 01-26 16:14 ?1163次閱讀
    主站蜘蛛池模板: 国产伦精品一区二区三区女| 好吊色视频988gao在线观看| 大象焦伊人久久综合网色视| 国模一区二区三区私啪啪| 黄色毛片播放| 成人a毛片视频免费看| 最色网在线观看| 午夜毛片网站| 奇米影视777狠狠狠888不卡| 久久天天躁狠狠躁夜夜爽蜜月 | 五月综合激情视频在线观看| 天天爱天天色| 欧美国产一区二区二区| 黄 色 毛片免费| 一本到视频在线| 美女牲交毛片一级视频| 啪啪日韩| 中文字幕在线不卡| 日韩特级片| 国产亚洲高清在线精品不卡| 一本高清在线| jinv在线视频| 久久在线精品| 色www永久免费视频| 久久精品视频5| 亚洲精品午夜久久aaa级久久久| 欧美黄又粗暴一进一出抽搐| 成片免费的禁v影片| 青青热久免费精品视频在线观看 | www.欧美成| 中文字幕色综合久久| 日产乱码免费一卡二卡在线| 国产一区二区影院| 四虎884tt紧急大通知| 午夜影视啪啪免费体验区深夜| 亚洲国产视频网| 四虎影院永久地址| 黄色一级a毛片| 欧美黑粗| 免费男女| 奇米影色777四色在线首页|