Come mettere più istruzioni in una riga?


143

Non ero sicuro di quale titolo ponderare esattamente questa domanda, codificare il golf sembra appropriato se un po 'non specifico.

Conosco un po 'di comprensione in Python ma sembrano molto difficili da "leggere". A mio modo di vedere, una comprensione potrebbe ottenere lo stesso risultato del seguente codice:

for i in range(10): if i == 9: print('i equals 9')

Questo codice è molto più facile da leggere di come funzionano attualmente le comprensioni, ma ho notato che non puoi avere due ":" in una riga ... anche questo mi porta ...

la mia domanda:

Esiste un modo per ottenere il seguente esempio in UNA LINEA.

try:
    if sam[0] != 'harry':
        print('hello',  sam)
except:
    pass

Qualcosa del genere sarebbe fantastico:

try: if sam[0] != 'harry': print('hellp',  sam)
except:pass

Ma di nuovo incontro il conflitto ":" Mi piacerebbe anche sapere se c'è un modo per correre provare (o qualcosa del genere) senza eccezione, sembra del tutto inutile che devo mettere tranne: passare lì. è una linea sprecata.

Grazie per il tuo contributo ... e qui fai una faccina : D


Perché mai dovrebbe generare un'eccezione?
Ignacio Vazquez-Abrams,

1
sam [2] potrebbe non esistere. È un esempio ipotetico. grazie
Rhys,

4
La comprensione è qualcosa di diverso in Python. Mettere tutto in una riga non è comprensione.
Felix Kling,

Sono consapevole di questo sì. Grazie. Stavo solo dimostrando come penso che la comprensione potrebbe funzionare meglio ma non può a causa del colon che è la radice del mio problema / domanda
Rhys,

Usa \ns e usa gli spazi per i rientri.

Risposte:


144

Sfortunatamente, ciò che vuoi non è possibile con Python (il che rende Python quasi inutile per i programmi a riga di comando a riga di comando). Anche l'uso esplicito delle parentesi non evita l'eccezione della sintassi. Puoi cavartela con una sequenza di semplici istruzioni, separate da punti e virgola:

for i in range(10): print "foo"; print "bar"

Ma non appena aggiungi un costrutto che introduce un blocco rientrato (come if), devi interrompere la linea. Anche,

for i in range(10): print "i equals 9" if i==9 else None

è legale e potrebbe approssimare ciò che desideri.

Per quanto riguarda la try ... exceptcosa: sarebbe totalmente inutile senza il except. trydice "Voglio eseguire questo codice, ma potrebbe generare un'eccezione". Se non ti interessa l'eccezione, lascia il try. Ma non appena lo inserisci, stai dicendo "Voglio gestire una potenziale eccezione". L' passallora dice che si desidera non gestire in modo specifico. Ciò significa che il tuo codice continuerà a essere eseguito, altrimenti non lo sarebbe.


1
interessante, penso che il tuo ultimo esempio sia più vicino alla risposta che stavo cercando. grazie
Rhys,

per quanto riguarda la domanda "prova" ... Cosa succede se, ad un certo punto, verrà generata un'eccezione, ma voglio solo che il codice continui a funzionare ... per esempio, per verificare se una stringa può essere un numero intero try: int (string) ... Se non è possibile, passa alla riga successiva, non è necessaria alcuna eccezione. Vedo quello che stai dicendo, ma c'è un altro modo che possa adattarsi a questo tipo di controllo / gestione degli errori
Rhys,

4
Ri try:: Le regole della sintassi di Python semplicemente non ti permetteranno di cavartela con una sola clausola "try" senza la clausola "tranne". Quello che faccio è racchiudere il try-tranne in propria funzione e chiamare invece questo. Mi piace if (checkint(s))...e def checkint(s): try: int(s)\nreturn True\nexcept: return False.
ThomasH,

ThomasH, vorrei che il tuo commento fosse una risposta a una domanda da qualche parte in modo da poterlo votare. Eccellente.
Ivan X

5
@ThomasH " (che rende Python quasi inutile per i programmi da riga di comando a riga di comando) ": non mi ostacola. Il 95% dei casi non ha bisogno di nuove linee. E il resto via \ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr il

52

È possibile utilizzare l'istruzione exec integrata, ad es .:

exec("try: \n \t if sam[0] != 'harry': \n \t\t print('hello',  sam) \nexcept: pass")

Dov'è \nuna nuova riga e \tviene utilizzato come rientro (una scheda).
Inoltre, dovresti contare gli spazi che usi, in modo che il rientro corrisponda esattamente.

Tuttavia, come tutte le altre risposte già detto, questo è ovviamente solo da usare quando si ha realmente necessario per metterlo su una sola riga.

