摘要:迭代器迭代是訪問集合元素的一種方式。迭代器是一個可以記住遍歷的位置的對象,迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束,迭代器只往前不會往后退。生成器特點(diǎn)保存了一套生成數(shù)值的算法。
迭代器
迭代是訪問集合元素的一種方式。
迭代器是一個可以記住遍歷的位置的對象,迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束,迭代器只往前不會往后退。
可迭代對象
以直接作用域for循環(huán)的數(shù)據(jù)類型:
集合數(shù)據(jù)類型:list, tuple, dict, set, str
generator,包括生成器和yield的generator 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ī)則在中一個變量的查找順序是局部環(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ì)、功...
摘要:上下文管理器協(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...
摘要:在學(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)行美化的一種行為,所謂器就是工具...
摘要:函數(shù)裝飾器和閉包嚴(yán)格來說,裝飾器只是語法糖。何時執(zhí)行裝飾器它們在被裝飾的函數(shù)定義之后立即運(yùn)行。裝飾器突出了被裝飾的函數(shù)的作用,還便于臨時禁用某個促銷策略只需把裝飾器注釋掉。 函數(shù)裝飾器和閉包 嚴(yán)格來說,裝飾器只是語法糖。如前所示,裝飾器可以像常規(guī)的可調(diào)用對象那樣調(diào)用,其參數(shù)是另一個函數(shù)。有時,這樣做更方便,尤其是做元編程(在運(yùn)行時改變程序的行為)時。 Python何時執(zhí)行裝飾器 它們在...
摘要:所有的描述器協(xié)議如下如果一個對象同時定義了和它叫做資料描述器。僅定義了的描述器叫非資料描述器描述器在屬性訪問時被自動調(diào)用。 被某些中文教程坑過,我的建議是有問題看官方文檔,即使沒有很詳細(xì)的例子,至少不坑 裝飾器 毫無疑問在python中用得非常多 def deco(func): def _deco(): print before invoked ...
閱讀 2902·2021-11-25 09:43
閱讀 2320·2021-11-24 09:39
閱讀 2708·2021-09-23 11:51
閱讀 1400·2021-09-07 10:11
閱讀 1449·2019-08-27 10:52
閱讀 1929·2019-08-26 12:13
閱讀 3356·2019-08-26 11:57
閱讀 1394·2019-08-26 11:31