函数--第一类对象、闭包、
一.第一类对象
函数名是一个变量,但它是个特殊的变量,与括号配合可以执行函数的变量.
函数名可以赋值给其他变量,调用函数体时,后面()就可和原函数名一样使用
函数名可以当作容器类的元素
函数名可以当作函数的参数
函数名可以作为函数的返回值
二.闭包
闭包就是内层函数,对外层函数(非全局)的变量的引用,python规定:如果你的内部函数中访问了外层函数中的变量,那么这个变量将不会消亡,常驻内存 闭包的简单写法: def func1(): name = "alex" def func2(): return name # 闭包 return func2 ret=func1() #访问外部函数,获取到内部函数的地址 print(ret())#访问并打印内部函数 结果: alex
未来闭包的应用场景简述
简易版爬虫
from urllib.request import urlopen #导入urllib包的request模块的urlopen(打开一个网址)函数
def but():
content = urlopen("https://www.dytt8.net").read()
def get_content():
return content
return get_content
print("开始获取")
fn = but()
content = fn().decode("gbk")
print("获取完毕")
print(content[60])
print(content[5])
检测函数是否有闭包:__closure__ 使用函数名.__closure__返回cell就是闭包,返回None就不是闭包
闭包的优点:
1)保护变量不被全局修改
2)可以让这个变量常驻内存,方便调用.
闭包的不足:
当闭包太多,常驻内存的值就会很多,内存空间会告急.
三、迭代器
判断迭代器和可迭代对象的方案(官方):
Iterable(是否是可迭代的);
Iterator(是否是迭代器)
from collections import Iterable, Iterator isinstance(对象, Iterable) 是否是可迭代的 isinstance(对象, Iterator) 是否是迭代器
str, list, tuple, dict, set都是可迭代对象,因为他们遵循了可迭代协议. dir()函数是第一种:可以查看类中定义好的所有方法,包括是否可迭代 print(dir(str)) 属性中存在__iter__,声明该类是个可迭代对象, isinstence()函数是第二种查看一个对象定义好的所有方法,包括是否可迭代 l = [1,2,3] l_it = l.__iter__() #获取对象的迭代器,有了迭代器权限,才能一个一个(__next__)迭代拿取 __inter__获取到对象的迭代器 #可以使用迭代器中的__next__()来一个一个的获取迭代器内的元素,
总结:
以后代码写的过长,但需求只是一部分时,使用改方法可节省内存.
该方法存在惰性机制,就是你不下__next__的指令它就永远停在那里,而且不能反复,只能向下执行,如果想再次获取前一个内容,必须重新获取该类的迭代器(l_it = l.__iter__)
for 循环的机制:
for i in [1,2,3]: print(i)
下面我们使用while循环+迭代器来模拟for循环
lst = [1,2,3] lst_iter = lst.__iter__()#获取lst列表的迭代器权限 while True: try: #尝试 i = lst__iter__().__next__() print(i) except StopIteration:#如果报错 break #终止(兜底) 此方法的try,except StopIteration, break,为固定格式