exec è un'affermazione piuttosto pericolosa (specialmente quando si crea una webapp) poiché consente l'esecuzione di codice Python arbitrario.


4
Grazie! Questa dovrebbe essere contrassegnata come la risposta corretta, in quanto funziona effettivamente, a differenza delle altre. Ma ovviamente, non farlo mai a meno che non sia necessario! In realtà ho bisogno di questa sintassi, poiché devo inserire degli script in una casella di testo fissa a una riga.
Sanjay Manohar,

Grazie ! Salvavita ! Non lo uso nel mio script, ma nella shell interattiva questo è utile per il debug ... Spesso esco semplicemente dalla shell interattiva e la riavvio per ottenere un ambiente pulito e quindi devo ripetere alcuni passaggi, ad esempio importando un modulo, eseguendo alcune funzioni e quindi eseguendo alcuni test con una funzione specifica. In verità, stavo cercando un modo per mettere "importare un modulo, eseguire alcune funzioni" in un oneliner, quindi posso richiamarlo rapidamente dalla cronologia ed eseguirlo (invece di dover richiamare 5 diversi elementi dalla cronologia) +1
oneindelijk,

exec("try: \n if sam[0] != 'harry': print('hello', sam) \nexcept: pass") più bello :)
kxr

Grazie kxr :) (ho usato la tua idea per migliorare la risposta)
elecprog,

7

Sì, questo post ha 8 anni, ma in caso qualcuno venga qui anche alla ricerca di una risposta: ora puoi usare solo i punti e virgola. Tuttavia, non è possibile utilizzare gli stament if / elif / else, per / while loop e non è possibile definire le funzioni. L'uso principale di questo sarebbe quando si utilizzano moduli importati in cui non è necessario definire alcuna funzione o utilizzare istruzioni if ​​/ elif / else / for / while / loop.

Ecco un esempio che prende l'artista di una canzone, il nome della canzone e cerca il genio dei testi:

import bs4, requests; song = input('Input artist then song name\n'); print(bs4.BeautifulSoup(requests.get(f'https://genius.com/{song.replace(" ", "-")}-lyrics').text,'html.parser').select('.lyrics')[0].text.strip())

6

io raccomando non farlo ...

Quello che stai descrivendo è non una comprensione.

PEP 8 Guida allo stile per il codice Python , che io non consiglio, ha questo da dire sulle dichiarazioni composte:

  • Le istruzioni composte (più istruzioni sulla stessa riga) sono generalmente scoraggiate.

Sì:

      if foo == 'blah':
          do_blah_thing()
      do_one()
      do_two()
      do_three()

Piuttosto no:

      if foo == 'blah': do_blah_thing()
      do_one(); do_two(); do_three()

Ecco un esempio di comprensione per fare la distinzione:

>>> [i for i in xrange(10) if i == 9]
[9]

6

Non lo incentivo, ma dico che sei dalla riga di comando, non hai nient'altro che Python e hai davvero bisogno di un one-liner, puoi farlo:

python -c "$(echo -e "a='True'\nif a : print 1")"

Quello che stiamo facendo qui è la pre-elaborazione \nprima di valutare il codice Python.

È super hacky! Non scrivere codice in questo modo.


1

forse con "e" o "o"

dopo falso bisogno di scrivere "o"

dopo il vero bisogno di scrivere "e"

piace

n=0
def returnsfalse():
    global n
    n=n+1
    print ("false %d" % (n))
    return False
def returnstrue():
    global n
    n=n+1
    print ("true %d" % (n))
    return True
n=0
returnsfalse() or  returnsfalse() or returnsfalse() or returnstrue() and returnsfalse()

risultato:

false 1
false 2
false 3
true 4
false 5

o forse piace

(returnsfalse() or true) and (returnstrue() or true) and ...

arrivato qui cercando su Google "come mettere più istruzioni in una riga pitone", non rispondere direttamente alla domanda, forse qualcun altro ne ha bisogno.


1

Per un python -c soluzione orientata e purché tu utilizzi la shell Bash, sì, puoi avere una sintassi di una riga semplice come in questo esempio:

Supponiamo che tu voglia fare qualcosa del genere (molto simile al tuo campione, comprese le except: passistruzioni):

python -c  "from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n" OUTPUT_VARIABLE __numpy_path

Questo NON funzionerà e produrrà questo errore:

  File "<string>", line 1
    from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n
                                                                                                                  ^
