亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python的迭代器,生成器和裝飾器你了解嗎

 更新時(shí)間:2022年02月10日 08:51:45   作者:野貓炫  
這篇文章主要為大家詳細(xì)介紹了python的迭代器,生成器和裝飾器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

python 迭代器與生成器,裝飾器

迭代器對(duì)象從集合的第一個(gè)元素開始訪問,直到所有的元素被訪問完結(jié)束。

迭代器有兩個(gè)基本的方法:iter() 和 next()。

字符串,列表或元組對(duì)象都可用于創(chuàng)建迭代器:

list1=[1,2,3]
s=iter(list1) # 創(chuàng)建迭代器對(duì)象
print(next(s)) # 輸出迭代器的下一個(gè)元素
print(next(s))
print(next(s))

在這里插入圖片描述

直到計(jì)算出最后一個(gè)元素,沒有更多的元素時(shí),拋出StopIteration的錯(cuò)誤

在這里插入圖片描述

迭代器對(duì)象可以使用常規(guī)for語句進(jìn)行遍歷:

list2=[1,2,3,4,5]
s2 = iter(list2)    # 創(chuàng)建迭代器對(duì)象
for h in s2:
    print (h, end="-")

在這里插入圖片描述

生成器

帶有 yield 的函數(shù)在 Python 中被稱之為 generator(生成器)(自己制作迭代器可以看做是生成器)

#注意括號(hào)
#列表生成式
lis = [x+x for x in range(5)]
print(lis)
#生成器
gen= (x+x for x in range(5))
print(gen)
# gen = (x+x for x in range(5))
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print(next(gen))
generator_ex = (x+x for x in range(5))
for i in generator_ex:
    print(i)

在這里插入圖片描述

自己產(chǎn)生一個(gè)支持小數(shù)的range生成器(即帶yield的迭代器)

你先把yield看做“return”,這個(gè)是直觀的,它首先是個(gè)return,普通的return是什么意思,就是在程序中返回某個(gè)值,返回之后程序就不再往下運(yùn)行了。看做return之后再把它看做一個(gè)是生成器(generator)的一部分(帶yield的函數(shù)才是真正的迭代器),

def frange(star,stop,step):
    x=star
    while x<stop:
        yield x
        x+=step
for i in frange(10,20,0.5):
    print(i)

在這里插入圖片描述

下圖最直觀得可以看出yield的作用

把yield想想成return,return了一個(gè)4之后,程序停止,并沒有執(zhí)行賦值給res操作。
一個(gè)帶有 yield 的函數(shù)就是一個(gè) generator,生成一個(gè) generator 看起來像函數(shù)調(diào)用,但不會(huì)執(zhí)行任何函數(shù)代碼,直到對(duì)其調(diào)用 next()(在 for 循環(huán)中會(huì)自動(dòng)調(diào)用 next())才開始執(zhí)行。雖然執(zhí)行流程仍按函數(shù)的流程執(zhí)行,但每執(zhí)行到一個(gè) yield 語句就會(huì)中斷,并返回一個(gè)迭代值,下次執(zhí)行時(shí)從 yield 的下一個(gè)語句繼續(xù)執(zhí)行??雌饋砭秃孟褚粋€(gè)函數(shù)在正常執(zhí)行的過程中被 yield 中斷了數(shù)次,每次中斷都會(huì)通過 yield 返回當(dāng)前的迭代值。

def foo():
    print("starting...")
    while True:
        print("yield前")
        res = yield 4
        print("yield后")
        print("res:", res)
g = foo()
print(next(g))
print("*" * 20)
print(next(g))

在這里插入圖片描述

在我們調(diào)用這個(gè)函數(shù)的時(shí)候,第一件事并不是執(zhí)行這個(gè)函數(shù),而是將這個(gè)函數(shù)做為參數(shù)傳入它頭頂上這頂帽子,這頂帽子我們稱之為裝飾函數(shù) 或 裝飾器。
裝飾器的使用方法很固定:
先定義一個(gè)裝飾函數(shù)(帽子)(也可以用類、偏函數(shù)實(shí)現(xiàn))
再定義你的業(yè)務(wù)函數(shù)、或者類(人)
最后把這頂帽子帶在這個(gè)人頭上
裝飾器的簡(jiǎn)單的用法有很多,這里舉兩個(gè)常見的。
日志打印器
時(shí)間計(jì)時(shí)器

# 這是裝飾函數(shù)
def logger(func):
    def wrapper(*args, **kw):
        print('我準(zhǔn)備開始計(jì)算:{} 函數(shù)了:'.format(func.__name__))
        # 真正執(zhí)行的是這行。
        func(*args, **kw)
        print('啊哈,我計(jì)算完啦。給自己加個(gè)雞腿??!')
    return wrapper
@logger
def add(x, y):
    print('{} + {} = {}'.format(x, y, x+y))
add(200, 50)

在這里插入圖片描述

