函數名其實就是一個變量,命名規範和變量同樣git
變量能夠作的,函數名也能夠作api
a = 10 b = a # 賦值操做 print(b) # 變量a的值賦給了b,因此b=10 def func(): print("我是一個小小的函數") a = func #函數名賦給了a print(a) # a就是func,因此若是想要調用函數就能夠寫成 a() a() #我是一個小小的函數 func() #我是一個小小的函數 #以上 a和func的做用是同樣的 #也能夠拿來作變量能夠作的事,好比for遍歷 def func1(): print("我是1") def func2(): print("我是2") def func3(): print("我是3") lst = [func1, func2, func3] for el in lst: el() >>>#el就是列表中每一個函數名因此結果就是依次調用函數 #結果: 我是1 我是2 我是3
在內層函數中訪問外曾函數的變量安全
#閉包寫法: def outer(): a = 10 def inner(): print(a) return inner #這就是一個閉包,變量a只能在局部範圍使用
如今有一數據,咱們能夠用dir來查看該數據包含了哪些處理方法,也就是說該數據支持什麼處理方式閉包
#字符串 print(dir(str)) >>> ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] #列表 print(dir(list)) >>> ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] #int print(dir(int)) >>> ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes'] #咱們知道字符串和列表是支持for 循環的,也就是可迭代的,可是int不是可迭代的,大家發現了什麼呢? #列表和字符串中都有一個相同的東西 __iter__,而int沒有,那咱們能夠認爲,可迭代對象中都有這個__iter__
#有了可迭代對象,咱們就能夠用for循環了,那麼在程序內部for循環是怎麼運行的呢? #可迭代對象可使用__iter__得到迭代器 s = "周杰倫喜歡昆凌" it = s.__iter__() # 獲取迭代器 print(dir(it)) >>> ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__'] lst = [1,2,3,4,5,6,7,8] li = lst.__ister__() #獲取迭代器 print(dir(li)) >>> ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__'] #生成的迭代器找那個都有個 __next__,相似於喊號,下一個的做用
#引入模塊 from collections import Iterable # 可迭代對象 from collections import Iterator # 迭代器 print(isinstance(lst, Iterable)) #對象是否可迭代 print(isinstance(lst, Iterator))#能否生成迭代器 print(isinstance(it, Iterable)) print(isinstance(it, Iterator))
可迭代對象:Iterable, 裏面有__iter__()能夠獲取迭代器, 沒有__next__()app
迭代器:Iterator, 裏面有__iter__()能夠獲取迭代器, 還有__next__()ssh
lst = ["周杰倫", "昆凌", "林俊杰", "姚明","潘長江"] it = lst.__iter__() # 獲取迭代器 while 1: try: # 嘗試執行 el = it.__next__() # 獲取下一個元素 print(el) except StopIteration: # 處理錯誤 break >>> 周杰倫 昆凌 林俊杰 姚明 潘長江 #若是不寫 except StopIteration: 雖不影響效果,但會則會報一個StopIteration(中止迭代)的錯誤