对python中return与yield的区别详解

1. return与yield的基本概念

return和yield是Python中两个常用的关键字,用于函数的返回值或生成器的生成内容。

1.1 return关键字

在函数中使用return关键字会立即终止函数的执行,并将return后面的表达式作为函数的返回值返回给调用者。

def add(a, b):

return a + b

result = add(2, 3)

print(result) # 输出5

在上面的例子中,定义了一个名为add的函数,接受两个参数a和b,使用return关键字返回了a和b的和。调用add函数后,返回值被赋值给result变量,并输出结果5。

return关键字用于函数的结束和返回值的传递。

1.2 yield关键字

yield关键字通常用于生成器函数中,在函数中使用yield关键字可以暂停函数的执行,并将yield后面的表达式作为生成器的生成内容返回给调用者。

def generate_numbers():

for i in range(5):

yield i

numbers = generate_numbers()

for number in numbers:

print(number) # 依次输出0、1、2、3、4

在上面的例子中,定义了一个名为generate_numbers的生成器函数,使用yield关键字返回一个范围在0到4的整数序列。调用generate_numbers函数后,返回的是一个生成器对象,通过迭代这个生成器对象可以依次获取生成的数值,并将其打印出来。

yield关键字用于生成器函数的暂停和生成内容的返回。

2. return与yield的区别

return和yield关键字在使用方法和作用上有一些不同。

2.1 函数类型

return关键字只能用于普通函数,即定义时使用def语句创建的函数。而yield关键字只能用于生成器函数,即定义时使用def语句创建的带有yield表达式的函数。

def foo():

return 1

def bar():

yield 2

print(type(foo)) # <class 'function'>

print(type(bar)) # <class 'generator'>

上面的例子中,通过type函数可以查看函数类型。foo函数只使用了return关键字,因此它是一个普通函数;而bar函数带有yield关键字,因此它是一个生成器函数。

2.2 执行方式

使用return关键字的函数将会一次性执行完所有的代码,并返回一个对象作为结果。

使用yield关键字的生成器函数则是通过进行迭代来逐步执行代码,每次迭代时会执行到yield语句处,返回一个值后暂停执行,下次迭代时会从暂停的位置继续执行。

def generate_numbers():

yield 1

yield 2

yield 3

numbers = generate_numbers()

print(next(numbers)) # 输出1

print(next(numbers)) # 输出2

print(next(numbers)) # 输出3

在上面的例子中,定义了一个生成器函数generate_numbers,使用yield关键字依次返回数字1、2、3。通过调用next函数可以逐步获取生成的数值并将其输出。

2.3 内存占用

使用yield关键字的生成器函数在执行时只会生成当前需要的值,并且生成的值不会一直存储在内存中。

而使用return关键字的函数则会将所有的返回值存储在内存中,当返回的对象很大时可能会占用较多的内存空间。

def generate_numbers():

for i in range(1000000):

yield i

numbers = generate_numbers()

print(next(numbers)) # 输出0

print(next(numbers)) # 输出1

在上面的例子中,定义了一个生成器函数generate_numbers,通过yield关键字生成了一个范围在0到999999的整数序列。通过迭代生成器对象可以逐步获取生成的数值,并且每次只会生成一个数值,不会占用较大的内存空间。

3. 结论

return和yield是Python中常用的关键字,用于函数的返回值或生成器的生成内容。

return关键字用于普通函数,会一次性执行完函数中的代码,并返回一个对象作为结果。

yield关键字用于生成器函数,通过进行迭代来逐步执行代码,每次迭代时会执行到yield语句处,并返回一个值后暂停执行。

使用yield关键字的生成器函数在执行时只会生成当前需要的值,并且生成的值不会一直存储在内存中,节省内存空间。

使用return关键字的函数会将所有的返回值存储在内存中,可能会占用较多的内存空间。

根据具体的需求选择合适的关键字来实现函数的返回或生成器的生成内容。

后端开发标签