成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Python_裝飾器和生成器

sugarmo / 2848人閱讀

摘要:迭代器迭代是訪問(wèn)集合元素的一種方式。迭代器是一個(gè)可以記住遍歷的位置的對(duì)象,迭代器對(duì)象從集合的第一個(gè)元素開(kāi)始訪問(wèn),直到所有的元素被訪問(wèn)完結(jié)束,迭代器只往前不會(huì)往后退。生成器特點(diǎn)保存了一套生成數(shù)值的算法。

迭代器

迭代是訪問(wèn)集合元素的一種方式。
迭代器是一個(gè)可以記住遍歷的位置的對(duì)象,迭代器對(duì)象從集合的第一個(gè)元素開(kāi)始訪問(wèn),直到所有的元素被訪問(wèn)完結(jié)束,迭代器只往前不會(huì)往后退。

可迭代對(duì)象

以直接作用域for循環(huán)的數(shù)據(jù)類(lèi)型:

集合數(shù)據(jù)類(lèi)型:list, tuple, dict, set, str

generator,包括生成器yieldgenerator function

判斷是否可以迭代

使用方法isinstance()判斷一個(gè)對(duì)象是否具有Iterable對(duì)象

from collections import Iterable

isinstance("abc", Iterable) # true
迭代器

可以被next()函數(shù)調(diào)用并不斷返回下一個(gè)值的對(duì)象稱之為迭代器: Iterator

生成器, tuple

from collections import Iterator

isinstance((x for x in range(10)), Iterator) # True
isinstance([], Iterator) # False 列表不是迭代對(duì)象

iter()函數(shù)
生成器都是Iterator對(duì)象, 但是list, dict, str雖然是Iterable,卻不是Iterator

可以把其他類(lèi)型轉(zhuǎn)成生成器, 使用iter()函數(shù)

閉包

函數(shù)是引用

閉包:

def test(number):
    def test_in(number_in):
        print(number_in)
        return number + number_in
    return test_in

test(10)(20)
裝飾器

對(duì)函數(shù)或方法起裝飾作用

寫(xiě)代碼要遵循開(kāi)放封閉原則。
它規(guī)定已經(jīng)實(shí)現(xiàn)的功能代碼不允許被修改,但可以被擴(kuò)展。

封閉: 已實(shí)現(xiàn)的功能代碼塊
開(kāi)放: 對(duì)擴(kuò)展開(kāi)發(fā)

裝飾器原理:

def a(func):
    def inner():
        func()
    return inner()
    
def f1():
    print("f1")

f1 = a(f1) # 函數(shù)名作為變量名,重新賦值使用
f1()

裝飾器語(yǔ)法糖:

def a(func):
    def inner():
        func()
    return inner()

@a
def f1():
    print("f1")

f1()         
二個(gè)裝飾器
def makeBold(fn):
    def warpped():
        print("1")
        return "" + fn() + ""
    return warpped

def makeItalic(fn):
    def warpped():
        print("2")
        return "" + fn() + ""
    return warpped

@makeBold
@makeItalic
def test1():
    print("3")
    return "hello world"

ret = test1()
print(ret)

# 輸出結(jié)果:
# 1
# 2
# 3
# hello world    
裝飾器執(zhí)行的時(shí)間
def w1(func):
    print("1")
    def inner():
        print("2")
        func()
    return inner

def w2(func):
    print("4")
    def inner():
        print("5")
        func()
    return inner

@w2
@w1
def f1():
    print(3)

# 執(zhí)行f1
f1()
# 1 2 3 # 只有w1 裝飾
# 1 4 5 2 3 # w1,w2共同裝飾

# 不執(zhí)行f1
# 1 4
裝飾器對(duì)有參數(shù)、無(wú)參數(shù)函數(shù)進(jìn)行裝飾
def func(funName):
    print("1")
    def func_in(argA, argB): # 形參
        print("2")
        funName(argA, argB) # 調(diào)用傳遞參數(shù)
    return func_in


@func
def test(a, b):    
    print("a=%d,b=%d"%(a,b))

test(10, 20)

*args來(lái)解決多參數(shù)問(wèn)題

def func(funName):
    print("1")
    def func_in(*args, **kwargs): # 形參
        print("2")
        funName(*args, **kwargs) # 調(diào)用傳遞參數(shù)
    return func_in


