第一类对象 -----函数名 == 变量名
函数对象可以像变量一样进行赋值
还可以作为列表的元素进行使用
可以作为返回值返回
def wrapper():
def inner():
print("哈哈哈")
return inner # 函数名可以像返回值一样返回
ret = wrapper()
ret() # 在函数外面访问了函数内部的函数
函数可以进行参数进行传递
def func1():
print("朱祁镇")
def func2():
print("徐阶")
def func3():
print("王阳明")
def func4():
print("魏忠贤")
lst = [func1, func2, func3, func4] # 函数+() 就是调用.
print(lst) ###function func2 at 0x000001A53FB298C8>, <function func3 at 0x000001A53FB29950>, <function func4 at 0x000001A53FB299D 是一个内存地址
lst = [func1(), func2(), func3(), func4()] ##函数是调用的,没有retrun返回的是None
print(lst)
###朱祁镇
徐阶
王阳明
魏忠贤
[None, None, None, None]
函数外面的访问了函数内部的函数
def wrapper():
def inner():
print("哈哈哈")
return inner ###函数名可以像返回值一样返回
ret = wrapper()
ret() ##在函数外面方位了函数内部的函数
闭包------函数的嵌套
内层函数中使用外层函数的变量
优点:1.保护变量不被其他人侵害
2.保持一个变量常驻内存
超级简易版爬虫
from urllib.request import urlopen # 导入一个模块
# 干掉数字签名
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
def func():
# 获取到网页中的内容, 当网速很慢的时候. 反复的去打开这个网站. 很慢
content = urlopen("https://www.dytt8.net/").read()
def inner():
return content.decode("gbk") # 网页内容
return inner
print("开始网络请求")
ret = func() # 网络请求已经完毕
print("网络请求完毕")
print("第一次", ret()[5]) ret()就是return返回的值,调用inner函数
print("第二次", ret()[5])
如何查看一个是闭包
__closure__ 有东西就是闭包,没有东西就不是闭包
迭代器---固定的思路.for循环
一个数据类型中包含了__iter__函数表示这个数据是可迭代的
dir(数据): 返回这个数据可以执行的所有操作
判断迭代器和可迭代对象的方案(野路子)
__iter__ 可迭代的
__iter__ __next__ 迭代器
lst = ['贾樟柯', '利安', '杨德昌', '王家卫']
it = lst.__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__()) ###StopIteration 停止迭代
#想回去
it = lst.__iter__() #只能重新获取迭代器
判断迭代器和可迭代对象的方案(官方)
from collections import Iterable, Iterator
isinstance(对象, Iterable) 是否是可迭代的
isinstance(对象, Iterator) 是否是迭代器
官方通过代码判断是否是迭代器
借助于两个模块 Iterator迭代器, Iterable可迭代的
from collections import Iterable, Iterator
lst = [1,2,3]
# print(lst.__next__())
print(isinstance(lst, Iterable)) # xxx是否是xxx类型的. True
print(isinstance(lst, Iterator)) # False
it = lst.__iter__() # 迭代器一定可迭代, 可迭代的东西不一定是迭代器
print(isinstance(it, Iterable)) # xxx是否是xxx类型的. True
print(isinstance(it, Iterator)) # True
for el in it:
print(el)
结束的时候给我们扔出来一个错误stopiteration
模拟for循环
lst= []
# 拿迭代器
it = lst.__iter__() #获取迭代器
while 1:
try: #尝试
el = it.__next__() #数据
print(el)
except StopIteration: #####出错误,意味着数据拿完了
break #退出循环
特征:
1. 省内存(生成器)
2. 惰性机制
3. 只能向前. 不能后退
整合所有的数据类型进行遍历(int,bool除外)
想回去:只能重新获取迭代器
print(dir(bool)) # 没有__iter__
for i in True: # 'bool' object is not iterable
print(i)
print(dir(range))
f = open("呵呵", mode="r", encoding="utf-8")
print(dir(f))
共性:所有带有__iter__的东西都可以进行for循环, 带有__iter__的东西就是可迭代对象
lst = ["贾樟柯", "李安", "杨德昌", "王家卫"]
# 1. 只能向下执行, 不能反复
# 2. 结束的时候会给我们扔出来一个错误 StopIteration
# 3. 整合所有的数据类型进行遍历(int,bool除外)
# print("__iter__" in dir(lst))
it = lst.__iter__() # 拿到的是迭代器 <list_iterator object at 0x0000000001DCC160>
print(it.__next__()) # 下一个
print(it.__next__()) # 下一个
print(it.__next__()) # 下一个
print(it.__next__()) # 下一个
# print(it.__next__()) # 下一个 # StopIteration 停止迭代
# 想回去
it = lst.__iter__() # 只能重新获取迭代器
s = {"张无忌", "贾樟柯", "宝宝", "风扇哥", "门神"}
it = s.__iter__()
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())
print(it.__next__())