Comment mettre plusieurs déclarations sur une seule ligne?

143

Je ne savais pas sous quel titre réfléchir exactement à cette question, le codage du golf semble approprié, même s'il n'est pas spécifique.

Je connais un peu les compréhensions en python mais elles semblent très difficiles à «lire». À mon avis, une compréhension peut accomplir la même chose que le code suivant:

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

Ce code est beaucoup plus facile à lire que la façon dont les compréhensions fonctionnent actuellement mais j'ai remarqué que vous ne pouvez pas avoir deux ':' en une seule ligne ... cela m'amène aussi ...

ma question:

Est-il possible que je puisse obtenir l'exemple suivant dans UNE LIGNE.

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

Quelque chose comme ça serait génial:

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

Mais encore une fois, je rencontre le conflit ':' J'adorerais aussi savoir s'il existe un moyen de lancer try (ou quelque chose comme ça) sans sauf, il semble totalement inutile que je doive mettre sauf: passer là-dedans. c'est une ligne gaspillée.

Merci pour votre contribution ... et voici un smiley : D

Rhys
la source
Pourquoi jetterait-il jamais une exception?
Ignacio Vazquez-Abrams
1
sam [2] peut ne pas exister. C'est un exemple hypothétique. merci
Rhys
4
La compréhension est quelque chose de différent en Python. Tout mettre sur une seule ligne n'est pas une compréhension.
Felix Kling
Je suis conscient de ce oui. Merci. J'étais juste en train de démontrer comment je pense que la compréhension pourrait mieux fonctionner mais ne peut pas en raison du côlon qui est à la racine de mon problème / question
Rhys
Utilisez simplement \ns et utilisez des espaces pour les retraits.

Réponses:

144

Malheureusement, ce que vous voulez n'est pas possible avec Python (ce qui rend Python presque inutile pour les programmes à une ligne de ligne de commande). Même l'utilisation explicite de parenthèses n'évite pas l'exception de syntaxe. Vous pouvez vous en tirer avec une séquence d'instructions simples, séparées par des points-virgules:

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

Mais dès que vous ajoutez une construction qui introduit un bloc indenté (comme if), vous avez besoin du saut de ligne. Aussi,

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

est légal et peut correspondre à ce que vous voulez.

Quant à la try ... exceptchose: ce serait totalement inutile sans le except. trydit "Je veux exécuter ce code, mais cela pourrait lever une exception". Si vous ne vous souciez pas de l'exception, laissez de côté le try. Mais dès que vous le mettez, vous dites "Je veux gérer une exception potentielle". Le passdit alors que vous ne souhaitez pas le gérer spécifiquement. Mais cela signifie que votre code continuera à s'exécuter, ce qui ne serait pas le cas autrement.

ThomasH
la source
1
intéressant, je pense que votre dernier exemple se rapproche le plus de la réponse que je recherchais. merci
Rhys
en ce qui concerne la question `` essayer '' ... Et si, je sais qu'à un moment donné, il va lever une exception mais je veux juste que le code continue de fonctionner ... par exemple, pour vérifier si une chaîne peut être un entier try: int (string) ... Si ce n'est pas le cas, continuez simplement à la ligne suivante, pas besoin d'exception. Je vois ce que vous dites, mais y a-t-il un autre moyen qui puisse accueillir ce type de vérification / gestion des erreurs
Rhys
4
Re try:: Les règles de syntaxe Python ne vous permettront tout simplement pas de vous en tirer avec une seule clause "try" sans la clause "except". Ce que je fais, c'est encapsuler le try-except dans sa propre fonction, et l'appeler à la place. Comme if (checkint(s))...et def checkint(s): try: int(s)\nreturn True\nexcept: return False.
ThomasH
ThomasH, je souhaite que votre commentaire soit une réponse à une question quelque part afin que je puisse voter pour. Excellent.
Ivan X
5
@ThomasH " (ce qui rend Python presque inutile pour les programmes à une ligne de commande) ": ne me gêne pas. 95% des cas n'ont pas besoin de nouvelle ligne. Et le reste via \ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr
52

Vous pouvez utiliser l'instruction exec intégrée, par exemple:

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

