1 函数名就是函数的内存地址
2 函数名可以当作变量
# def func1(): # print(666) # f1 = func1 # f2 = f1 # f2()
3 函数名可以作为函数的参数
4 函数名可以当作函数的返回值
5 函数名可以作为容器类类型的元素
globals() 返回全局变量的一个字典
locals() 返回当前位置 的局部变量的字典
闭包: 内层函数对外层函数的变量(非全局变量)的引用,并返回,这样就形成了闭包。
闭包的作用: 当程序执行时,遇到函数执行,他会在内存中开辟一个空间,局部名称空间
如果这个函数内部形成了闭包,那么他就不会随着函数的结束而消失。
迭代器---------------
对象内部含有_ _iter_ _ 的方法就是可迭代对象 ,可迭代对象满足可迭代协议
可迭代对象: str list dict tuple set range()
判断一个对象是否是可迭代对象
方法一:
dic = {'name':'alex'} print('__iter__' in dir(dic))
方法二:
from collections import Iterable from collections import Iterator print(isinstance('alex',Iterable)) print(isinstance('alex',Iterator)) print(isinstance('alex',str))
对象内部含有_ _iter_ _方法并且还有_ _next_ _方法的就是迭代器
# f = open('register', encoding='utf-8') # print('__iter__' in dir(f)) # print('__next__' in dir(f)) # print('__iter__' in dir(dict)) # print('__next__' in dir(dict))
可迭代对象不能取值,迭代器是可以取值的
# 可迭代对象 --->(转化成)迭代器 的两种格式 # lis = [1, 2, 3] # 可迭代对象 # # ite1 = lis.__iter__() # 迭代器 <list_iterator object at 0x0000027A183BFFD0> # ite1 = iter(lis) # 迭代器 <list_iterator object at 0x0000027A183BFFD0> # print(ite1)
迭代器如何取值? next 一次 取一个值
# print(ite1.__next__()) # print(ite1.__next__()) # print(ite1.__next__()) # print(ite1.__next__())
1可迭代对象不能取值,迭代器是可以取值的
2迭代器非常节约内存
3迭代器每一次只取一个值
4迭代器是单向的 一条路走到黑
s1 = 'kfdsjl' for i in s1: print(i) 这其实是for循环内部把值取出来的
1 将可迭代对象转化成迭代器
2 调用__next__方法取值
3利用异常处理停止报错
用while 循环 模仿 for循环内部运行
while 1: try: print(iter1.__next__()) except StopIteration: break