生成器是一个自定义的迭代器,本质上是一个迭代器,内置有.__ iter__ () 和. __ next__()python
相同点:返回值的个数都是无限制的函数
不一样点:return只能返回一次,函数便终止执行后续代码,yield能够屡次使用,让函数执行暂停,下次调用从上次暂停位置继续执行,直到从新遇到yield再次被暂停code
def func(): print("函数体代码") yield yield 2 yield 3, 4, '5', '6' # yield返回多个值也是默认返回成元组,可修改为其余的类型返回出去 yield ['7', 8, 9] # 正常执行不会执行函数体代码 # res是一个迭代器,若是不赋值给res会重复执行第一个yield res = func() # 当咱们经过__next__取值时,才会执行函数体代码。 # res.__next__() # 执行函数体代码,获得返回值none但没打印返回值,因此没有 print(res.__next__()) # yield能够保存函数的暂停状态,下次在上次基础上执行直到遇到下次yield print(res.__next__()) print(res.__next__()) # print(res.__next__()) # StopIteration报错 >>> 函数体代码 None 2 (3, 4, '5', '6') # next(迭代器对象)至关于迭代器对象.__next__() next(res) # 执行函数体代码,获得返回值none但没打印返回值,因此没有 print(next(res)) print(next(res)) print(next(res)) >>> 函数体代码 2 (3, 4, '5', '6') ['7', 8, 9] # 若是不报错想自动执行 while True: try: print(next(res)) except StopIteration: break
自定义range,实现range功能对象
def my_range(start,end,move=1): while start < end: yield start start += move for i in my_range(1,5): print(i) >>> 1 2 3 4 for i in my_range(1,6,2): print(i) >>> 1 3 5