# 這是裝飾函數(shù)
def timer(func):
    def wrapper(*args, **kw):
        t1=time.time()
        # 這是函數(shù)真正執(zhí)行的地方
        func(*args, **kw)
        t2=time.time()
        # 計(jì)算下時(shí)長
        cost_time = t2-t1
        print("花費(fèi)時(shí)間:{}秒".format(cost_time))
    return wrapper
import time
@timer
def want_sleep(sleep_time):
    time.sleep(sleep_time)
want_sleep(10)

在這里插入圖片描述

def american():
    print("我來自中國。")
def chinese():
    print("I am from America.")
def say_hello(contry):
    def wrapper(func):
        def deco(*args, **kwargs):
            if contry == "china":
                print("你好!")
            elif contry == "america":
                print('hello.')
            else:
                return
            # 真正執(zhí)行函數(shù)的地方
            func(*args, **kwargs)
        return deco
    return wrapper
@say_hello("china")
def american():
    print("我來自中國。")
@say_hello("america")
def chinese():
    print("I am from America.")

在這里插入圖片描述

總結(jié)

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

相關(guān)文章

  • pycharm中報(bào)ModuleNotFoundError:No?module?named?'tensorflow'錯(cuò)誤解決

    pycharm中報(bào)ModuleNotFoundError:No?module?named?'tensor

    這篇文章主要給大家介紹了關(guān)于pycharm中報(bào)ModuleNotFoundError:No?module?named?'tensorflow'錯(cuò)誤的解決方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Python字典高級(jí)用法深入分析講解

    Python字典高級(jí)用法深入分析講解

    字典作為Python的一個(gè)內(nèi)置數(shù)據(jù)結(jié)構(gòu),和列表一樣都是可變序列的,但是它是無序的,以鍵值對(duì)的方式存儲(chǔ)數(shù)據(jù)。本文將詳解一下Python中字典的高級(jí)使用,需要的可以參考一下
    2022-10-10
  • 基于python實(shí)現(xiàn)ROC曲線繪制廣場(chǎng)解析

    基于python實(shí)現(xiàn)ROC曲線繪制廣場(chǎng)解析

    這篇文章主要介紹了基于python實(shí)現(xiàn)ROC曲線繪制廣場(chǎng)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 基于python分享極坐標(biāo)下的幾類典型曲線

    基于python分享極坐標(biāo)下的幾類典型曲線

    這篇文章主要介紹了基于python分享極坐標(biāo)下的幾類典型曲線,極坐標(biāo)系統(tǒng)是一套區(qū)別于笛卡爾直角坐標(biāo)系的二維坐標(biāo)系統(tǒng),下面我們?cè)趐ython的基礎(chǔ)上講解及坐標(biāo)及其下的幾種曲線,需要的小伙伴可以參考一下
    2022-03-03
  • 利用Python實(shí)現(xiàn)問卷星自動(dòng)填寫的超詳細(xì)教程

    利用Python實(shí)現(xiàn)問卷星自動(dòng)填寫的超詳細(xì)教程

    問卷星已經(jīng)成為收集問卷的一個(gè)很重要的工具,有時(shí)可以用來報(bào)名參加活動(dòng),有時(shí)可以用來收集某些領(lǐng)域相關(guān)的情況,下面這篇文章主要給大家介紹了關(guān)于利用Python實(shí)現(xiàn)問卷星自動(dòng)填寫的超詳細(xì)教程,需要的朋友可以參考下
    2023-06-06
  • 淺析python函數(shù)式編程

    淺析python函數(shù)式編程

    這篇文章主要介紹了python函數(shù)式編程的相關(guān)資料,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • Python的Flask框架標(biāo)配模板引擎Jinja2的使用教程

    Python的Flask框架標(biāo)配模板引擎Jinja2的使用教程

    Jinja2是Python世界的一款高人氣template engine,是許多開源Web框架的選擇,包括Flask這樣的明星級(jí)項(xiàng)目,這里我們就來共同學(xué)習(xí)Python的Flask框架標(biāo)配模板引擎Jinja2的使用教程
    2016-07-07
  • python基礎(chǔ)之入門必看操作

    python基礎(chǔ)之入門必看操作

    下面小編就為大家?guī)硪黄猵ython基礎(chǔ)之入門必看操作。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • 獲取django框架orm query執(zhí)行的sql語句實(shí)現(xiàn)方法分析

    獲取django框架orm query執(zhí)行的sql語句實(shí)現(xiàn)方法分析

    這篇文章主要介紹了獲取django框架orm query執(zhí)行的sql語句實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Django框架中orm query執(zhí)行的sql語句獲取方法相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-06-06
  • Python實(shí)現(xiàn)自動(dòng)化域名批量解析分享

    Python實(shí)現(xiàn)自動(dòng)化域名批量解析分享

    這篇文章主要介紹了Python實(shí)現(xiàn)自動(dòng)化域名批量解析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08

最新評(píng)論