函数名的使用
(函数即变量,基本与变量相同,一个函数名表示的是这个函数加载到内存的地址)
1.函数名内存地址
2.函数名具有变量的功能,可以赋值给其他变量,和添加到列表等容器
3.可以作为函数的实际参数和函数的返回值
经典模式
闭包:
在局部作用域中,内层函数对外层函数(非全局)的变量的引用(一个函数名被作为对象被返回,并且该函数名下中包含了外层函数的变量)
好处:
- 保护我们的变量不受侵害
- 可以让一个变量常驻内存
可以通过使用__closure__ 检测函数是否是闭包,最内层的函数名.__closure__,如果返回的值None,说明不是闭包
迭代器
Iterable: 可迭代对象. 内部包含__iter__()函数
Iterator: 迭代器. 内部包含__iter__() 同时包含__next__()
迭代器的特点:
1. 节省内存.
2. 惰性机制,必须用__next__()来获取数据
3.不能反复,只能向下执行(一次性,取完就没)
判断数据是否是可迭代对象
from collections import Iterable,Iterator
isinstance('abc',Iterable) 判断一个对象是否是可迭代对象
1.isinstance() 函数是判断某个东西是否是属于哪一个类,eg:
isinstance(‘cisco’,str) 意思是判断‘cisco’是否是一个字符串类型,如果是返回Ture
否则返回False
2.通过dir() 函数查看该变量的所有方法中是否含有__iter__ 方法,如果有就是可迭代的,如果还有方法__next__ 就是迭代器
由于dir() 返回的值一个关于该变量的所有的方法是列表,可以通过__iter__ in dir(变量名) 通过使用print打印出来的Ture or False 判断
lis = [1,2,3,4,5,6,7,8,9] gg = lis.__iter__() #对Lis中的__iter__方法进行调用,得到的就是一个迭代器 print(gg) #<list_iterator object at 0x0000000E687EEC88> 迭代器的内存地址 while 1: try: a = gg.__next__()#之后调用生成器中的__next__方法(每次调用就从迭代器里面拿一个值进行返回) print(a) #相当于for循环的循环体 except StopIteration: print('over') break
一个可迭代对象在调用__iter__方法后才是一个迭代器(含有__next__方法),