01 函数名的应用
理解:可以理解为特殊的变量
1.函数名等同于函数的内存地址
2.函数名可以作为变量
def func1():
print(666)
f1 = func1 #将函数名func1赋值给f1
f2 = f1 #再继续将值赋给f2
f2() #执行
3.函数名可以当做函数的参数
def func1()
print(666)
def func2()
x()
func2(func1) #实参为函数名
4.函数名可以当做函数的返回值
def wrapper():
def inner():
print('inner')
return 666
return inner #外部函数将内部函数的函数名当做返回值
ret = wrapper()
ret()
5.函数名可以作为容器类型的元素
第一类对象: 1.可在运行期创建 2.可用作函数参数或返回值 3.可存入变量的实体。
上述的函数和后面要介绍的类就是第一类对象
02 闭包
定义:
内层函数对外层函数的变量(非全局变量)的引用,并返回,这样就形成了闭包。
闭包的作用:
当程序执行时,遇到了函数执行,他会在内存中开辟一个空间——局部名称空间,如果这个函数产生闭包,那么他就不会随着函数结束而消失。
def wrapper():
x = 0
def inner():
nonlocal x
a = x
x += 1
return a
return inner #产生闭包
f1 = wrapper() #将外部函数赋值给变量
print(f1()) #0
print(f1()) #1
print(f1()) #2
03 可迭代对象
补充:dir()以列表的形式返回该类型数据的所有方法。
从源码的角度考虑:对象内部含有__iter__方法的就是可迭代对象。
判断方法1:
s = '1234567' #判断字符串是否是可迭代对象
print('__iter__' in dir(s))
04 迭代器
从源码的角度考虑:对象内部含有__iter__方法,并且含有__next__方法就是迭代器。
可迭代对象---->迭代器
lis = [1,2,3,4,5]
iter_lis = lis.__iter__() #方法一
iter_lis2 = iter(lis) #方法二
补充判断方法:
from collections import Iterable
from collections import Iterator
print(isinstance('Abner',Iterable)) #返回True表面元素为可迭代对象
print(isinstance('Abner',Iterator)) #返回False表面元素不是迭代器
迭代器的优缺点
优点:
1.可以不通过索引或者关键字取值
2.节省内存空间
缺点:
1.无法获取迭代长度,在没有执行到末尾之前
2.不能回头反复,必须一路走到头
可迭代对象和迭代器区别:
1.可迭代对象是不能取值的,而迭代器可以。
2.迭代器非常节省内存
3.迭代器每次只会取一个值
4.迭代器只能单向的,不反复。
应用:
1.数据量大
2.单纯的取值
05 while循环模拟for循环机制
s = 'sadhada'
for i in s:
print(i) #for循环
iter_s = s.__iter__()
while 1: #利用while循环模拟for循环遍历机制
try:
print(iter_s.__next__())
except:
StopIteration #异常处理
break