我正在尝试编写一个程序来简化经典的饮酒歌曲,Python解释器表现得非常奇怪。
我的代码是:
def lines():
bottles = 99
while bottles > 0:
yield str(bottles) + ' bottles of pop on the wall!'
yield str(bottles) + ' bottles of pop!'
yield 'Take one down and pass it around!'
bottles -= 1
yield str(bottles) + ' bottles of pop on the wall!'
yield ''
def sing():
for line in lines():
print(line)
这是从Linux命令行按预期运行的;它可能会打印出“1瓶流行音乐”,但它确实能满足我的需求。
然而,从JetBrains中的“Python控制台”,我得到了几个排列:
>>> ninetynine.sing()
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "C:\Users\chris\PycharmProjects\untitled\ninetynine.py", line 10, in sing
for line in lines():
TypeError: 'function' object is not iterable
我试着用稍微不同的方式调用它,然后得到了:
>>> for line in ninetynine.lines():
... print(line)
99 bottles of pop on the wall!
99 bottles of pop!
Take one down and pass it around!
98 bottles of pop on the wall!
>>>
我还没有管理的是让它像一个循环运行的生成器。
我可以或应该做些什么来从PyCharm获得正确的REPL行为?
- UPDATE -
有一些愚蠢的缓存正在进行中。
我重新键入了.py文件,但输入了最后一个yield statemest,
yield str(bottles + ' bottles of pop on the wall!')
这给出了明显的错误,所以我更改了源文件并保存了:
yield str(bottles) + ' bottles of pop on the wall!
我从REPL重新导入bottles
后报告了完全相同的错误,只有它指向的行是我正确的bottle.py行,现在正确放置了)
在bottles
之后。
所以有一些脏缓存正在进行中;我认为源代码无法重新编译或类似的东西。
是否有“make clean”选项,或者更好的是,如果源文件比编译的表单更新,或者根本不保存字节码,那么将重新编译的设置?
答案 0 :(得分:2)
您是在控制台中导入文件吗?
ninetynine.py:
{{1}}
pycharm - &gt;工具 - &gt; python控制台...
{{1}}
对我来说很好。