Knight_day11
【其他、函数名应用、globals() locals()、闭包、可迭代对象与迭代器】
- 其他
for
没break 执行else
break 不执行else
else
- 函数名应用
函数名是一个特殊变量
1.函数名就是函数的内存地址
2.函数名可以作为变量

3.函数名可以作为函数的参数
4.函数名可以当作函数的返回值
5.函数名可以作为容器类类型的元素(可用for循环一次执行多个函数)
以上像函数名这种,叫做第一类对象,当作普通变量用
- globals() locals()
globals() 返回包括全局变量的一个字典
locals() 返回包括当前局部位置的变量字典
- 闭包
内层函数对外层函数的变量(非全局变量)引用,且外层函数返回内层函数名,就形成了闭包。
判断引用:
__closure__
返回地址是,返回None
注意:把变量传给函数,相当于在函数中定义这个变量。
闭包作用:当程序执行时,遇到函数执行,会在内存中开辟一个局部名称空间,如果这个函数内部形成闭包,那这个空间不会随着函数结束而立即消失(一段时间后有回收机制)。用于爬虫(爬一次就存在内存),装饰器。
- 可迭代对象与迭代器
可迭代对象:满足可迭代协议,对象内部含有__iter__方法就是可迭代对象
常见可迭代对象:str list dict tuple set range
dir() 返回一个字符串列表,元素为该对象所有方法
判断:
判断一个对象是否是可迭代对象:
1.print('__iter__' in dir(...))
2.from collections import Iterable
print(isinstance(..., Iterable))
注:
isinstance(..., 这种) 判断...是不是这种,比type()全面,type()只能判断什么数据类型
判断一个对象是否是迭代器:
1.对象内含有'__iter__'方法且含有'__next__'方法就是迭代器
print('__iter__' in dir())
print('__next__' in dir())
2.from collections import Iterable
from collections import Iterator
print(isinstance(..., Iterable))
print(isinstance(..., Iterator))
可迭代对象 vs 迭代器:
1.可迭代对象不能取值,迭代器可取值。
可迭代对象 ----> 迭代器:.__iter__() 或 iter()
迭代器next一次取一个值:str1.__iter__().__next__() 或next() 。超出范围报错
2.迭代器非常节省内存
如for循环就是先转迭代器,利用__next__一个一个取值,在内存中只占一个
3.迭代器每次只会取一个值
4.迭代器是单向的,不反复,一条路走到头
- while循环模拟for循环机制
1.将可迭代对象转化为迭代器
2.调用__next__方法取值
3.利用异常处理解决报错
s1 = 'asdawfwagwagaw' s1 = s1.__iter__() while 1: try: print(s1.__next__()) except StopIteration: break

浙公网安备 33010602011771号