python摸爬滚打之day11----函数闭包,迭代器
1、函数名
函数名就是一个变量名, 函数名存储的是该函数的内存地址.
函数名都可以进行哪些应用?
函数名可以赋值给其他的变量;
函数名可以作容器里的元素使用;
函数名可以当做形参传进另一函数;
函数名可以作为函数的返回值, 即 return func, 在全局调用.
代理模式?
给某一函数在执行前后执行后加上某些功能, 是装饰器的雏形.
1 def chi(f): 2 print("吃汉堡") 3 f() 4 print("吃炸鸡") 5 def he(): 6 print("喝肥宅快乐水") 7 8 chi(he)
2、闭包
内层函数对外层函数的变量的引用.
作用: 1, 保护变量不受更改; 2, 让变量常驻于内存不会被销毁.
1 # 闭包 2 def outer(): 3 a = 100 4 def inner(): # inner()函数要用到父级的a, 所以inner()函数就是一个闭包. 5 b = a + 50 6 return b 7 return inner # 函数名作为函数的返回值,在全局调用 8 9 ret = outer() 10 ret() # 在外部调用里层的函数
3、迭代器
(前情:)内置函数---- dir(查询的对象) : 可以查出该对象可以执行的操作(即内部可执行方法)
可以用dir(list)查询是否有__iter__() 或__next__() 方法.
可迭代对象: 可循环遍历的对象, 即str, list, dic, tuple, set. 内部只有__iter__()方法.
迭代器: 内部既有__iter__() 方法,也有__next__() 方法.
for 循环遍历机理?
1 lst = ["李白","李黑","李太白","李太黑","李不白",] # 可迭代对象 2 it = lst.__iter__() # 先变成迭代器 3 while 1: 4 try: 5 content = it.__next__() # 迭代器通过__next__()来取值 6 print(content) 7 except stopiteration: # 取完了就直接添加错误,然后停止 8 print("遍历完了可以结束了") 9 break
判断一个对象(str)是否是一个可迭代对象?
1: 通过dir(str) 看有没有__iter__();
2: print("__iter__()" in dir(str) ) ----> true : 是可迭代对象;
3: from collections import iterable, iterator
print( isinstance(str, iterable) ) ----> true : 是可迭代对象
迭代器的三个特点?
1: 节省内存(用生成器);
2: 惰性机制, 必须使用__next__()来获取数据;
3: 只能向后执行, 不能再返回前一级.
上一篇: Linux进程间通信 --- 消息队列