2012-02-18 40 views
0

我曾嘗試:打印「富」如果一個元素在列表

>>> l = [1,2,3] 
>>> x = 1 
>>> x in l and lambda: print("Foo") 
    x in l && print "Horray" 
      ^
SyntaxError: invalid syntax 

google搜索的一點透露,printpython2一份聲明中,而它在python3的功能。但是,我已經在python3中試過上面的內容,它會拋出SyntaxError異常。

任何想法我怎麼能在一行? (可讀性或谷歌編程實踐是不是一個問題在這裏)

+4

A [類似的問題](http://stackoverflow.com/questions/9344345/a-python-one-liner-if-x-in-y-do-x)已被提出了幾個幾小時前。 – 2012-02-18 23:46:57

+0

但是,我想這樣做[短路的方式](http://en.wikipedia.org/wiki/Short-circuit_evaluation) – StreetTriple 2012-02-18 23:50:24

+1

'如果x in l' *做*短路,因爲它' x'匹配'l'中的第一個元素,它等於它,它不評估其餘的元素 – 2012-02-18 23:54:00

回答

2

lambda創建,以及一個lambda。它需要被調用來執行它。你不能這樣做,因爲Python在這個上下文中不允許聲明,只有表達式(包括函數調用)。

爲了print在Python 2.x的功能,請嘗試:

from __future__ import print_function 
x in l and print('foo') 

警惕雖然。如果你嘗試:

x in l and print('foo') or print('bar') 

它不會工作,因爲打印返回None,所以第一個and表達式爲假,這樣既print旨意被執行。在Python 3.x中,你不需要導入。

如果你不會有複雜的短路(即只有一個andor),或者你知道你的函數或表達式將不會感到驚訝短路邏輯,沒有什麼不對的代碼。否則,請嘗試非短路1班輪:

print('foo') if x in l else print('bar') 

這種形式的推薦僅當條件的概率/預期爲True比做假更高大大。否則,老舊的if-else是要走的路。

+0

重構'print('foo',如果x in l else'bar')'肯定更安全。 – 2012-02-19 04:45:46

6
l = [1, 2, 3] 
x = 1 
if x in l: print "Foo" 

我不是一個聰明的驢子,這是做它一行的方式。或者,如果您使用Python3:

if x in l: print("Foo") 
+0

但是,我想通過[短路方式](http://en.wikipedia.org/wiki/Short-circuit_evaluation) – StreetTriple 2012-02-18 23:50:41

+4

+1來完成正確的操作。我不知道人們對單行者的迷戀是什麼,我只能假設他們在他們的環境中缺乏換行符.-) – paxdiablo 2012-02-18 23:54:00

+1

雖然我不推薦它,但我有可能會看到我的答案。 – Irfy 2012-02-18 23:54:21

0

擺脫打印的缺點,因爲使用from __future__ import print_function作爲Python2.x中的語句是第一步。那麼下面的所有工作:

x in l and (lambda: print("yes"))()  # what an overkill! 
(x in l or print("no")) and print("yes") # note the order, print returns None 
print("yes") if x in l else print("no") # typical A if Cond else Y 
print("yes" if x in l else "no")   # a more condensed form 

更好玩,如果你成這樣了,你可以考慮一下這款 - 打印和返回真或假,這取決於x in l條件(讓我用假雙不):

def check_and_print(x, l): 
    return x in l and not print("yes") or not not print("no") 

這很醜。要使打印透明,可以定義另外兩個打印版本 ,它們返回True或False。如果你要打印的東西在真假兩例不同,使用條件表達創造價值打印

def trueprint(*args, **kwargs): 
    print(*args, **kwargs) 
    return True 

def falseprint(*args, **kwargs): 
    return not trueprint(*args, **kwargs) 

result = x in l and trueprint("yes") or falseprint("no") 
0
  1. print ('foo' if x in l else 'bar')這事實上日誌記錄是有用的。

  2. 如果你只是想在Python 2中輸出一個函數,你可以嘗試sys.stdout.write(當然你首先需要import sys),但請記住,這遠不夠靈活;在這裏你將標準輸出視爲文件類對象(它就是這樣)。

  3. lambda幾乎可以肯定地在這裏買東西沒有。

  4. 使用和/或鏈接技巧是令人難以置信的非pythonic。無論如何,人們都在爲這些黑客而努力,因爲他們知道自己有多糟糕,這正是爲什麼來自第一點的條件表達式被添加到語言中的原因。關於語法的討論有批次