函数进阶
高阶函数
在函数式编程中,可以把函数当作变量⼀样自由使用。⼀个函数接收另⼀个函数作为参数,这种函数称之为高阶函数(Higher-order Functions)。
编写自己的高阶函数
匿名函数 lambda
- 只用一次
- 让代码更简洁
在Python中,如果一个函数的函数体非常简单,我们可以使用lambda来创建匿名函数。例如,求某数的n次方的函数,可以这样定义:
power = lambda a,n:a**n
让代码变得更简洁
函数式编程
函数 map :映射序列
使用匿名函数
递归函数
递归方法是指在程序中不断反复调用自身来求解问题的方法。这里强调的重点是调用自身,所以需要等待求解的问题能够分解为相同问题的一个子问题。这样通过多次递归调用,便可完成求解。 递归方法的具体实现过程一般通过函数(或子过程)来完成。在函数(或子过程)的内部,编代码直接或者间接地调用函数(或子过程)自身,即可完成递归操作。这种函数也称为“递归函数”。 在递归函数中,主调函数同时又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
变量的作用域
生成器
生成器是由函数+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 中获取即可。