我们可以有一个条件的任务吗?
是否有可能在一个条件的任务?
例如。
if (a=some_func()): # Use a
为什么不试试呢?
>>> def some_func(): ... return 2 ... >>> a = 2 >>> if (a = some_func()): File "<stdin>", line 1 if (a = some_func()): ^ SyntaxError: invalid syntax >>>
所以不行。
不,BDFL不喜欢这个function。
Guido van Rossum,“仁慈的生命的独裁者”,从我所坐的地方,努力保持Python的简单性,我们可以狡辩他做出的一些决定 – 我宁愿他说'不'但是事实上,没有一个devisePython的委员会,而是一个基于优点的值得信赖的“顾问委员会”,通过一位devise师的敏感度进行筛选,已经产生了一种不错的语言,恕我直言。
http://docs.python.org/tutorial/datastructures.html
请注意,在Python中,与C不同,赋值不能在expression式内发生。 C程序员可能会为此感到抱怨,但它避免了C程序遇到的一类常见问题:当= ==时,在expression式中键入=。
另见:
http://effbot.org/pyfaq/why-can-ti-use-an-assignment-in-an-expression.htm
不是直接的,根据我的这个旧的配方 – 但作为配方说,很容易build立语义的等价物,例如,如果你需要直接从C编码的参考algorithm音译(重构之前,更当然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
顺便说一句,非常习惯性Pythonicforms为您的具体情况,如果你确切知道什么falsish值somefunc
可能会返回当它返回一个错误值(例如0
),是
for a in iter(somefunc, 0): # use a
所以在这个特定的情况下,重构将是非常简单的;-)。
如果回报可能是任何forms的虚假价值(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
在Python中,赋值是一个语句,而不是expression式。
其中一个原因是在作业条件非法的情况下,更容易犯错误并分配正确或错误:
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)