\nest une nouvelle ligne et \test utilisé comme retrait (une tabulation).
En outre, vous devez compter les espaces que vous utilisez, afin que votre indentation corresponde exactement.

Cependant, comme toutes les autres réponses déjà dit, c'est bien sûr à utiliser uniquement lorsque vous vraiment avoir à le mettre sur une ligne.

exec est une instruction assez dangereuse (en particulier lors de la construction d'une application web) car elle permet l'exécution de code Python arbitraire.

elecprog
la source
4
Je vous remercie! Cela devrait être marqué comme la bonne réponse, car cela fonctionne réellement, contrairement aux autres. Mais bien sûr, ne faites jamais cela à moins que vous n'ayez à le faire! Cependant, j'ai besoin de cette syntaxe, car je dois saisir des scripts dans une zone de texte fixe d'une ligne.
Sanjay Manohar
Merci ! Gareautrain! Je ne l'utilise pas dans mon script, mais dans le shell interactif, cela est utile pour le débogage ... Je quitte souvent simplement le shell interactif et le redémarre pour obtenir un environnement propre, puis je dois répéter certaines étapes, c'est-à-dire importer un module, exécutez certaines fonctions, puis effectuez des tests avec une fonction spécifique. Soooo, je cherchais un moyen de mettre "importer un module, exécuter certaines fonctions" dans un oneliner, afin que je puisse le rappeler rapidement de l'historique et l'exécuter (au lieu d'avoir à rappeler 5 éléments différents de l'historique) +1
oneindelijk
exec("try: \n if sam[0] != 'harry': print('hello', sam) \nexcept: pass")
nicer
Merci kxr :) (J'ai utilisé votre idée pour améliorer la réponse)
elecprog
7

Oui, ce message a 8 ans, mais au cas où quelqu'un viendrait également chercher une réponse: vous pouvez maintenant simplement utiliser des points-virgules. Cependant, vous ne pouvez pas utiliser les staments if / elif / else, les boucles for / while et vous ne pouvez pas définir de fonctions. L'utilisation principale de ceci serait lors de l'utilisation de modules importés où vous n'avez pas à définir de fonctions ou à utiliser des instructions if / elif / else / for / while / loops.

Voici un exemple qui prend l'artiste d'une chanson, le nom de la chanson et recherche le génie pour les paroles:

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())
symbxlz
la source
6

Je recommande de ne pas faire ça ...

Ce que vous décrivez n'est pas une compréhension.

PEP 8 Guide de style pour le code Python , que je ne recommande, a ceci à dire sur les déclarations de composés:

  • Les instructions composées (plusieurs instructions sur la même ligne) sont généralement déconseillées.

Oui:

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

Plutôt pas:

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

Voici un exemple de compréhension pour faire la distinction:

>>> [i for i in xrange(10) if i == 9]
[9]
Johnsyweb
la source
6

Je n'encourage pas cela, mais disons que vous êtes en ligne de commande, que vous n'avez rien d'autre que Python et que vous avez vraiment besoin d'un one-liner, vous pouvez le faire:

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

Ce que nous faisons ici, c'est un prétraitement \navant d'évaluer le code Python.

C'est super hacky! N'écrivez pas de code comme celui-ci.

Tiago Lopo
la source
1

peut-être avec "et" ou "ou"

après un faux besoin d'écrire "ou"

après un vrai besoin d'écrire "et"

comme

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()

résultat:

false 1
false 2
false 3
true 4
false 5

ou peut-être comme

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

obtenu ici en recherchant google "comment mettre plusieurs déclarations en une seule ligne python", ne répond pas directement à la question, peut-être que quelqu'un d'autre en a besoin.

Shimon Doodkin
la source
1

Pour une python -csolution orientée, et à condition d'utiliser le shell Bash, oui, vous pouvez avoir une syntaxe simple en une ligne comme dans cet exemple:

Supposons que vous souhaitiez faire quelque chose comme ceci (très similaire à votre exemple, y compris les except: passinstructions):

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

