函数是一个变量,但他是一个特殊的变量,与括号配合可以执行函数的变量
函数名是个对象
函数名可以当list里的元素进行使用
函数名可以作为参数,传递给另一个函数
函数名总结:
函数名的应用,第一类对象
函数名可以像变量一样进行使用: 1 赋值 2作为list元素 3作为参数 4 作为返回值
闭包:
定义: 内层函数对外层函数的局部变量的访问
可以让一个局部变量常驻内存
变量直接写在全局是不安全的,容易被其他层函数通过 global 修改
闭包的作用
1 常驻内存,以待随时调用
2 防止其他程序改变这个变量
函数名._closure_ 检测函数是否是闭包,运行结果为None表明不是闭包
闭包总结
内部函数访问外部函数的局部变量
好处: 1 安全 2常驻内存,提交效率
[
首先给出闭包函数的必要条件:
- 闭包函数必须返回一个函数对象
- 闭包函数返回的那个函数必须引用外部变量(一般不能是全局变量),而返回的那个函数内部不一定要return
__closure__属性返回的是一个元组对象,包含了闭包引用的外部变量。
· 若主函数内的闭包不引用外部变量,就不存在闭包,主函数的_closure__属性永远为None:
· 若主函数没有return子函数,就不存在闭包,主函数不存在_closure__属性:
三、为何叫闭包?
先看代码:
def line_conf(a):
b = 1
def line(x):
return a * x + b
return line
line_A = line_conf(2)
b = 20
print(line_A(1)) # 3
如你所见,line_A对象作为line_conf返回的闭包对象,它引用了line_conf下的变量b=1,在print时,全局作用域下定义了新的b变量指向20,最终结果仍然引用的line_conf内的b。这是因为,闭包作为对象被返回时,它的引用变量就已经确定(已经保存在它的__closure__属性中),不会再被修改。
是的,闭包在被返回时,它的所有变量就已经固定,形成了一个封闭的对象,这个对象包含了其引用的所有外部、内部变量和表达式。当然,闭包的参数例外。
————————————————
版权声明:本文为CSDN博主「海的邻居」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sc_lilei/article/details/80464645
]
迭代器
可迭代对象数据类型中都有一个函数__iter__(),所有包含了__iter__()的数据类型都是可迭代的数据类型 iterable
dir() 可以查看一个对象,数据类型中包含了哪些东西
迭代器使用__next__() 往外拿元素,迭代到最后一个元素之后,再进行迭代就会报错StopIteration
迭代器一定是可迭代的,迭代器里面一定有__next__(),__iter__()
迭代器的迭代器是他本身
迭代器的特点:
1 节省内存
2 惰性机制
3 只能往前拿,不能反着拿
迭代器总结:
可迭代对象(Iterable) :内部包含__iter__() 比如 str, list,tuple,se,dict, range isinstance( ) ----> Iterable
迭代器(Iterator) :内部含有__iter__() __next__() 比如 f isinstance( ) ----> Iterator
迭代器特点: 1 省内存 2 惰性机制 3只能向前