一 函数名的应用
#函数名为变量
1.可赋值
def func():
pass
func = 1
2.可作为列表元素
def func1():
pass
def func2():
pass
def func3():
pass
l = [func1,func2,func3]
for i in l:
print(i())
3. 可以作为函数参数
def func():
pass
def walsn(fn):
fn()
print(walsn(func))
4.可以作为return值
def func():
print('a')
def inner():
print('b')
return inner
func()() #占内存,速度慢
或者:
ret = func()
print(ret())
二 函数闭包
定义:再内层函数中访问外层函数的局部变量
作用:
1.安全,保护变量不受外界影响
2.让变量常驻内存
例子:
def func():
a = 10
def inner():
print(a)
return inner
三 迭代器
1.定义:可迭代对象,通过__iter__获取生成器,再通过__next__获取元素
2.特点:
a.只能往下 #iterable 可迭代的
b.惰性机制 #itertor 迭代器
c.几乎不占内存
s = ['aaa','vvvv','bbbb','sss']
print(__inter__ in dir(s)) #判定是否可迭代, dir()为查看括号内的功能,如dir(str)为查看字符串的功能
it = s.__iter__() #获取生成器
ret = it.__next__() #获取元素
print(ret)
2.迭代器替换for循环
for循环:
s = ['aaa','vvvv','bbbb','sss']
for i in s:
print(i)
迭代器:
s = ['aaa','vvvv','bbbb','sss']
it = s.__iter__()
while 1:
try:
print(it.__next__())
except:
StopIteration
break
四 生成器
1.定义与写法:
#函数中如果有yield存在,这个函数为生成器函数,调用函数时,不会执行函数,只是获取生成器
def func():
yield 1 #yield 与 return 是一样的,返回一个值,但是yield不会终止函数,而是将函数分段
g = func() #获取生成器函数
ret = g.__next__() #执行函数,直到下一个yield
ret2 = g.__next__() #继续执行函数,到下一个yield
2.特点:
a. 只能往下
b. 惰性机制
c. 节省内存
3.用法:
买衣服(一次性全买了)
def func():
list = []
for i in range(10000):
ret = list.append('衣服'+i)
return ret
print(func())
买衣服(一件一件的买)
def func():
for i in range(10000):
ret = "衣服"+i
yield ret
g = func() #获取生成器
a = g.__next__()
4.send()与__next__()是一样的,可以获取元素,但是send()还可给上一个yield赋值,send()中必须要有参数,第一个只能为__next__()
def func():
print('小米第一段')
a = yield 123
print('小名第二段')
a = yield 456
print('小张第三段')
a = yield 789
print('小和第四段')
a = yield 000
g = func()
ret = g.__next__()
ret1 = g.send('哈哈哈') 此时,a为'哈哈哈'
5.for迭代
def func():
yield 1
yield 2
yield 3
yield 4
yield 5
for i in func():
print(i)