一、匿名函数
传统的函数的定义包括了:函数名 + 函数体。
def send_email():
pass
# 1. 执行
send_email()
# 2. 当做列表元素
data_list = [send_email, send_email, send_email ]
# 3. 当做参数传递
other_function(send_email)
匿名函数,则是基于lambda表达式实现定义一个可以没有名字的函数,例如:
data_list = [ lambda x:x+100, lambda x:x+110, lambda x:x+120 ]
print( data_list[0] )
f1 = lambda x:x+100
res = f1(100)
print(res)
基于Lambda定义的函数格式为:lambda 参数:函数体
1.参数,支持任意参数。
lambda x: 函数体
lambda x1,x2: 函数体
lambda *args, **kwargs: 函数体
2.函数体,只能支持单行的代码。
def xxx(x):
return x + 100
lambda x: x + 100
3.返回值,默认将函数体单行代码执行的结果返回给函数的执行者。
func = lambda x: x + 100
v1 = func(10)
print(v1) # 110
def func(a1,a2):
return a1 + a2 + 100
foo = lambda a1,a2: a1 + a2 + 100
匿名函数适用于简单的业务处理,可以快速并简单的创建函数。
练习题
根据函数写写出其匿名函数的表达方式
def func(a1,a2):
return a1 + a2
func = lambda a1,a2: a1+a2
def func(data):
return data.replace("张三","***")
func= lambda data: data.replace("张三","***")
def func(data):
name_list = data.replace(".")
return name_list[-1]
func = lambda data: data.replace(".")[-1]
在编写匿名函数时,由于受限 函数体只能写一行,所以匿名函数只能处理非常简单的功能。
扩展:三元运算
简单的函数,可以基于lambda表达式实现。
简单的条件语句,可以基于三元运算实现,例如:
num = input("请写入内容")
if "你好" in num:
data = "hello"
else:
data = "world"
print(data)
num = input("请写入内容")
data = "hello" if "你好" in num else "world"
print(data)
# 结果 = 条件成立时 if 条件 else 不成立
lambda表达式和三元运算没有任何关系,属于两个独立的知识点。
掌握三元运算之后,以后再编写匿名函数时,就可以处理再稍微复杂点的情况了,例如:
func = lambda x: "大了" if x > 66 else "小了"
v1 = func(1)
print(v1) # "小了"
v2 = func(100)
print(v2) # "大了"
二、生成器(面试常用)
生成器是由函数+yield关键字创造出来的写法,在特定情况下,用他可以帮助我们节省内存。
1. 生成器函数与生成器对象
【1】生成器函数,但函数中有yield存在时,这个函数就是生产生成器函数。
def func():
print(111)
yield 1
def func():
print(111)
yield 1
print(222)
yield 2
print(333)
yield 3
print(444)
【2】生成器对象,执行生成器函数时,会返回一个生成器对象。(函数是不会执行的)
def func():
print(123)
print(123)
yield 1234 # 有点像return,执行到这个位置之后,就不再执行。
print(456)
yield 666 # 有点像return,执行到这个位置之后,就不再执行。
print(789)
# return None # 程序就会报错,生成器中的代码执行完毕了 StopIteration
【1】生成器使用功能方法举例:
data = func()
# 基于for循环执行生成器对象
for item in data:
# 本质为执行next(data)
print(item) #使用for循环最后的return不会报错
【2】生成器原理:
# 执行生成器函数时,函数体默认不会被执行;返回的是一个生成器对象。
v1 = func()
print(v1) # <generator object func at 0x7fd0280f75f0>
# next里面放生成器对象,进入生成器函数并执行其中的代码
n1 = next(v1)
print(n1)
# next里面放生成器对象,进入生成器函数并执行其中的代码(从上次yield返回位置继续向下)
n2 = next(v1)
print(n2)
# next里面放生成器对象,进入生成器函数并执行其中的代码(从上次yield返回位置继续向下)
n3 = next(v1)
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时,会从上一次的位置基础上再继续向下执行。
2.应用场景
【1】假设要让你生成 300w个随机的4位数,并打印出来。
- 在内存中一次性创建300w个
- 动态创建,用一个创建一个。
旧的实现方法:
import random
val = random.randint(1000, 9999)
print(val