如何做到的变量内部分配一个,同时(表达)环蟒蛇?
-
23-08-2019 - |
题
我已经变量分配,以便回返的分配的价值和比较到一个空串,直接在同时循环。
这里是我怎么做它在PHP:
while((name = raw_input("Name: ")) != ''):
names.append(name)
我想要做的就是相同的,这在功能:
names = []
while(True):
name = raw_input("Name: ")
if (name == ''):
break
names.append(name)
是否有任何方法来做到这一蟒蛇?
解决方案
from functools import partial
for name in iter(partial(raw_input, 'Name:'), ''):
do_something_with(name)
或者,如果你想有一个列表:
>>> names = list(iter(partial(raw_input, 'Name: '), ''))
Name: nosklo
Name: Andreas
Name: Aaron
Name: Phil
Name:
>>> names
['nosklo', 'Andreas', 'Aaron', 'Phil']
其他提示
可以包裹raw_input()
把它变成一个发生器:
def wrapper(s):
while True:
result = raw_input(s)
if result = '': break
yield result
names = wrapper('Name:')
这意味着我们回到原点但具有更复杂的代码。所以,如果你需要用现有的方法,则需要使用 nosklo 的做法。
没有,对不起。这是一个常见问题解答,解释说好在这里:
在 Pydocs, , 弗雷德里克*Lundh的博客.
原因不允许在分配蟒蛇的表情是一个共同的、难以发现的错误中那些其他语言。
许多替代品已经提出了建议。大多数是黑客的节省一些打字但使用任意的或隐晦的语法或者关键词,并没有简单的标准语言变化的建议:它应该直观表明的适当意义的人的读者尚未被引入到建设。
一个有趣的现象是,经验最丰富的蟒蛇的程序员承认
while True
成语,似乎没有缺失的分配中表达的构建;这是仅有新来者表达的强烈愿望添加这一语言。还有一种替代方式的拼写这似乎有吸引力:
line = f.readline() while line: ... # do something with line... line = f.readline()
我只有7旬,但还有另一种解决方案。这不是我能想到的最好的解决方案,但它强调了一个令人感兴趣的应用StopIteration异常的。您可以为块做类似的循环读取文件/插座和处理超时和诸如此类的东西很好。
names=[]
try:
while True:
f = raw_input()
if not f:
raise StopIteration
else:
names.append(f)
except StopIteration:
pass
print names
names = []
for name in iter(lambda: raw_input("Name: "), ''):
names.append(name)
PEP 572 提出的赋值表达式强>并已被接受。与Python 3.8开始,你就可以这样写:
while name := input("Name: "):
names.append(name)
引述语法和语义部分该PEP一些多个示例:
# Handle a matched regex
if (match := pattern.search(data)) is not None:
# Do something with match
# A loop that can't be trivially rewritten using 2-arg iter()
while chunk := file.read(8192):
process(chunk)
# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]
# Share a subexpression between a comprehension filter clause and its output
filtered_data = [y for x in data if (y := f(x)) is not None]
不隶属于 StackOverflow