Python函数进阶


函数进阶

高阶函数

在函数式编程中,可以把函数当作变量⼀样自由使用。⼀个函数接收另⼀个函数作为参数,这种函数称之为高阶函数(Higher-order Functions)。

image-20211215093327344

image-20211215093349052

image-20211215093414954

编写自己的高阶函数

image-20211215093509294

匿名函数 lambda

  • 只用一次
  • 让代码更简洁

在Python中,如果一个函数的函数体非常简单,我们可以使用lambda来创建匿名函数。例如,求某数的n次方的函数,可以这样定义:

power = lambda a,n:a**n

让代码变得更简洁

image-20211215093824660

image-20211215093913988

函数式编程

image-20211215093554407

函数 map :映射序列

image-20211215093717413

使用匿名函数

image-20211215094218060

image-20211215094236711

image-20211215094254402

image-20211215094306487

image-20211215094328569

递归函数

image-20211215094457677

递归方法是指在程序中不断反复调用自身来求解问题的方法。这里强调的重点是调用自身,所以需要等待求解的问题能够分解为相同问题的一个子问题。这样通过多次递归调用,便可完成求解。 递归方法的具体实现过程一般通过函数(或子过程)来完成。在函数(或子过程)的内部,编代码直接或者间接地调用函数(或子过程)自身,即可完成递归操作。这种函数也称为“递归函数”。 在递归函数中,主调函数同时又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。

image-20211215094616910

image-20211215094631293

image-20211215094644133

image-20211215094709184

image-20211215094733990

变量的作用域

image-20211215094841856

image-20211215094856367

image-20211215094908394

image-20211215094939852

生成器

生成器是由函数+yield关键字创造出来的写法,在特定情况下,用他可以帮助我们节省内存。

  • 生成器函数,但函数中有yield存在时,这个函数就是生产生成器函数。
    def func():
        print(111)
        yield 1
    def func():
        print(111)
        yield 1

        print(222)
        yield 2

        print(333)
        yield 3

        print(444)
  • 生成器对象,执行生成器函数时,会返回一个生成器对象。
    def func():
        print(111)
        yield 1

        print(222)
        yield 2

        print(333)
        yield 3

        print(444)

    data = func()

    # 执行生成器函数func,返回的生成器对象。
    # 注意:执行生成器函数时,函数内部代码不会执行。
    def func():
        print(111)
        yield 1

        print(222)
        yield 2

        print(333)
        yield 3

        print(444)

    data = func()

    v1 = next(data)
    print(v1)

    v2 = next(data)
    print(v2)

    v3 = next(data)
    print(v3)

    v4 = next(data)
    print(v4)  # 结束或中途遇到return,程序爆:StopIteration 错误
    data = func()

    for item in data:
        print(item)

生成器的特点是,记录在函数中的执行位置,下次执行next时,会从上一次的位置基础上再继续向下执行。

应用场景

  • 假设要让你生成 300w个随机的4位数,并打印出来。

    • 在内存中一次性创建300w个
    • 动态创建,用一个创建一个。
    import random

    val = random.randint(1000, 9999)
    print(val)
    import random

    data_list = []
    for i in range(300000000):
        val = random.randint(1000, 9999)
        data_list.append(val)

    # 再使用时,去 data_list 中获取即可。
    # ...
    import random


    def gen_random_num(max_count):
        counter = 0
        while counter < max_count:
            yield random.randint(1000, 9999)
            counter += 1


    data_list = gen_random_num(3000000)
    # 再使用时,去 data_list 中获取即可。