于 2020 年 1 月 7 日更新
生成器是用于创建迭代器的函数,因此可以在for循环中使用它。
创建生成器
生成器的定义类似于函数,但只有一个区别,我们使用yield关键字返回用于for循环的每次迭代的值。 让我们看一个示例,其中我们试图克隆 python 的内置range()函数。
def my_range(start, stop, step = 1):if stop <= start:raise RuntimeError("start must be smaller than stop")i = startwhile i < stop:yield ii += steptry:for k in my_range(10, 50, 3):print(k)except RuntimeError as ex:print(ex)except:print("Unknown error occurred")
预期输出:
1013161922252831343740434649
def my_range(start, stop, step = 1):if stop <= start:raise RuntimeError("start must be smaller than stop")i = startwhile i < stop:yield ii += steptry:for k in my_range(10, 50, 3):print(k)except RuntimeError as ex:print(ex)except:print("Unknown error occurred")
my_range()的工作方式如下:
在for循环中,调用my_range()函数,它将初始化三个参数(start,stop和step)的值,并检查stop是否小于或等于start。 i被分配了start的值。 此时,i为10,因此while条件的值为True,而while循环开始执行。 在下一个语句yield中,将控制转移到for循环,并将i的当前值分配给变量k,在for循环打印语句中执行该语句,然后该控件再次传递到函数my_range()内的第 7 行 i递增。 此过程一直重复进行,直到i < stop为止。
