QQ:3020889729 小蔡
函数返回值涉及的关键字
return关键字
含义/用法:返回或中断
用途 | 含义 |
---|---|
返回单个数据 | 直接返回该数据类型的对象(比如reutrn 0 # 意味着返回整型对象(也可以返回list等数据)) |
返回多个数据 | 直接返回包含所有数据的元组(比如reutrn 0, 1 # 意味着返回二元元组对象) |
用于中断程序 | 直接返回None——形式:return None 或者 return |
含义/用法:yield返回的是一个生成器对象——然后通过__next__方法获取一个数据,再次调用__next__获取下一个数据——返回的对象是可迭代的,迭代通过__next__实现
用途 | 含义 |
---|---|
返回数据 | 直接返回该数据的一个生成器对象 |
补充说明 | 可以使用生成器对象下的__next__()方法读取生成器下当前的返回值 |
具体实现下,yield的运行本质是首先开始返回一个生成器对象,然后暂停关于yeild部分的函数内容,直到使用了__next__方法后,才会继续yield部分函数的运行,然后得到一个数据并返回,接着又暂停,进而反复运行,直到yield的部分彻底运行结束(也就是不再返回任何值)。如果已经没有需要返回的数据了,再使用__next__会发出错误。
yield的实现展示(代码+gif) 代码实例'''为了理解yield实际的工作路径,采用调试的方法来看一下
其次,我们是用一个for循环来比较它与return的区别之处
'''
def text_func_return(in_num):
'''采用for循环得到一个阶乘的每一项的列表——return
'''
results = [] # 列表输出多个数据,如果是采用return x1, x2, x3返回的数据会打包成元组
for i in range(1, in_num+1):
results.append((i*1))
return results
def text_func_yield(in_num):
'''采用for循环输出一个阶乘的每一项——yield
'''
for i in range(1, in_num+1):
yield i
if __name__ == "__main__":
input_data = int(input('请输入一个阶乘最高项: '))
print(text_func_return(input_data))
iters_elem = text_func_yield(input_data)
print(iters_elem.__next__()) # 打印第一次yield返回的数据
print(iters_elem.__next__()) # 打印第二次yield返回的数据
输出结果:
请输入一个阶乘最高项: 5
[1, 2, 3, 4, 5]
1
2
首先在打印yield返回的生成器的值的每一个print处打上断点,然后进入debug模式,进行调试。
然后输入阶乘项,进入调试窗口部分,默认运行到断电处停下载——当点击下一步——才可以看到程序一步步的向下运行,直到结束。
(下面就是debug生成器的效果:每调用一次__next__,yield方才返回一个实际的数据(一开始只是返回了一个生成器对象,只有对生成器对象使用__next__方法才会开始返回具体的数据))
这里作为对yield返回数据的复习——首先返回的是一个生成器对象,然后每一次使用方法返回的是原数据。
就用上边的代码——实现数据类型的判断。
'''为了理解yield实际的工作路径,我们采用调试的方法来看一下
其次,我们用一个for循环,看看它与return的区别之处
'''
def text_func_return(in_num):
'''采用for循环得到一个阶乘的每一项的列表——return
'''
results = []
for i in range(1, in_num+1):
results.append((i*1))
return results
def text_func_yield(in_num):
'''采用for循环输出一个阶乘的每一项——yield
'''
for i in range(1, in_num+1):
yield i
if __name__ == "__main__":
input_data = int(input('请输入一个阶乘最高项: '))
print(text_func_return(input_data))
iters_elem = text_func_yield(input_data)
# print(iters_elem.__next__()) # 打印第一次yield返回的数据
# print(iters_elem.__next__()) # 打印第二次yield返回的数据
print(type(iters_elem)) # yield一开始返回的iters_elem的数据类型
print(type(iters_elem.__next__())) # yield返回的数据的类型
print(type(iters_elem.__next__()))
结果:说明输出的数据本身类型没有发生变化——也就是yield返回的数据是单个原始数据
请输入一个阶乘最高项: 5
[1, 2, 3, 4, 5]