函数名的使用以及第一类对象,闭包,迭代器
函数名的使用以及第一类对象:
# 查看函数的内存地址 print(函数名)
# 函数可以当值,赋值给变量
# 函数可以参数,传递个参数的形参,函数当参数的时候不能加括号
# 函数可以当返回值,当返回值的之后不加括号
# 函数名可以元素存在容器里
闭包 closure
嵌套函数,在嵌套函数内部使用外部变量(非全局变量),(并且一般外部函数的返回值为内部函数)
好处:保护变量不会被外界修改,函数内使用到的变量延长寿命周期,节省开辟空间和销毁空间(函数每次运行都会开辟空间跟销毁空间)的时间差
#示例解析:
def startAt(): x = 1 def incrementby(y): return x + y return incrementby a = startAt() # 调用startAt(),返回值是incrementby的函数名,也就是incrementby地址 print('function',a) print('result',a(1)) print('a.func_name',a.func_name)
迭代器iterate
迭代器一定是可迭代的,可迭代的不一定是迭代器.
可迭代对象:遵守可迭代对象的协议 具有__iter__()方法
除去整型和布尔值,剩下的都是
迭代器:遵守迭代器的协议,具有__iter__()和__next__()方法
创建一个迭代器 == 可迭代对象.__iter__()
使用迭代器== 迭代器.__next__()
lst = [1,2,3,4,5] l1 = lst.__iter__().__next__() l2 = lst.__iter__().__next__() l3 = lst.__iter__().__next__() l4 = lst.__iter__().__next__() l5 = lst.__iter__().__next__()
#结果全部都是1,因为每次都是生成一个新的迭代器,迭代第一个1.
迭代器特性:不能回退,惰性机制,一次性的
怎么查看迭代器还是可迭代对象
from collections import Iterable,Iterator lst = [1,2,3,4,5] ll = lst.__iter__() print(isinstance(lst,Iterator)) #判断是否是一个可迭代对象 print(isinstance(ll,Iterable)) #判断是否是一个迭代器 False True
for 循环的机制 ************
lst = [1,2,3,4,5] count = 0 l = lst.__iter__()() while count < len(lst) print(l.__next__()) count += 1 lst = [1,2,3,4,5] l = lst.__iter__()() while True: try: #异常捕获 print(l.__next__()) except StopIteration: break from collections import Iterable,Iterator lst = [1,2,3,4,5] ll = lst.__iter__()() print(isinstance(lst),Iterator) #判断是否是一个可迭代对象 print(isinstance(ll),Iterable) #判断是否是一个迭代器
posted on 2019-01-10 15:31 antigeneral 阅读(69) 评论(0) 编辑 收藏 举报