@func
def test(a, b):    
    print("a=%d,b=%d"%(a,b))

test(10, 20)
裝飾器對(duì)帶有返回值的函數(shù)進(jìn)行裝飾
def func(funName):
    print("1")
    def func_in():
        print("2")
        return funName() # 返回值
    return func_in


@func
def test():    
    return "test"

ret = test()
print(ret)
通用裝飾器
def func(funName):
    def func_in(*args, **kwargs):
        return funName(*args, **kwargs) # 返回值
    return func_in


@func
def test():    
    return "test"

ret = test()
print(ret)
帶有參數(shù)裝飾器
from time import ctime, sleep

def timefun_arg(pre="hello"):
    def timefun(func):
        def warppedfunc():
            print("%s called at %s %s"%(func.__name__, ctime(), pre))
            return func()
        return warppedfunc
    return timefun


@timefun_arg("it") # 執(zhí)行,主動(dòng)調(diào)用。需要多一層閉包函數(shù)
def foo():
    print("foo")

@timefun_arg("python")
def too():
    print("too")

foo()
sleep(2)
too()
作用域
globals

查看命名空間中所有全局變量:
globals()以字典方式返回

{"__name__": "__main__", "__doc__": None, "__package__": None, "__loader__": , "__spec__": None, "__annotations__": {}, "__builtins__": }
locals

查看命名空間中局部變量
locals()以字典方式返回:

{"__name__": "__main__", "__doc__": None, "__package__": None, "__loader__": , "__spec__": None, "__annotations__": {}, "__builtins__": }
LEGB規(guī)則

Python使用LEGB的順序來(lái)查找一個(gè)符號(hào)對(duì)應(yīng)的對(duì)象

locals -> enclosing function -> globals -> builtins

locals: 當(dāng)前所在的命名空間(如函數(shù),模塊),函數(shù)的參數(shù)也屬于命名空間內(nèi)的變量
enclosing: 外部嵌套函數(shù)的命名空間
globals: 全局變量,函數(shù)定義所在模塊的命名空間
builtins: 內(nèi)建模塊的命名空間

查看內(nèi)建模塊的變量:dir(__builtins__)

["ArithmeticError", "AssertionError", "AttributeError", "BaseException", "BlockingIOError", "BrokenPipeError", "BufferError", "BytesWarning", "ChildProcessError", "ConnectionAbortedError", "ConnectionError", "ConnectionRefusedError", "ConnectionResetError", "DeprecationWarning", "EOFError", "Ellipsis", "EnvironmentError", "Exception", "False", "FileExistsError", "FileNotFoundError", "FloatingPointError", "FutureWarning", "GeneratorExit", "IOError", "ImportError", "ImportWarning", "IndentationError", "IndexError", "InterruptedError", "IsADirectoryError", "KeyError", "KeyboardInterrupt", "LookupError", "MemoryError", "ModuleNotFoundError", "NameError", "None", "NotADirectoryError", "NotImplemented", "NotImplementedError", "OSError", "OverflowError", "PendingDeprecationWarning", "PermissionError", "ProcessLookupError", "RecursionError", "ReferenceError", "ResourceWarning", "RuntimeError", "RuntimeWarning", "StopAsyncIteration", "StopIteration", "SyntaxError", "SyntaxWarning", "SystemError", "SystemExit", "TabError", "TimeoutError", "True", "TypeError", "UnboundLocalError", "UnicodeDecodeError", "UnicodeEncodeError", "UnicodeError", "UnicodeTranslateError", "UnicodeWarning", "UserWarning", "ValueError", "Warning", "WindowsError", "ZeroDivisionError", "_", "__build_class__", "__debug__", "__doc__", "__import__", "__loader__", "__name__", "__package__", "__spec__", "abs", "all", "any", "ascii", "bin", "bool", "bytearray", "bytes", "callable", "chr", "classmethod", "compile", "complex", "copyright", "credits", "delattr", "dict", "dir", "divmod", "enumerate", "eval", "exec", "exit", "filter", "float", "format", "frozenset", "getattr", "globals", "hasattr", "hash", "help", "hex", "id", "input", "int", "isinstance", "issubclass", "iter", "len", "license", "list", "locals", "map", "max", "memoryview", "min", "next", "object", "oct", "open", "ord", "pow", "print", "property", "quit", "range", "repr", "reversed", "round", "set", "setattr", "slice", "sorted", "staticmethod", "str", "sum", "super", "tuple", "type", "vars", "zip"]
動(dòng)態(tài)綁定

