2010-04-08 48 views
47

是否可以在條件中進行分配?我們可以在條件下進行任務嗎?

例如,

if (a=some_func()): 
    # Use a 
+5

-1:平凡的自己應答。重複:http://stackoverflow.com/questions/1663995/python-variable-assignment-and-if-statement – 2010-04-09 10:38:32

+1

@ S.Lott不是很微不足道的知道爲什麼,如果它不是一些答案,描述這裏。 – 2017-12-31 06:40:50

回答

66

爲什麼不試試呢?

>>> def some_func(): 
... return 2 
... 
>>> a = 2 
>>> if (a = some_func()): 
    File "<stdin>", line 1 
    if (a = some_func()): 
     ^
SyntaxError: invalid syntax 
>>> 

所以,沒有。

+17

這是故意禁止的,因爲Guido,仁慈的python獨裁者,發現他們沒有必要,而且比有用的更混亂。沒有後增或前增操作符(++)的原因是一樣的。 – 2010-04-08 22:53:36

+4

他確實允許在2.0中增加*增加的assigment *,因爲'x = x + 1'需要額外的查找時間,而'x + = 1'的速度稍快,但我確信他甚至不喜歡* *很多。 :-) – wescpy 2010-04-08 23:56:53

4

編號在Python中的賦值是一個語句,而不是一個表達式。

+0

Guido不會有任何其他的方式。 – 2010-04-08 22:51:55

+0

@MarkRansom所有人都熱衷於Guido。 *對*感嘆。 – javadba 2017-12-11 04:49:10

+0

@javadba這個傢伙比他錯了很多次。我明白,讓一個負責這個願景的人能夠產生比委員會設計更加連貫的策略;我可以與C++進行比較和對比,C++是我的主要麪包和黃油。 – 2017-12-11 04:58:04

33

不,在BDFL沒有這樣的功能。我們坐下來的時候,Guido van Rossum,「仁慈的生活的獨裁者」,努力保持Python儘可能的簡單,我們可以狡辯他做出的一些決定 - 我更喜歡他經常說「不」,但事實上沒有一個設計Python的委員會,而是一個值得信賴的「諮詢委員會」,它主要基於優點,通過設計師的敏感性來篩選,產生了一個地獄般的IMHO。

+3

簡單嗎?這個功能可以簡化我的一些代碼,因爲它可以使它更緊湊,因此更具可讀性。現在我需要兩條線,我曾經需要一條線。我從來沒有明白爲什麼Python拒絕了其他編程語言多年以來的功能(並且經常出於非常好的原因)。特別是我們在這裏討論的這個特性非常非常有用。 – 2017-09-10 08:09:21

11

不是直接的,根據this old recipe of mine - 但作爲配方說,很容易建立語義等價物,例如,如果你需要直接從C編碼的參考算法音譯(在重構之前到更習慣Python,緩存SE ;-)。即:

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 

BTW,一個很地道的Python的形式爲您的特定情況下,如果你確切地知道當它返回一個falsish值(例如0)falsish價值somefunc可以返回,是

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 
1

其中一個原因分配是非法的情況的原因是,它更容易犯了一個錯誤,並指定真題:

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真和假是關鍵字,所以沒有風險了。

+1

In [161]:l_empty == [] Out [161]:True In [162]:[] == [] Out [162]:True 我不認爲這是原因 – volcano 2014-01-02 13:23:57

0

可以定義一個函數來完成分配給你:

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) 
相關問題