函数名其实就是一个变量,命名规范和变量同样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(中止迭代)的错误