Como colocar várias instruções em uma linha?


143

Eu não tinha certeza de qual título refletir exatamente sobre essa questão, a codificação do golfe parece apropriada se for um pouco inespecífica.

Conheço um pouco de compreensão em python, mas elas parecem muito difíceis de 'ler'. Do meu ponto de vista, uma compreensão pode realizar o mesmo que o código a seguir:

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

Esse código é muito mais fácil de ler do que como as compreensões atualmente funcionam, mas notei que você não pode ter dois ':' em uma linha ... isso também me traz ...

minha pergunta:

Existe alguma maneira de obter o exemplo a seguir em ONE LINE.

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

Algo assim seria ótimo:

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

Mas, novamente, encontro o ':' conflitante: eu também adoraria saber se existe uma maneira de executar o try (ou algo parecido) sem, exceto, parece totalmente inútil o que eu preciso colocar, exceto: passe lá. é uma linha desperdiçada.

Obrigado pela sua contribuição ... e aqui tem um smiley : D


Por que isso lançaria uma exceção?
Ignacio Vazquez-Abrams

1
sam [2] pode não existir. É um exemplo hipotético. obrigado
Rhys

4
Compreensão é algo diferente em Python. Colocar tudo em uma linha não é compreensão.
Felix Kling

Estou ciente disso sim. obrigado. Eu estava apenas demonstrando como eu acho que a compreensão pode funcionar melhor, mas não pode devido ao cólon, que é a raiz do meu problema / pergunta
Rhys

Basta usar se \nusar espaços para recuos.

Respostas:


144

Infelizmente, o que você deseja não é possível com o Python (o que torna o Python praticamente inútil para programas de uma linha de comando). Mesmo o uso explícito de parênteses não evita a exceção de sintaxe. Você pode se safar com uma sequência de instruções simples, separadas por ponto e vírgula:

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

Mas assim que você adiciona uma construção que introduz um bloco recuado (como if), você precisa da quebra de linha. Além disso,

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

é legal e pode se aproximar do que você deseja.

Quanto à try ... exceptcoisa: seria totalmente inútil sem o except. trydiz "Quero executar esse código, mas pode gerar uma exceção". Se você não se importa com a exceção, deixe de lado o try. Mas assim que você o coloca, você está dizendo "Quero lidar com uma possível exceção". O passentão diz que você deseja não lidar com isso especificamente. Mas isso significa que seu código continuará sendo executado, o que não aconteceria de outra forma.


1
interessante, acho que seu último exemplo se aproxima mais da resposta que eu estava procurando. obrigado
Rhys

com relação à pergunta 'try' ... E se, eu sei que em algum momento isso lançará uma exceção, mas eu só quero que o código continue em execução ... por exemplo, para verificar se uma string pode ser um número inteiro try: int (string) ... Se não puder, continue com a próxima linha, sem a necessidade de uma exceção. Eu vejo o que você está dizendo, mas existe alguma outra maneira que pode acomodar para este tipo de verificação / erro de manipulação
Rhys

4
Re try:: As regras de sintaxe do Python simplesmente não permitem que você se safe de uma única cláusula "try" sem a devida cláusula "exceto". O que eu faço é agrupar a tentativa, exceto na própria função, e chamo isso. Como if (checkint(s))...e def checkint(s): try: int(s)\nreturn True\nexcept: return False.
ThomasH 29/05

ThomasH, gostaria que seu comentário fosse uma resposta a uma pergunta em algum lugar para que eu pudesse votá-lo novamente. Excelente.
Ivan X

5
@ThomasH " (que torna o Python quase inútil para programas de linha única de linha de comando) ": não me atrapalha. 95% dos casos não precisam de nova linha. E o resto via \ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr 26/02

52

Você pode usar a instrução exec incorporada, por exemplo:

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

Onde \né uma nova linha e \té usada como recuo (uma guia).
Além disso, você deve contar os espaços que usa, para que seu recuo corresponda exatamente.

No entanto, como todas as outras respostas já disseram, é claro que isso só deve ser usado quando você realmente precisa colocá-lo em uma linha.

exec é uma afirmação bastante perigosa (especialmente ao criar um aplicativo da web), pois permite a execução de código Python arbitrário.


4
Obrigado! Isso deve ser marcado como a resposta correta, pois realmente funciona, ao contrário dos outros. Mas é claro, nunca faça isso a menos que você precise! Na verdade, eu preciso dessa sintaxe, pois preciso inserir scripts em uma caixa de texto de uma linha fixa.
Sanjay Manohar

Obrigado ! Lifesaver! Eu não uso isso no meu script, mas no shell interativo isso é útil para depuração ... Muitas vezes, simplesmente saio do shell interativo e o reinicio para obter um ambiente limpo e, em seguida, tenho que repetir algumas etapas, ou seja, importar um módulo, executando algumas funções e faça alguns testes com uma função específica. Então, estava procurando uma maneira de colocar "importando um módulo, executando algumas funções" em um oneliner, para que eu possa retornar rapidamente do histórico e executá-lo (em vez de precisar retornar 5 itens diferentes do histórico) 1
oneindelijk

exec("try: \n if sam[0] != 'harry': print('hello', sam) \nexcept: pass") mais agradável :)
KXR

Obrigado kxr :) (usei a sua ideia para melhorar a resposta) #
3100 elecprog

6

Eu recomendo não fazer isso ...

O que você está descrevendo não é uma compreensão.

Guia de Estilo PEP 8 para código Python , que eu não recomendo, tem a dizer sobre as demonstrações compostos:

  • Instruções compostas (várias instruções na mesma linha) geralmente são desencorajadas.