Cela ne fonctionnera PAS et produira cette erreur:

  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 `

C'est parce que la concurrence entre Bash et Python Interprétation de \n séquences d'échappement. Pour résoudre le problème, on peut utiliser la $'string'syntaxe Bash pour forcer l' \ninterprétation de Bash AVANT celle de Python. Pour rendre l'exemple plus difficile, j'ai ajouté une end=..\n..spécification Python typique dans l'appel d'impression Python: à la fin, vous pourrez obtenir les DEUX \ninterprétations de bash et de Python travaillant ensemble, chacune sur son texte de préoccupation. Pour que finalement la bonne solution soit comme ceci:

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

Cela conduit à la sortie propre correcte sans erreur:

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

Remarque: cela devrait également fonctionner avec execdes solutions orientées, car le problème est toujours le même (concours d'interprètes Bash et Python).

Note 2: on pourrait contourner le problème en remplaçant certains \npar certains ;mais cela ne fonctionnera à aucun moment (selon les constructions Python), alors que ma solution permet de toujours "une ligne" n'importe quel morceau de programme Python multi-lignes classique.

Note 3: bien sûr, en une seule ligne, il faut toujours s'occuper des espaces et de l'indentation Python, car en fait nous ne sommes pas strictement "une ligne" ici, MAIS faire une bonne gestion mixte de \nla séquence d'échappement entre bash et Python . C'est ainsi que nous pouvons gérer n'importe quel morceau de programme Python multi-lignes classique. L'exemple de solution illustre également cela.

Pierre13fr
la source
0

Vous mélangez beaucoup de choses, ce qui rend difficile la réponse à votre question. La réponse courte est: pour autant que je sache, ce que vous voulez faire n'est tout simplement pas possible en Python - pour une bonne raison!

La réponse la plus longue est que vous devriez vous familiariser avec Python si vous souhaitez développer en Python. Les compréhensions ne sont pas difficiles à lire. Vous n'êtes peut-être pas habitué à les lire, mais vous devez vous y habituer si vous voulez devenir développeur Python. S'il y a une langue qui répond mieux à vos besoins, choisissez-la. Si vous choisissez Python, soyez prêt à résoudre les problèmes de manière pythonique. Bien sûr, vous êtes libre de vous battre contre Python, mais ce ne sera pas amusant! ;-)

Et si vous vouliez nous dire quel est votre vrai problème, vous pourriez même obtenir une réponse pythonique. "Obtenir quelque chose en une seule ligne" n'est généralement pas un problème de programmation.

Achim
la source
J'adore le python! J'étais juste en train de démontrer comment je pense que les compréhensions pourraient être mieux structurées mais ne peuvent pas en raison du deux-points qui est la racine de mon problème / question ... Je vois par votre réponse que les déclarations multiples séparées par des deux-points comme try: if sam [ 0]! = 'Harry': print ('hellp', sam) ne sont pas possibles ... est-ce correct? merci ... je l'utilise juste à des fins de débogage, donc je cherche un petit code simple qui peut être supprimé facilement et ne prend pas beaucoup d'espace lol
Rhys
Oui, pour autant que je sache, ce n'est pas possible. Mais comme quelqu'un le déclare déjà: ce que vous faites est quelque chose de différent de la compréhension. Si vous voulez pouvoir supprimer facilement le code, mettez-le dans une fonction. Concernant le problème "except: pass", pensez à un décorateur qui ignore l'exception ou quelque chose comme ça. Encore une fois: essayez toujours de décrire votre vrai problème, pas le problème avec la solution que vous avez déjà en tête. ;-)
Achim
3
Pourquoi les gens doivent-ils commencer leur réponse par des déclarations provocantes comme "vous mélangez beaucoup de choses"? Votez si je peux.
John Jiang
"Obtenir quelque chose en une seule ligne" n'est généralement pas un problème de programmation. "-> mais c'est souvent un problème d'administrateur système, donc la question est toujours d'actualité dans cet aspect.
Alex F
0

C'est possible ;-)

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

Vous pouvez faire des choses très laides en python comme:

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])

qui est fonction pour le cryptage rot13 / cesa en une ligne avec 99 caractères.

yamm
la source
-2

Voici un exemple:

pour i dans la plage (80, 90): print (i, end = "") if (i! = 89) else print (i)

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

>

JZP
la source