Переменная как выражение цикла - PullRequest
0 голосов
/ 11 февраля 2011

Допустим, у меня есть строка, которая изменяется в зависимости от ввода:

expression=True

или

expression="a>1"

Как я могу использовать эту переменную в качестве выражения цикла таким образом, чтобы мне не нужно было повторять запись двойного цикла (и без использования eval)?

Хорошо, псевдокод:

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

напечатает что-то вроде этого: 1 1.1 1.2 <...> 1.9

EDIT: Нет, я не хочу печатать числа, я хочу динамически изменять условие цикла (выражение).

код, который работает:

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

Ответы [ 3 ]

4 голосов
/ 11 февраля 2011

Вы спрашиваете, как запустить пользовательский ввод. Ответ eval (или - не здесь, но обычно - exec). Конечно, это плохой ответ, но это единственный ответ. И если единственный ответ плохой, вопрос плохой.

Что вы действительно пытаетесь сделать? Есть несколько программ (в частности, реализации на языке программирования), которые должны дать пользователю столько возможностей. Ваш, вероятно, нет. Скорее всего, вы можете делать то, что вы хотите, без запуска пользовательского ввода. Но нам нужно знать, что вы пытаетесь предложить, чтобы предложить жизнеспособные альтернативы.

4 голосов
/ 11 февраля 2011

Пример кода:

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

Возможно, использование lambda может стать решением вашей проблемы.И это намного лучше (более элегантно, без ошибок, более безопасно), чем использование eval.

Конечно, есть некоторые очень особые случаи, когда eval все еще необходим.

0 голосов
/ 11 февраля 2011

Кажется, вы хотите динамически изменить условие цикла, но вы не предоставляете очень хороший вариант использования, поэтому трудно понять, почему.Если вы просто хотите напечатать числа от 1 до 1,9 с шагом 0,1, есть простой способ сделать это:

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

- это один.Там нет необходимости для этого динамического выражения магии.Кроме того, вы, похоже, хотите, чтобы одно и то же значение (a) имело два совершенно разных значения одновременно: и значение для печати, и выражение, управляющее количеством значений для печати.Возможно, это источник некоторой путаницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...