python - 如果我在函数中添加“else”,为什么会得到一个空列表?
问题描述
如果我执行这段代码,我会得到一个空列表:
#quick.py
def test(key):
print('the input key is:',key)
if key==1:
return range(1,13)
else:
month = ['15','30']
for i in range(1,53):
if i==4:
yield '2904'
else:
str_i = str(i)
if i<10:
str_i= '0'+str_i
yield month[0] + str_i if i % 2 else month[1] + str_i
my_list = list(test(1))
print('the list is :' ,my_list)
pc@pc-host:~/Git/PasivicSerious$ python3 quick.py
the input key is: 1
the list is : []
但是没有“ else ”,我得到了我想要的列表:
def test(key):
print('the input key is:',key)
if key==1:
return range(1,13)
# else:
# month = ['15','30']
# for i in range(1,53):
# if i==4:
# yield '2904'
# else:
# str_i = str(i)
# if i<10:
# str_i= '0'+str_i
# yield month[0] + str_i if i % 2 else month[1] + str_i
my_list = list(test(1))
print('the list is :' ,my_list)
pc@pc-host:~/Git/PasivicSerious$ python3 quick.py
the input key is: 1
the list is : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
为什么会发生这种情况,我对生成器有什么误解?
解决方案
使用yield
关键字,您实际上是在创建一个“生成器”而不是一个函数。正如您在此链接中看到的,(PEP-380 https://www.python.org/dev/peps/pep-0380/)在生成器中,该语句return value
在语义上等同于raise StopIteration(value)
. 关键是,如果你想创建一个函数或一个生成器,不要混用yield
和return
关键字。
可能的修改:更改第一个if
语句的结果,使其不使用return
关键字,即使用yield
并手动实现范围调用。
推荐阅读
- c - 如何通过查看行中的属性之一来对 c 中的文件的行进行排序?
- macos - 在 Mac vim 上,如何将光标更改为闪烁块?
- ios - UIViewControllerAnimatedTransitioning 在进出视图动画时显示黑屏
- javascript - 加载(刷新)页面后如何在 Dropzone 中显示之前上传的文件如何在图片中显示?
- java - 在java中设置为构造函数参数
- python - 在 Django 中自动更改值
- excel - 使用多个列中的多个 OR 标准评估计数总和
- html - 如果图像不可用,HTML 如何发布 null 或测试说“找不到图像”
- api - 队列 PNR 返回“NO PNR IN AAA”(QueuePlaceLLSRQ)
- json - 如何使用下面的类动态地从 Web 服务读取下面给出的 JSON 数据,并希望创建接收到的数据的水平列表视图