国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python_裝飾器和生成器

sugarmo / 2800人閱讀

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

迭代器

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

可迭代對象

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

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

generator,包括生成器yieldgenerator function

判斷是否可以迭代

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

from collections import Iterable

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

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

生成器, tuple

from collections import Iterator

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

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

可以把其他類型轉(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)
裝飾器

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

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

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

裝飾器原理:

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

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

裝飾器語法糖:

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

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

f1()         
二個裝飾器
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í)行的時間
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
裝飾器對有參數(shù)、無參數(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來解決多參數(shù)問題

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)
裝飾器對帶有返回值的函數(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í)行,主動調(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的順序來查找一個符號對應(yīng)的對象

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"]
動態(tài)綁定

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

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

print(p1.name)

動態(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()

# 通過types庫中的MethodType方法來修改指向函數(shù)中的this指針
p1.run = types.MethodType(run, p1) # 動態(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()

綁定類屬性:

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


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

Person.printNum = printNum

Person.printNum()
slots

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

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

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

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

生成器

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

生成器特點(diǎn):保存了一套生成數(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ù)到生成器中。
能夠執(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)用報錯,是參數(shù)不知道給那個函數(shù)。
報錯為:

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

解決方法:

通過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(),三個while True同時執(zhí)行
三個多任務(wù)或者三個以上同時執(zhí)行稱之為:協(xié)程

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41392.html

相關(guān)文章

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

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

    caozhijian 評論0 收藏0
  • Python中的上下文管理器和else塊

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

    Michael_Lin 評論0 收藏0
  • Python裝飾器、迭代器和成器

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

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

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

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

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

    xietao3 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<