動(dòng)態(tài)綁定屬性:

class Person(object):
    def __init__(self):
        pass
        
p1 = Person
p1.name = "pp" # 動(dòng)態(tài)添加屬性

print(p1.name)

動(dòng)態(tài)綁定方法:

import types
class Person(object):
        def __init__(self, newName, newAge):
                self.name = newName
                self.age = newAge
        def eat(self):
                print("eat-", self.name)

def run(self):
        print("run-", self.name)

p1 = Person("p1", 24)
p1.eat()

# 通過(guò)types庫(kù)中的MethodType方法來(lái)修改指向函數(shù)中的this指針
p1.run = types.MethodType(run, p1) # 動(dòng)態(tài)添加方法

p1.run()

綁定靜態(tài)方法和靜態(tài)屬性:

class Person(object):
    def __init__(self):
        pass



@staticmethod
def test():
    print("static method")

Person.test = test # 綁定靜態(tài)方法
Person.name = "alogy" # 綁定靜態(tài)屬性

Person.test()

綁定類(lèi)屬性:

class Person(object):
    def __init__(self):
        pass


@classmethod
def printNum(cls):
    print("class method")

Person.printNum = printNum

Person.printNum()
slots

動(dòng)態(tài)語(yǔ)言:可以在運(yùn)行過(guò)程中,修改代碼
靜態(tài)語(yǔ)言:編譯時(shí)已經(jīng)確定好代碼,運(yùn)行過(guò)程中不能修改

__slots__作用:限制實(shí)例的屬性

class Person(object):
    __slots__ = ("name", "age")
    
p = Person()
p.name = "alogy"
p.age = 24
    

Note:
__slots__定義的屬性僅對(duì)當(dāng)前類(lèi)實(shí)例起作用,對(duì)繼承的子類(lèi)是不起作用

生成器

目標(biāo):列表中有大量數(shù)據(jù),還不想占用大量?jī)?nèi)存空間。

生成器特點(diǎn):保存了一套生成數(shù)值的算法。(什么時(shí)候需要使用到了,才去生成。)

生成器定義方法

方法1:()

a = (x for x in range(10))
print(a)

方法2: yield

def createNum():
    print("--start")
    a,b = 0,1
    for i in range(5):
        print("--11")
        yield b
        print("--22")
        a,b = b,a+b
        print("--33")
    print("--end")

t = createNum()

for num in t:
    print(num)

輸出結(jié)果:

--start
--11
1
--22
--33
--11
1
--22
--33
--11
2
--22
--33
--11
3
--22
--33
--11
5
--22
--33
--end

send方法: 與yield的結(jié)果配合使用,使得yield執(zhí)行的時(shí)候,外部可以傳遞參數(shù)到生成器中。
能夠執(zhí)行next()且還可以傳遞參數(shù)

def test():
    i = 0
    while i < 5:
        temp = yield i
        print(temp)
        i += 1

t = test()
print(t.next()) 
# 0
print(t.next()) 
# None
# 1
print(t.send("args"))
# args
# 2      

Note:
send()第一次直接調(diào)用報(bào)錯(cuò),是參數(shù)不知道給那個(gè)函數(shù)。
報(bào)錯(cuò)為:

Traceback (most recent call last):
  File "", line 1, in 
TypeError: can"t send non-None value to a just-started generator

解決方法:

通過(guò)next()先調(diào)用一次,然后再使用send()

第一次調(diào)用send(None)傳遞空值進(jìn)去,后續(xù)幾次傳遞該傳遞的值

完成多任務(wù)
def test1():
    while True:
        print("test1")
        yield None

def test2():
    while True:
        print("test2")
        yield None

t1 = test1()
t2 = test2()

while True:
    t1.next()
    t2.next()

一齊執(zhí)行test1(),test2(),test3(),三個(gè)while True同時(shí)執(zhí)行
三個(gè)多任務(wù)或者三個(gè)以上同時(shí)執(zhí)行稱之為:協(xié)程

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/41392.html

