递归与匿名函数
1、内置高阶函数
# 1.map()函数
# 计算列表中每个数的平方
li = [1, 2, 3, 4, 5, 6]
def pingfan(x):
return x ** 2
print(map(pingfan, li), type(map(pingfan, li)))
# <map object at 0x0000021BC0546B00> <class 'map'>
result = map(pingfan, li)
# for i in result:
# print(i)
# 容器类型转换
print(list(result)) # 如先遍历完了map对象,再输出会为空列表
# [1, 4, 9, 16, 25, 36]
# 2.filter()函数
# 在一个list中,删掉偶数,只保留奇数
def is_odd(n):
return n % 2 == 0 # 判断是否奇数还是偶数
print(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])) # <filter object at 0x000001E098B46B60>
print(list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))) # [2, 4, 6, 10]
# 3.reduce()函数 需要导入对应的库
from functools import reduce # 内置库 是安装好python 然后自己携带上的 不用安装
# reduce 可以用来 累乘 累加
def fn(x, y):
return x * y
res = reduce(fn, [1, 3, 5, 7, 9])
print(res) # 返回的是一个具体的值 不是一个可迭代对象
# 945
2、递归
# 自己调用自己
# 应用场景 重复的去执行某个动作 循环 递推
"""
递推加回归的例子
b ** 4 = 9
求b
b**2 作为一个变量 x = b**2 = 3 根号3
x**2 = 9 x= 3
"""
# 用正向递推的方式计算阶乘 5! = 5*4*3*2*1
def adc(n):
result = 1
for i in range(1, n + 1):
print(i)
result *= i
return result
print(adc(5))
# 递归 重点学习逻辑
# 递归是自己调用自己 需要设置出口 函数的参数改变来设置
def AP(n):
if n == 1:
return 1 # 不再调用自己了
else:
return n * AP(n - 1)
print(AP(5))
# 最终结果 AP(5)
"""
第一次调用 AP(5) = 5 * AP(5 - 1) = 5 * AP(4)
第二次调用 Ap(4) = 4 * AP(4 - 1) = 4 * AP(3)
第三次调用 Ap(3) = 3 * AP(3 - 1) = 3 * AP(2)
第四次调用 Ap(2) = 2 * AP(2 - 1) = 2 * AP(1)
第五次调用 Ap(1) = 1
总体的表达式: AP(5) = 5 * 4 * 3 * 2 * 1
AP(5) # 第 1 次调用使用 5
5 * AP(4) # 第 2 次调用使用 4
5 * (4 * AP(3)) # 第 3 次调用使用 3
5 * (4 * (3 * AP(2))) # 第 4 次调用使用 2
5 * (4 * (3 * (2 * AP(1)))) # 第 5 次调用使用 1
5 * (4 * (3 * (2 * 1))) # 从第 5 次调用返回
5 * (4 * (3 * 2)) # 从第 4 次调用返回
5 * (4 * 6) # 从第 3 次调用返回
5 * 24 # 从第 2 次调用返回
120 # 从第 1 次调用返回
"""
3、匿名函数
def add_(x, y):
return x + y
print(add_(3, 4)) # 7
# 高阶函数
add = lambda x, y: x + y
print(add(3, 4)) # 7
import random # 随机模块
# 1.无参数
sdds = lambda: random.random()
print(sdds()) # 0.8538022937579999
# 2.一个参数
fun1 = lambda x: x
print(fun1('hello python')) # hello python
# 3.默认参数 (缺省参数)
fun2 = lambda a, b, c=100: a + b + c
print(fun2(10, 19)) # 129
# 4.可变参数之args
fun3 = lambda *args: args
print(fun3(1, 2, 3, 4, 5)) # (1, 2, 3, 4, 5)
# 5.可变参数之kwargs
fun4 = lambda **kwargs: kwargs
print(fun4(name='花花', age=20, height='160cm'))
# {'name': '花花', 'age': 20, 'height': '160cm'}
# 6.带判断的lambda表达式
asd = lambda x: x if (x > 10) else 10
print(asd(15)) # 15
# 它是以下带有def和return 关键字的普通函数的更简单版本:
def fun(x):
if x > 10:
return x
else:
return 10
print(fun(5)) # 10
4、列表中字典的排序
# 列表中的字典排序
# 需求:假设我们需要对字典中的年龄进行排序
user_list = [
{"name": "张三", "age": 18},
{"name": "李四", "age": 19},
{"name": "王五", "age": 20}
]
def getAge(elem):
return elem["age"]
# 传递给key参数的是一个函数,它指定可迭代对象中的每一个元素来按照该函数进行排序
user_list.sort(key=getAge, reverse=True)
print(user_list)
# [{'name': '王五', 'age': 20}, {'name': '李四', 'age': 19}, {'name': '张三', 'age': 18}]
# 我们需要使用匿名函数,使用sort函数中的key这个参数,来指定字典比大小的方法
# reverse参数控制升序与降序排列
user_list.sort(key=lambda x: x['age'], reverse=True)
print(user_list)
# [{'name': '王五', 'age': 20}, {'name': '李四', 'age': 19}, {'name': '张三', 'age': 18}]
5、练习:
编写一个 Python 函数,接受一个正整数 n 作为参数,返回斐波那契数列的前 n 个数字。 斐波那契数列是一个数列,其中每个数字都是前两个数字的和,第一个数字是 0,第二个数字是 1,例如: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... 使用递归完成
# 1.正推
li = [0, 1]
for i in range(2, 10):
li.append(li[i - 1] + li[i - 2])
print(li)
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
# 2.递归
def fun(n):
if n == 0 or n == 1:
return n
else:
return fun(n - 1) + fun(n - 2)
# 可以循环输出
# for i in range(10):
# print(fun(i), end=" ")
print(list(map(fun, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])))
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]