课上总结
一.函数名的使用以及第一类对象
1.什么是第一类对象?
在创建一个函数的时候,这个函数就是第一类对象,函数对象可以向变量一样进行赋值操作,还可以作为列表的元素一样使用. 第一类对象 -> 函数名 -> 变量名
比如:
def func(): print("我叫第一类对象") a = func print(a) #<function func at 0x00000000004C1E18> #打印的是内存地址 a() # 我叫第一类对象 #函数名可以进行赋值 func = 666 print(func) ###坑### 结果还是666,这里的func被赋值给666
2.函数名可以放在一个列表里多次调用
def func1(): print("朱元璋") def func2(): print("朱祁镇") def func3(): print("王阳明") def func4(): print("魏忠贤") lst = [func1,func2,func3,func4] lst[0]() #结果:朱元璋 #单个函数调用 for i in lst: i() #结果: #用for循环实现多个函数调用 朱元璋 朱祁镇 王阳明 魏忠贤
3.在外面调用内部函数
def warpper(): def inner(): print("哈哈哈") return inner #return返回给上一级的调用者warpper, inner后面不能加括号"()",这样的话函数没有返回值默认返回None,而且还是只能通过外层函数才能调用 ret = warpper()() #结果:哈哈哈 #后面两个括号代表,执行inner函数返回给warpper函数的函数名,让warpper可以在外面直接调用嵌套的函数
4.函数可以作为"实参"多次调用,作为一个代理来使用,有点类似于装饰器的雏形.
def func1(): print("谢晋") def func2(): print("朱元璋") def func3(): print("朱友文") #定义一个函数作为代理来使用,实现函数可以作为是 "实参" 多次调用. def proxy(a): print("我是代理") a() print("代理执行完毕") proxy(func1) proxy(func2) proxy(func3) #结果 我是代理 谢晋 代理执行完毕 我是代理 朱元璋 代理执行完毕 我是代理 朱友文 代理执行完毕
二.闭 包
1.什么是闭包?
闭包就是内层函数对外层函数的使用.
2.闭包的优点:
保护变量不被侵害
让变量常驻内存,方便下次调用,能够更快的展示
闭包的缺点:
如果内存过大,可能导致内存溢出,或者内存被撑爆.
3.闭包的应用场景:
目前已知爬虫,可以把一个url放入一个变量内,下次访问这个url时就会走本地缓存,快速访问.
三.迭代器
迭代器一定是可迭代的,可迭代的不一定是迭代器.
例:
from collections import Iterable,Iterator#Iterable:可迭代对象 #Iterator:迭代器
# lst = [1,2,3]print(isinstance(lst,Iterable)) #判断是不是可迭代对象 #True 是可迭代类型的
print(isinstance(lst,Iterator)) #判断是不是迭代器 #False 不是迭代器it = lst.__iter__() #把数据转换成"对象".__iter__"再判断就是一个迭代器. print(isinstance(it,Iterable)) #判断是不是可迭代对象 #True 是可迭代类型的 print(isinstance(it,Iterator)) #判断是不是迭代器 #True 是迭代器
1.什么是迭代器?
把一组可迭代的数据进行重新赋值为 >>>> "对象"."__iter__"<<<<,然后用 >>>>"对象".__next__()<<<< 一个一个往外拿值.迭代器是惰性机制的,只能一个一个的往外拿值,当值被拿完就不能再拿,不然会报错,为了防止拿完数据抛异常,可以用 ""try""来处理.
lst = ["张无忌","张三丰","张子龙"] li = lst.__iter__() #这里执行了两次__next__()所以只会拿到两个元素 print(li.__next__()) print(li.__next__()) #结果 张无忌 张三丰
2.查看一个数据类型是否是可迭代对象和迭代器
方法 1. 用dir来查看,只要是有 ""__iter__"" 的都是可迭代对象,都可以用for循环
一个数据类型中包含了__iter__函数表示这个数据是可迭代的
dir(数据): 返回这个数据可以执行的所有操作
print("__iter__" in dir(list)) #只要结果是True的都是可迭代对象
方法2,官方通过代码判断一个对象是否是迭代器
借助于两个模块 Iterator:迭代器,Iterable:可迭代的.
from collections import Iterable,Iterator #Iterable:可迭代对象 #Iterator:迭代器 lst = [1,2,3] print(isinstance(lst,Iterable)) #判断是不是可迭代对象 #True 是可迭代类型的 print(isinstance(lst,Iterator)) #判断是不是迭代器 #False 不是迭代器 it = lst.__iter__() #把数据转换成"对象".__iter__"再判断就是一个迭代器. print(isinstance(it,Iterable)) #判断是不是可迭代对象 #True 是可迭代类型的 print(isinstance(it,Iterator)) #判断是不是迭代器 #True 是迭代器