Sim:

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

Melhor não:

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

Aqui está uma amostra de compreensão para fazer a distinção:

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

6

Sim, este post tem 8 anos, mas no caso de alguém aparecer aqui também procurando uma resposta: agora você pode usar ponto e vírgula. No entanto, você não pode usar staments if / elif / else, loops for / while e não pode definir funções. O principal uso disso seria ao usar módulos importados, nos quais você não precisa definir nenhuma função ou usar qualquer instrução if / elif / else / for / while / loops.

Aqui está um exemplo que pega o artista de uma música, o nome da música e procura o gênio pela letra:

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

Eu não incentivo isso, mas digamos que você esteja na linha de comando, você não tem nada além de Python e você realmente precisa de uma linha, você pode fazer isso:

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

O que estamos fazendo aqui é pré-processamento \nantes de avaliar o código Python.

Isso é super hacky! Não escreva código como este.


1

talvez com "e" ou "ou"

após falsa necessidade de escrever "ou"

depois da verdadeira necessidade de escrever "e"

gostar

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

resultado:

false 1
false 2
false 3
true 4
false 5

ou talvez como

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

cheguei aqui pesquisando no google "como colocar várias declarações em uma linha python", não responde a pergunta diretamente, talvez alguém precise disso.


1

Para uma python -csolução orientada, e desde que você use o shell Bash, sim, você pode ter uma sintaxe simples de uma linha, como neste exemplo:

Suponha que você gostaria de fazer algo assim (muito semelhante à sua amostra, incluindo except: passinstruções):

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

Isso NÃO funcionará e produzirá este erro:

  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 `

Isso ocorre porque a competição entre Bash e Python Interpretação de \nseqüências de escape. Para resolver o problema, pode-se usar a $'string'sintaxe do Bash para forçar a \ninterpretação do Bash ANTES da interpretação do Python. Para tornar o exemplo mais desafiador, adicionei uma end=..\n..especificação típica do Python na chamada de impressão do Python: no final, você poderá obter as duas \ninterpretações do bash e do Python trabalhando juntos, cada um no seu texto de preocupação. Então, finalmente, a solução adequada é assim:

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

Isso leva à saída limpa adequada sem erros:

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

Nota: isso deve funcionar bem com execsoluções orientadas, porque o problema ainda é o mesmo (competição de intérpretes Bash e Python).

Nota 2: é possível solucionar o problema substituindo alguns \npor alguns, ;mas ele não funcionará a qualquer momento (dependendo das construções do Python), enquanto minha solução permite sempre "uma linha" em qualquer parte do programa clássico de várias linhas do Python.

Nota 3: é claro que, quando for alinhado, sempre é necessário cuidar dos espaços e do recuo do Python, porque na verdade não estamos estritamente "alinhados" aqui, MAS realizando um gerenciamento misto adequado da \nsequência de escape entre o bash e o Python . É assim que podemos lidar com qualquer parte do clássico programa Python multilinhas. A amostra da solução ilustra isso também.


0

Você está misturando muitas coisas, o que dificulta a resposta à sua pergunta. A resposta curta é: até onde eu sei, o que você quer fazer não é possível em Python - por um bom motivo!

A resposta mais longa é que você deve se sentir mais confortável com o Python, se quiser desenvolver em Python. Compreensões não são difíceis de ler. Você pode não estar acostumado a lê-los, mas precisa se acostumar com isso, se quiser ser um desenvolvedor de Python. Se houver um idioma que atenda melhor às suas necessidades, escolha aquele. Se você escolher Python, esteja preparado para resolver problemas de maneira pitônica. Claro que você é livre para lutar contra o Python, mas não será divertido! ;-)

E se você nos disser qual é o seu verdadeiro problema, poderá até obter uma resposta pitônica. "Colocar algo em uma linha" geralmente não é um problema de programação.


Eu amo python! Eu estava apenas demonstrando como eu acho que as compreensões podem ser melhor estruturadas, mas não podem devido ao cólon, que é a raiz do meu problema / pergunta ... Vejo pela sua resposta que as várias instruções separadas por dois pontos, como try: if sam [ 0]! = 'Harry': print ('hellp', sam) não é possível ... isso está correto? obrigado ... im apenas usando isso para alguns fins de depuração por isso estou procurando pequeno código simples que pode ser removido fácil e não ocupam muito espaço lol
Rhys

Sim, até onde eu sei, não é possível. Mas como alguém já declara: o que você faz é algo diferente de compreensão. Se você deseja remover o código facilmente, coloque-o em uma função. Em relação ao problema "exceto: passe", pense em um decorador que ignora a exceção ou algo parecido. Novamente: sempre tente descrever seu problema real, não o problema com a solução que você já tem em mente. ;-)
Achim

3
Por que as pessoas têm que começar sua resposta com declarações provocativas como "você está misturando muitas coisas"? Voto se eu puder.
John Jiang

"Colocar algo em uma linha" geralmente não é um problema de programação. "-> mas isso geralmente é um problema de administrador de sistemas, portanto a questão ainda é relevante nesse aspecto."
Alex F

0

É realmente possível ;-)

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

Você pode fazer coisas muito feias em python como:

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

que é função para criptografia rot13 / cesa em uma linha com 99 caracteres.


-2

Aqui está um exemplo:

para i no intervalo (80, 90): print (i, end = "") if (i! = 89) else print (i)

Saída: 80 81 82 83 84 85 86 87 88 89

>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.