python基础-学习记录day12

106 阅读4分钟

递归与匿名函数

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]