一, 第一类对象:
函数名是一个变量, 可以当普通变量使用, 但它又是一个特殊的变量, 与括号配合可以执行函数.
函数名的运用
1, 单独打印是一个内存地址
2, 可以给其他变量赋值
3, 可以作为容器类变量的元素
4, 可以作为函数的参数
5, 可以作为函数的返回值
二, 闭包
如果一个内层函数有对外层函数变量的引用, 那么就称为这个内层函数为闭包函数, 也叫闭包
那么, 如何检查一个函数是不是闭包函数呢?
用__closure__() 方法可以检查函数是否是闭包函数, 返回值不为 None 就是闭包函数.
- def func():
- name = "alex"
- def func2():
- print(name)
- func2()
- print(func2.__closure__) #(<cell at 0x00000000027375B8: str object at 0x00000000027B81B8>,)
- func()
- print(func.__closure__) #None
闭包的作用
1, 保护变量不受侵害. 闭包函数引用的是局部变量, 因此变量不容易被修改
2, 可以让一个变量常驻内存. 因为内层函数执行的时机是不确定的, 为了 inner 函数能正常执行, 必须保证变量存在.
如何访问内部函数?
访问内部函数, 可以先调用外部函数, 获取内部函数地址, 再调用内部函数即可. 多层嵌套就一层一层的返回
- def outer():
- name = "alex"
- #内部函数
- def inner():
- print(name)
- return inner
- fn = outer() #调用外部函数 获取内部函数的函数地址
- fn() #调用内部函数
两个方法:
__doc__() 查看函数的文档注释
__name__() 查看函数名
三, 迭代器
迭代器就是个可以使用__next__函数一个一个往外拿值的容器. 比如 a 是一个迭代器, 那么 a.__next__() 就表示从 a 中拿出了一个值.
dir() 能够查看数据类型能够执行的操作, 即该数据类型支持的内部方法
- 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']
通过对 list,set,tuple,str 等数据类型查看, 我们都能发现一个__inter__函数, 这是可迭代对象的共性. 其实__inter__函数相当于是一个可迭代协议, 只要有这个函数, 就表示它是可迭代的.__inter__函数的作用是获取对象的迭代器.
因此
一个对象有__inter__函数, 表示可迭代的 (iterable)
有__iter__, __next__函数, 表示是迭代器 (iterator), 迭代器都是可迭代的
如何判断一个对象是否是可迭代对象?
1,dir(x) 查看是否具有__iter__函数
2,"__iter__" in dir(x) 判断是否可迭代 返回值是 True 或 False
"__next__" in dir(x) 判断是否是迭代器 返回值是 True 或 False
3, 专业方法
from collections import Iterable,Iterator
isinstance(x ,Iterable) 表示 x 是否是 Iterable
isinstance(x,Iterator) 表示 x 是否是 Iterator
迭代器的三个特点:
1, 节省内存
2, 惰性机制 必须通过__next__() 才能拿值
3, 只能往前, 不能后退
使用 while + 迭代器模拟 for 循环:
- lst = [1,2,3]
- it = lst.__iter__() #得到迭代器
- while 1:
- try:
- el = it.__next__()
for 循环的循环体
- except StopIteration:
- break
- lst = [1,2,3]
- it = lst.__iter__()
- while 1:
- try:
- el = it.__next__()
- print(el)
- except StopIteration:
- break
- # 等价于
- for el in lst:
- print(el)
来源: http://www.bubuko.com/infodetail-2908390.html