相關(guān)文章

  • Python中的函數(shù)裝飾器和閉包

    摘要:變量查找規(guī)則在中一個(gè)變量的查找順序是局部環(huán)境,閉包,全局,內(nèi)建閉包引用了自由變量的函數(shù)。閉包的作用閉包的最大特點(diǎn)是可以將父函數(shù)的變量與內(nèi)部函數(shù)綁定,并返回綁定變量后的函數(shù),此時(shí)即便生成閉包的環(huán)境父函數(shù)已經(jīng)釋放,閉包仍然存在。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之函數(shù)篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門(mén)Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握裝飾器的本質(zhì)、功...

    caozhijian 評(píng)論0 收藏0
  • Python中的上下文管理器和else塊

    摘要:上下文管理器協(xié)議包含和兩個(gè)方法。因此必要時(shí)在上下文管理器函數(shù)中使用語(yǔ)句防范錯(cuò)誤。構(gòu)建臨時(shí)忽略指定異常的上下文管理器。這是個(gè)基類(lèi),用于定義基于類(lèi)的上下文管理器。塊結(jié)束時(shí),按照后進(jìn)先出的順序調(diào)用棧中各個(gè)上下文管理器的方法。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之控制流程篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門(mén)Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握if語(yǔ)句之外的el...

    Michael_Lin 評(píng)論0 收藏0
  • Python裝飾器、迭代器和成器

    摘要:在學(xué)習(xí)的時(shí)候,三大名器對(duì)沒(méi)有其他語(yǔ)言編程經(jīng)驗(yàn)的人來(lái)說(shuō),應(yīng)該算是一個(gè)小難點(diǎn),本次博客就博主自己對(duì)裝飾器迭代器和生成器理解進(jìn)行解釋。 在學(xué)習(xí)python的時(shí)候,三大名器對(duì)沒(méi)有其他語(yǔ)言編程經(jīng)驗(yàn)的人來(lái)說(shuō),應(yīng)該算是一個(gè)小難點(diǎn),本次博客就博主自己對(duì)裝飾器、迭代器和生成器理解進(jìn)行解釋。 裝飾器 什么是裝飾器?裝飾從字面意思來(lái)誰(shuí)就是對(duì)特定的建筑物內(nèi)按照一定的思路和風(fēng)格進(jìn)行美化的一種行為,所謂器就是工具...

    30e8336b8229 評(píng)論0 收藏0
  • 流暢的python讀書(shū)筆記-第七章-函數(shù)裝飾器和閉包

    摘要:函數(shù)裝飾器和閉包嚴(yán)格來(lái)說(shuō),裝飾器只是語(yǔ)法糖。何時(shí)執(zhí)行裝飾器它們?cè)诒谎b飾的函數(shù)定義之后立即運(yùn)行。裝飾器突出了被裝飾的函數(shù)的作用,還便于臨時(shí)禁用某個(gè)促銷(xiāo)策略只需把裝飾器注釋掉。 函數(shù)裝飾器和閉包 嚴(yán)格來(lái)說(shuō),裝飾器只是語(yǔ)法糖。如前所示,裝飾器可以像常規(guī)的可調(diào)用對(duì)象那樣調(diào)用,其參數(shù)是另一個(gè)函數(shù)。有時(shí),這樣做更方便,尤其是做元編程(在運(yùn)行時(shí)改變程序的行為)時(shí)。 Python何時(shí)執(zhí)行裝飾器 它們?cè)?..

    Hydrogen 評(píng)論0 收藏0
  • python裝飾器和描述器的使用總結(jié)

    摘要:所有的描述器協(xié)議如下如果一個(gè)對(duì)象同時(shí)定義了和它叫做資料描述器。僅定義了的描述器叫非資料描述器描述器在屬性訪問(wèn)時(shí)被自動(dòng)調(diào)用。 被某些中文教程坑過(guò),我的建議是有問(wèn)題看官方文檔,即使沒(méi)有很詳細(xì)的例子,至少不坑 裝飾器 毫無(wú)疑問(wèn)在python中用得非常多 def deco(func): def _deco(): print before invoked ...

    xietao3 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<