Tenth 函数名/闭包/迭代器/
1、函数名:
1)函数名是一个特殊的变量
2)函数名可以当作变量赋值
3)函数名可以当作容器数据类型的元素
4)函数名可以当作函数的参数
5)函数名可以当作函数的返回值
2、闭包:
1)内层函数对外层函数(非全局)变量的引用
2)闭包只存于内层函数中
3)函数都要逐层返回,最终返回给最外层函数
闭包:解释器执行程序时,如果遇到函数,随着函数的结束而关闭临时名称空间,但是!
如果遇到闭包,那么闭包的空间不会随着函数的结束而关闭
# 闭包模板 def wrapper(step): num = 1 def inner(): nonlocal num num += step print(num) return inner f = wrapper(3) j = 0 while j < 5: f() j+=1 # 输出结果为 4 7 10 13 16
闭包就是在内存中开一个空间,常贮存一些内容,以便后续程序调用
3、迭代器(iterable:可迭代对象)节省内存、惰性机制、一条路走到黑
可迭代对象:
1)内部含有__iter__方法的就是可迭代对象,遵循可迭代协议
2)可迭代对象不能直接取值
判断一个对象是否是可迭代对象方法一:
# 模板 s1 = 'abcd' print('__iter__' in dir(s1)) # dir 是显示以字典形式的所有方法
方法二:
# 模板 from collections import Iterable print(isinstance(obj,Iterable))
迭代器:内部含有'__iter__' 并含有'__next__'方法的就是迭代器,遵循迭代器协议
可迭代对象转换成迭代器:
# 可迭代对象.__iter__() 或者iter(可迭代对象) s1 = 'abcd' obj = s1.__iter__() obj = iter(s1) print(obj.__next__()) print(obj.__next__()) # 一个next 对应一个值,一一对应
判断是否为迭代器方法一:
print('__iter__' in dir(obj) and '__next__' in dir(obj)) #判断两个方法是否在obj中
判断是否为迭代器方法二:
from collections import Iterator print(isinstance(obj, Iterator))
4、type() 与 isinstance()的区别
type()只是判断该对象的数据类型
isinstance()不仅可以判断该对象的数据类型,而且可以判断其他很多。
5、while 循环模拟 for 循环机制
l1 = [print(i) for i in rang(20)] # 此为 for 循环 s1 = '12345' obj = iter(s1) while 1: try: print(next(obj)) except StopIteration: break


浙公网安备 33010602011771号