7 ответов:
почему бы не попробовать?
>>> def some_func(): ... return 2 ... >>> a = 2 >>> if (a = some_func()): File "<stdin>", line 1 if (a = some_func()): ^ SyntaxError: invalid syntax >>>Так, нет.
нет, BDFL не понравилась эта функция.
с того места, где я сижу, Гвидо ван Россум, "доброжелательный диктатор на всю жизнь", изо всех сил боролся за то, чтобы питон был настолько простым, насколько это возможно. Мы можем спорить с некоторыми решениями, которые он принял - я бы предпочел, чтобы он говорил " Нет " чаще. Но тот факт, что не было комитета, разрабатывающего Python, а вместо этого доверенный "консультативный совет", основанный в основном на заслугах, фильтруя через один чувствительность конструктора, производила чертовски хороший язык, ИМХО.
http://docs.python.org/tutorial/datastructures.html
обратите внимание, что в Python, в отличие от C, назначение не может произойти внутри выражения. C программисты могут ворчать об этом, но он избегает общего класс проблем, возникающих в связи с программы: ввод = в выражении когда = = было задумано.
также смотрите:
http://effbot.org/pyfaq/why-can-t-i-use-an-assignment-in-an-expression.htm
не напрямую, в это мой старый рецепт -- но, как говорится в рецепте, легко построить семантический эквивалент, например, если вам нужно транслитерировать непосредственно из C-кодированного ссылочного алгоритма (перед рефакторингом на более идиоматический Python, конечно; -). То есть:
class DataHolder(object): def __init__(self, value=None): self.value = value def set(self, value): self.value = value; return value def get(self): return self.value data = DataHolder() while data.set(somefunc()): a = data.get() # use aкстати, очень идиоматическая Питоническая форма для вашего конкретного случая, если вы точно знаете, какое ложное значение
somefuncможет вернуться, когда он возвращает ложное значение (например,0), этоfor a in iter(somefunc, 0): # use aтак что в этом конкретном случае рефакторинг будет довольно легко; -).
если возвращение может быть любой вид ложного значения (0,
None,'', ...), одна возможность:import itertools for a in itertools.takewhile(lambda x: x, iter(somefunc, object())): # use aно вы можете предпочесть простой пользовательский генератор:
def getwhile(func, *a, **k): while True: x = func(*a, **k) if not x: break yield x for a in getwhile(somefunc): # use a
одна из причин, почему назначения являются незаконными в условиях, что это легче сделать ошибку и назначить True или False:
some_variable = 5 # This does not work # if True = some_variable: # do_something() # This only works in Python 2.x True = some_variable print True # returns 5в Python 3 True и False являются ключевыми словами, поэтому больше нет риска.
вы можете определить функцию, чтобы сделать назначение для вас:
def assign(name, value): import inspect frame = inspect.currentframe() try: locals_ = frame.f_back.f_locals finally: del frame locals_[name] = value return value if assign('test', 0): print("first", test) elif assign('xyz', 123): print("second", xyz)
Comments