摘要:迭代器迭代是訪問(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,包括生成器和yield的generator 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ī)則在中一個(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ì)、功...
摘要:上下文管理器協(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...
摘要:在學(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)行美化的一種行為,所謂器就是工具...
摘要:函數(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è)?..
摘要:所有的描述器協(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 ...
閱讀 2998·2021-11-25 09:43
閱讀 2452·2021-11-24 09:39
閱讀 2794·2021-09-23 11:51
閱讀 1489·2021-09-07 10:11
閱讀 1514·2019-08-27 10:52
閱讀 1994·2019-08-26 12:13
閱讀 3419·2019-08-26 11:57
閱讀 1461·2019-08-26 11:31