SyntaxError: unexpected character after line continuation character `

Questo perché la competizione tra Bash e Python Interpretazione delle \nsequenze di escape. Per risolvere il problema, è possibile utilizzare la $'string'sintassi di Bash per forzare l' \ninterpretazione di Bash PRIMA di quella di Python. Per rendere l'esempio più impegnativo, ho aggiunto una end=..\n..specifica Python specifica nella chiamata di stampa di Python: alla fine sarete in grado di ottenere ENTRAMBE le \ninterpretazioni da bash e Python che lavorano insieme, ognuna sul suo pezzo di testo di interesse. In modo che finalmente la soluzione corretta sia così:

python -c  $'from __future__ import print_function\ntry:\n import numpy;\n print( numpy.get_include(), end="\\n" )\n print( "Hello" )\nexcept:pass\n' OUTPUT_VARIABLE __numpy_path

Ciò porta all'output pulito corretto senza errori:

/Softs/anaconda/lib/python3.7/site-packages/numpy/core/include
Hello

Nota: questo dovrebbe funzionare anche con exec soluzioni orientate, perché il problema è sempre lo stesso (concorrenza tra interpreti di Bash e Python).

Nota2: si potrebbe aggirare il problema sostituendone alcuni \ncon alcuni ;ma non funzionerà in qualsiasi momento (a seconda dei costrutti Python), mentre la mia soluzione consente di "sempre una riga" qualsiasi pezzo del classico programma Python multilinea.

Nota 3: ovviamente, quando si è in linea, si deve sempre prendersi cura degli spazi e del rientro di Python, perché in realtà qui non si fa rigorosamente "una linea", MA facendo una corretta gestione mista della \nsequenza di escape tra bash e Python . Ecco come possiamo gestire qualsiasi pezzo del classico programma Python multilinea. L'esempio di soluzione illustra anche questo.


0

Stai mescolando molte cose, il che rende difficile rispondere alla tua domanda. La risposta breve è: per quanto ne so, quello che vuoi fare non è proprio possibile in Python - per una buona ragione!

La risposta più lunga è che dovresti sentirti più a tuo agio con Python, se vuoi sviluppare in Python. Le comprensioni non sono difficili da leggere. Potresti non essere abituato a leggerli, ma devi abituarti se vuoi essere uno sviluppatore Python. Se esiste una lingua che si adatta meglio alle tue esigenze, scegli quella. Se scegli Python, preparati a risolvere i problemi in modo pitonico. Ovviamente sei libero di combattere contro Python, ma non sarà divertente! ;-)

E se ci dicessi qual è il tuo vero problema, potresti persino ottenere una risposta pitonica. "Ottenere qualcosa in una riga" di solito non è un problema di programmazione.


Adoro il pitone! Stavo solo dimostrando come penso che le comprensioni potrebbero essere meglio strutturate ma non possono a causa del colon che è la radice del mio problema / domanda ... Vedo dalla tua risposta che i multistati separati da due punti come provare: if sam [ 0]! = 'Harry': la stampa ('hellp', sam) non è possibile ... è corretto? grazie ... sto solo usando questo per alcuni scopi di debug, quindi sto cercando un piccolo codice semplice che può essere rimosso facilmente e non occupa molto spazio lol
Rhys,

Sì, per quanto ne so non è possibile. Ma come qualcuno già statet: quello che fai è qualcosa di diverso dalla comprensione. Se vuoi essere in grado di rimuovere facilmente il codice, mettilo in una funzione. Per quanto riguarda il problema "tranne: pass", pensa a un decoratore che ignora l'eccezione o qualcosa del genere. Ancora: cerca sempre di descrivere il tuo vero problema, non il problema con la soluzione che hai già in mente. ;-)
Achim,

3
Perché le persone devono iniziare la loro risposta con richieste provocatorie come "stai mescolando un sacco di cose" senza risposta? Giù il voto se posso.
John Jiang,

"Ottenere qualcosa in una riga" di solito non è un problema di programmazione. "-> ma questo è spesso un problema di amministratore di sistema, quindi la domanda è ancora rilevante in questo aspetto.
Alex F

0

È possibile accuratamente ;-)

# not pep8 compatible^
sam = ['Sam',]
try: print('hello',sam) if sam[0] != 'harry' else rais
except: pass

Puoi fare cose molto brutte in Python come:

def o(s):return''.join([chr(ord(n)+(13if'Z'<n<'n'or'N'>n else-13))if n.isalpha()else n for n in s])

che è la funzione per la crittografia rot13 / cesa in una riga con 99 caratteri.


-2

Ecco un esempio:

per i nell'intervallo (80, 90): stampa (i, end = "") se (i! = 89) altrimenti stampa (i)

Uscita: 80 81 82 83 84 85 86 87 88 89

>

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.