it-swarm.dev

Le frasi 'if'/'for' di una riga sono in perfetto stile Python?

Ogni tanto qui vedo il codice di qualcuno e quello che sembra essere un "one-liner", che è una dichiarazione a una riga che esegue nel modo standard una tradizionale istruzione "if" o un ciclo "for".

Ho cercato su google e non riesco a trovare davvero che tipo di giochi puoi eseguire? Qualcuno può consigliare e preferibilmente dare alcuni esempi?

Ad esempio, potrei farlo in una riga:

example = "example"
if "exam" in example:
    print "yes!"

O:

for a in someList:
    list.append(splitColon.split(a))
40
Federer

Bene,

if "exam" in "example": print "yes!"

Questo è un miglioramento? No . È anche possibile aggiungere ulteriori istruzioni al corpo della clausola if- separandole con un punto e virgola. Raccomando contro che però.

53
Stephan202

Ho scoperto che nella maggior parte dei casi fare clausole di blocco su una riga è una cattiva idea.

Sarà, di nuovo come una generalità, ridurre la qualità della forma del codice. La forma del codice di alta qualità è una caratteristica del linguaggio chiave per python.

In alcuni casi python offrirà modi per fare cose su una riga che sono decisamente più Pythonic. Cose come quelle che Nick D ha menzionato con la comprensione delle liste: 

newlist = [splitColon.split(a) for a in someList]

sebbene, a meno che non si abbia bisogno di un elenco riutilizzabile in particolare, si consiglia di prendere in considerazione l'utilizzo di un generatore

listgen = (splitColon.split(a) for a in someList)

nota che la più grande differenza tra i due è che non puoi reiterare su un generatore, ma è più efficiente da usare. 

C'è anche un operatore ternario integrato nelle versioni moderne di python che ti permettono di fare cose come

string_to_print = "yes!" if "exam" in "example" else ""
print string_to_print

iterator = max_value if iterator > max_value else iterator

Alcune persone potrebbero trovare queste più leggibili e utilizzabili rispetto al blocco if (condition): simile.

Quando si tratta di esso, si tratta dello stile del codice e qual è lo standard del team su cui stai lavorando. Questo è il più importante, ma in generale, consiglierei contro i blocchi di una linea in quanto la forma del codice in python è molto importante.

39
Bryan McLemore

Più in generale, tutti i seguenti sono validi sintatticamente:

if condition:
    do_something()


if condition: do_something()

if condition:
    do_something()
    do_something_else()

if condition: do_something(); do_something_else()

...eccetera.

18
Cory Petosky

un esempio di una funzione del linguaggio che non si limita a rimuovere le interruzioni di riga, anche se non è ancora convinto che sia più chiaro della versione più dettagliata

a = 1 se x> 15 altro 2

11
mbehan
for a in someList:
    list.append(splitColon.split(a))

Puoi riscrivere quanto sopra come:

newlist = [splitColon.split(a) for a in someList]
7
Nick Dandoulakis

Python ti permette di mettere la clausola rientrata sulla stessa linea se è solo una riga:

if "exam" in example: print "yes!"

def squared(x): return x * x

class MyException(Exception): pass
6
Ned Batchelder

Le versioni precedenti di Python consentivano solo una singola istruzione semplice dopo for ...:if ...: o dichiarazioni introduttive di blocchi simili.

Vedo che si possono avere più semplici affermazioni sulla stessa linea di ognuna di queste. Tuttavia, ci sono varie combinazioni che non funzionano. Ad esempio possiamo:

for i in range(3): print "Here's i:"; print i

... ma, d'altra parte, non possiamo:

for i in range(3): if i % 2: print "That's odd!"

Noi possiamo:

x=10
while x > 0: print x; x-=1

... ma non possiamo:

x=10; while x > 0: print x; x-=1

... e così via.

In ogni caso tutti questi sono considerati estremamente NON-Pythonic. Se scrivi un codice come questo, prova che Pythonistas probabilmente non vedrà le tue abilità.

In alcuni casi è marginalmente accettabile combinare più istruzioni su una riga. Per esempio:

x=0; y=1

... o anche:

if some_condition(): break

... per semplici breakcontinue e anche return dichiarazioni o assunzioni.

In particolare se si ha bisogno di usare una serie di Elif si potrebbe usare qualcosa come:

if     keystroke == 'q':   break
Elif   keystroke == 'c':   action='continue'
Elif   keystroke == 'd':   action='delete'
# ...
else:                      action='ask again'

... quindi potresti non infastidire troppo i tuoi colleghi. (Tuttavia, le catene di Elif come quell'urlo devono essere refactored in una tabella di distribuzione ... un dizionario che potrebbe apparire più simile a:

dispatch = {
    'q': foo.break,
    'c': foo.continue,
    'd': foo.delete
    }


# ...
while True:
    key = SomeGetKey()
    dispatch.get(key, foo.try_again)()
4
Jim Dennis

Puoi fare tutto ciò in una riga omettendo la variabile example:

if "exam" in "example": print "yes!"
3
Dominic Rodger

Dive into python ha un po 'in cui parla di ciò che chiama e-o trick , che sembra un modo efficace di racchiudere la logica complessa in una singola riga.

Fondamentalmente, simula l'operatore ternario in c, dandoti un modo per verificare la verità e restituire un valore basato su quello. Per esempio:

>>> (1 and ["firstvalue"] or ["secondvalue"])[0]
"firstvalue"
>>> (0 and ["firstvalue"] or ["secondvalue"])[0]
"secondvalue"
0
Dan Monego

Questo è un esempio di "if else" con azioni.

>>> def fun(num):
    print 'This is %d' % num
>>> fun(10) if 10 > 0 else fun(2)
this is 10
OR
>>> fun(10) if 10 < 0 else 1
1
0