【问题标题】:Variable as loop's expression变量作为循环的表达式
【发布时间】:2011-02-11 12:29:29
【问题描述】:

假设我有根据输入变化的字符串:

expression=True

expression="a>1"

我怎样才能使用这个变量作为循环的表达式,这样我就不需要重复自己写双循环了。 (并且不使用 eval)?

好吧伪代码:

expression="a<2"
a=1
while expression:
    print a,
    a+=0.1

会打印出类似的东西: 1 1.1 1.2 &lt;...&gt; 1.9

编辑: 不,我不想打印数字,我想动态更改循环条件(表达式)。

有效的代码:

a="b==2"
b=2
while eval(a):
    //do things.

【问题讨论】:

  • 我不知道你在说什么(“循环的表达”?!?)。想更具体一点,包括伪代码示例等?
  • “我不需要重复自己写双循环”?这是什么意思?请提供一个您重复自己的“双循环”示例。

标签: python variables loops expression


【解决方案1】:

示例代码:

somevar = 3
expression = lambda: somevar < 5
while expression():
    ...
    if continue_if_even:
        expression = lambda: (somevar % 2) == 0
    ...

也许使用lambda 可能是您的问题的解决方案。而且它比使用eval 更好(更优雅、更无错误、更安全)。

当然,有一些非常特殊的情况仍然需要eval

【讨论】:

  • 哦!十分感谢!这是我需要的。
  • +1 用于读心术。另请注意,它可以参数化(否则它可能会在关闭/不同的定义范围启动时产生意外结果)并且def(即完全成熟的函数)也可以正常工作(并且对于更大的代码块)。
【解决方案2】:

您在询问如何运行用户输入。答案是eval(或者 - 不是在这里,但通常是 - exec)。当然,这是一个糟糕的答案,但这是唯一的答案。如果唯一的答案是错误的,那么问题就是错误的。

真正想做什么?很少有程序(尤其是编程语言实现)需要赋予用户这么大的权力。你的可能没有。您可以在不运行用户输入的情况下做您想做的事情。但我们需要知道您想提出可行的替代方案。

【讨论】:

  • 我已经知道 eval,但正如其所说,由于某些原因我不能或不想使用它。
  • @nagisa:我知道。但这是您提出的问题的唯一答案(“如何将字符串作为代码运行?”)。您需要将要求缩小到“我将 x 和 y 作为用户输入,我该如何处理 z?”。或者,如果你真的想运行 abritary 用户输入 - 好吧,那就是 eval,不管你喜不喜欢。
  • eval 是唯一的解决方案,但它很糟糕。至少使用eval(userinput, {'__builtins__': None})
【解决方案3】:

您似乎想动态更改循环的条件,但您没有提供一个很好的用例,所以很难理解为什么。如果您只想打印 1 到 1.9 之间的数字,增量为 0.1,有一些简单的方法可以做到这一点:

for x in xrange(10):
  print "1.%d" % i

是一个。不需要这种动态表达魔法。此外,您似乎希望同一个值 (a) 同时具有两种截然不同的含义,即要打印的值和控制要打印多少值的表达式。这可能是一些混乱的根源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多