零基础入门学习Python P22-23 lambda、递归

86 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

P22 lambda

Python允许lambda来命名匿名函数。

作用:剩下定义函数的世界,让代码更精简。对一下只会用到一两次的函数,就不用考虑命名。简化代码的可读性,不需要跳很远看函数定义。 使用: 原函数: def f(x): retuen 2 * x + 1 可以改成 lambda x: 2 * x + 1 调用时:y = lambda x: 2 * x + 1 此时y的类型是一个函数。

image.png 像是一个简洁的,没有函数名的函数。

参数可以是多个的

image.png

两个牛逼的BIF

filter 过滤器

默认返回迭代器中的True值,筛掉False。 迭代器可以是list、tuple等 调用方法: 1、默认过滤:filter(None,list),返回一个迭代器,可以用list转换 2、自定义过滤,先定义函数,然后 filter(自定义函数名,list)

image.png

可以结合lambda函数一起使用 image.png

map 映射

将迭代器中的值一一传入函数,将函数结果集合成一个新的迭代器。 map(函数名,list)

image.png

map可以传多个参数

课后作业

  1. 请使用lambda表达式将下边函数转变为匿名函数? def fun_A(x, y=3): return x * y

lambda x,y=3: x*y

image.png

  1. 请将下边的匿名函数转变为普通的屌丝函数? lambda x : x if x % 2 else None

def fun(x): if x % 2: return x else: return none

  1. 感受一下使用匿名函数后给你的编程生活带来的变化? 小函数变的非常灵活

  2. 你可以利用filter()和lambda表达式快速求出100以内所有3的倍数吗? list(filter(lambda x: x if x % 3 == 0 else None, range(1,101)))

image.png

  1. 还记得列表推导式吗?完全可以使用列表推导式代替filter()和lambda组合,你可以做到吗?

l = [x for x in range(10) if x %2 == 0] 第三题: l = [x for x in range(1,101) if x % 3 == 0]

image.png

  1. 还记得zip吗?使用zip会将两数以元祖的形式绑定在一块,例如: list(zip([1, 3, 5, 7, 9], [2, 4, 6, 8, 10])) [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]

但如果我希望打包的形式是灵活多变的列表而不是元祖(希望是[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]这种形式),你能做到吗?(采用map和lambda表达式)

list(map(lambda x: [x[0],x[1]], list(zip([1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))))

image.png

list(map(lambda x, y : [x, y], [1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))

image.png

  1. 请目测以下表达式会打印什么? def make_repeat(n): return lambda s : s * n

double = make_repeat(2) print(double(8)) print(double('FishC'))

16 FishCFishC

递归

递归属于算法范畴,即函数调用自身。 汉诺塔游戏。 Python3 递归深度默认100层,是一种保护措施递归深度可以用以下语句修改:

import sys sys.setrecursionlimit(层数) sys.getrecursionlimit() #查询当前递归层数

RecursionError: maximum recursion depth exceeded in comparison 此报错说明递归超出限制层数。

不建议深度修改太大。

求阶乘

def jc(x):
    if x == 1 :
        return x
    else:
        return x * jc(x-1)

jc(6)

image.png

写递归注意写终止,否则容易陷入死循环,浪费时间。 递归最好代码简洁精炼,尽可能减少空间使用,节省空间。

课后作业

  1. 递归在编程上的形式是如何表现的呢? 自己调用自己

  2. 递归必须满足哪两个基本条件?

  3. 思考一下,按照递归的特性,在编程中有没有不得不使用递归的情况? 没有,递归都可以转为迭代,即for、while循环

  4. 用递归去计算阶乘问题或斐波那契数列是很糟糕的算法,你知道为什么吗? 浪费空间

  5. 请聊一聊递归的优缺点(无需官方陈词,想到什么写什么就可以) 优点:跟数学结合紧密,更容易理解 缺点:浪费空间,写的不好容易死循环

  6. 拿手机拍一张“递归自拍照片”

动动手:

  1. 使用递归编写一个 power() 函数模拟内建函数 pow(),即 power(x, y) 为计算并返回 x 的 y 次幂的值。
def power(x,y):
    def pow(y):
        if y == 1 :
            return x
        else:
            return x * pow(y-1)
    return pow(y)

power(2,5)

image.png

  1. 使用递归编写一个函数,利用欧几里得算法求最大公约数,例如 gcd(x, y) 返回值为参数 x 和参数 y 的最大公约数。

见乐扣