ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Python 生成器 > 原文: [https://thepythonguru.com/python-generators/](https://thepythonguru.com/python-generators/) * * * 于 2020 年 1 月 7 日更新 * * * 生成器是用于创建迭代器的函数,因此可以在`for`循环中使用它。 ## 创建生成器 * * * 生成器的定义类似于函数,但只有一个区别,我们使用`yield`关键字返回用于`for`循环的每次迭代的值。 让我们看一个示例,其中我们试图克隆 python 的内置`range()`函数。 ```py def my_range(start, stop, step = 1):     if stop <= start:         raise RuntimeError("start must be smaller than stop")     i = start     while i < stop:         yield i     i += step try:     for k in my_range(10, 50, 3):         print(k) except RuntimeError as ex:     print(ex) except:     print("Unknown error occurred") ``` **预期输出**: ```py 10 13 16 19 22 25 28 31 34 37 40 43 46 49 ``` ```py def my_range(start, stop, step = 1): if stop <= start: raise RuntimeError("start must be smaller than stop") i = start while i < stop: yield i i += step try: 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`为止。 * * * * * *