递归函数
在定义的函数内,调用该函数
def fib(n):
"""
:type n: int
:rtype: int
"""
while (n > 0):
if (n == 1 or n == 2):
return 1
else:
return fib(n - 1) + fib(n - 2)
return 0
print(fib(3))
def jiecheng(n):
if n == 1:
return 1
else:
return n*jiecheng(n-1)
print(jiecheng(2))
回调函数
函数A中使用函数作为参数,且调用了该函数参数
def love():
print('123')
def func(f):
print(f,type(f))
f()
func(love)
闭包函数
函数A中返回值为A中的内函数, 并且该内函数使用了A中局部变量。内函数就是闭包函数
特点
- 内函数使用了外函数中定义的局部变量
- 外函数返回值为内函数,返回的内函数就是闭包函数
- 用于保护外函数中的局部变量,既可以使用,又不会被外界破坏
- 使用
函数名.__closure__ 检测是否为闭包函数 如果是闭包函数返回 cell
def person():
money = 0
def work():
nonlocal money
money += 100
print(money)
return work
res = person()
匿名函数 lambda 表达式
使用lambda表达式定义匿名函数 lambda 参数1,参数2… : 返回值
- lambda表达式不是一个代码块,又称为一行代码的函数
- lambda表达式只能访问自己的形参
def jia(x,y):
return x+y
print(jia(2,3))
res = lambda x,y:x+y
print(res(4,4))
res = lambda sex:"很man" if sex=='男' else "很nice"
print(res('女'))
迭代器
可迭代对象可以转化为迭代器对象,从第一个元素从前往后遍历,直到集合中的所有元素被访问完毕
iter()
功能:把可迭代的对象,转为一个迭代器对象 参数:只能是可迭代的对象 (字符串,列表,元组,字典) 返回值: 迭代器对象 注意:迭代器一定是一个可以迭代的对象,但是可迭代对象不一定是迭代器
next()
next()函数可以去调用迭代器,并返回迭代器中的下一个数据
迭代器的取值方案
- next() 调用一次获取一次,直到数据被取完
- list() 使用list函数直接取出迭代器中的所有数据
- for 使用for循环遍历迭代器的数据
r = ['张三','李四','王五','二麻子']
'''
1. next() 调用一次获取一次,直到数据被取完
2. list() 使用list函数直接取出迭代器中的所有数据
3. for 使用for循环遍历迭代器的数据
'''
res = iter(r)
for i in res:
print(i)
迭代器取值特点,取一个少一个,直到都取完,最后再获取就会报错
检测迭代器和可迭代对象的方法
迭代器一定是可迭代的对象,可迭代的对象不一定是迭代器
from collections.abc import Iterator,Iterable
varstr = '123456'
res = iter(varstr)
r1 = isinstance(varstr,Iterable)
r2 = isinstance(varstr,Iterator)
r3 = isinstance(res,Iterable)
r4 = isinstance(res,Iterator)
print(r1,r2)
print(r3,r4)
|