Как поместить несколько операторов в одну строку?

146

Я не был уверен, под каким названием конкретно обдумывать этот вопрос, кодирование гольфа кажется уместным, хотя и немного неопределенным.

Я знаю кое-что в Python, но мне кажется, что их очень трудно «читать». На мой взгляд, понимание может дать то же самое, что и следующий код:

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

Этот код намного легче читать, чем то, как в настоящее время работают понимания, но я заметил, что у вас не может быть два ':' в одной строке ... это тоже подводит меня ...

мой вопрос:

Есть ли способ поместить следующий пример в ОДНУ СТРОКУ.

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

Что-то вроде этого было бы здорово:

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

Но снова я сталкиваюсь с противоречивым ':' Я также хотел бы знать, есть ли способ запустить try (или что-то в этом роде) без except, кажется совершенно бессмысленным, что мне нужно вставить except: pass in there. это потраченная впустую линия.

Спасибо за ваш вклад ... и вот смайлик : D

Рис
источник
Зачем было бы вызывать исключение?
Игнасио Васкес-Абрамс,
2
sam [2] может не существовать. Это гипотетический пример. спасибо
Рис
4
Понимание - это нечто иное в Python. Сложить все в одну строку - это не понимание.
Феликс Клинг,
Я знаю об этом да. Спасибо. Я просто демонстрировал, что, по моему мнению, понимание может работать лучше, но не может из-за толстой кишки, которая является корнем моей проблемы / вопроса
Рис
Просто используйте \ns и используйте пробелы для отступов.

Ответы:

148

К сожалению, то, что вы хотите, невозможно с Python (что делает Python почти бесполезным для однострочных программ командной строки). Даже явное использование круглых скобок не позволяет избежать синтаксического исключения. Вы можете обойтись последовательностью простых операторов, разделенных точкой с запятой:

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

Но как только вы добавите конструкцию, которая вводит блок с отступом (например, if), вам понадобится разрыв строки. Также,

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

является законным и может приблизительно соответствовать тому, что вы хотите.

Что же касается try ... exceptвещей: Было бы совершенно бесполезно безexcept . tryговорит: «Я хочу запустить этот код, но это может вызвать исключение». Если вас не волнует исключение, оставьте try. Но как только вы его вставляете, вы говорите: «Я хочу обработать потенциальное исключение». passТо говорит , что вы хотите , чтобы не справиться с этим специально. Но это означает, что ваш код будет продолжать работать, чего не было бы в противном случае.

ThomasH
источник
1
интересно, я думаю, что ваш последний пример ближе всего к ответу, который я искал. спасибо
Рис
Что касается вопроса "попробовать" ... Что, если, я знаю, что в какой-то момент он вызовет исключение, но я просто хочу, чтобы код продолжал работать ... например, чтобы проверить, может ли строка быть целым числом try: int (string) ... Если нет, просто переходите к следующей строке, исключение не требуется. Я понимаю, о чем вы говорите, но есть ли какой-либо другой способ приспособиться к этому типу проверки / обработки ошибок
Рис,
4
Re try:: Правила синтаксиса Python просто не позволят вам обойтись единственным предложением "try" без сопровождающего предложения "except". Что я делаю, так это оборачиваю try-except в собственную функцию и вызываю это вместо этого. Вроде if (checkint(s))...и def checkint(s): try: int(s)\nreturn True\nexcept: return False.
ThomasH
ThomasH, я бы хотел, чтобы ваш комментарий был ответом на вопрос, чтобы я мог проголосовать за него. Превосходно.
Иван X
5
@ThomasH " (что делает Python почти бесполезным для однострочных программ из командной строки) ": мне не мешает. В 95% случаев новая строка не требуется. А остальное через \ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr
53

Вы можете использовать встроенный оператор exec, например:

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

Где \nсимвол новой строки и \tиспользуется как отступ (табуляция).
Кроме того, вы должны подсчитать используемые пробелы, чтобы ваш отступ точно соответствовал.

Однако, как уже говорилось во всех других ответах, это, конечно, нужно использовать только тогда, когда вам действительно нужно поместить его в одну строку.

exec - довольно опасный оператор (особенно при создании веб-приложения), поскольку он позволяет выполнять произвольный код Python.

elecprog
источник
4
Спасибо! Этот ответ следует отметить как правильный, поскольку он действительно работает, в отличие от других. Но, конечно, никогда не делайте этого без крайней необходимости! Однако мне действительно нужен этот синтаксис, поскольку я должен вводить сценарии в фиксированное однострочное текстовое поле.
Санджай Манохар
Благодарность ! Спасатель! Я не использую это в моем сценарии, но в интерактивной оболочке это полезно для отладки ... Я часто просто выхожу из интерактивной оболочки и перезапускаю ее, чтобы получить чистую среду, а затем мне приходится повторять определенные шаги, то есть импортировать модуль, запустив некоторые функции, а затем проведите несколько тестов с конкретной функцией. Таааааааааааааааааааааач я искал способ поместить «импорт модуля, выполнение некоторых функций» в одну строку, чтобы я мог быстро вызвать его из истории и запустить (вместо того, чтобы вызывать 5 разных элементов из истории) +1
oneindelijk
exec("try: \n if sam[0] != 'harry': print('hello', sam) \nexcept: pass") лучше :)
kxr
Спасибо, kxr :) (я использовал вашу идею, чтобы улучшить ответ)
elecprog
7

Да, этому посту 8 лет, но если кто-то зайдет сюда и тоже ищет ответ: теперь вы можете просто использовать точки с запятой. Однако вы не можете использовать элементы if / elif / else для циклов / while и не можете определять функции. Основное использование этого будет при использовании импортированных модулей, где вам не нужно определять какие-либо функции или использовать какие-либо инструкции / циклы if / elif / else / for / while.

Вот пример, который берет исполнителя песни, название песни и ищет слова «гений»:

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
источник
6

Я рекомендую этого не делать ...

То, что вы описываете, не является пониманием.

PEP 8 Руководство по стилю для Python кодекс , который я действительно рекомендую, это сказать на составные операторы:

  • Составные утверждения (несколько утверждений в одной строке) обычно не приветствуются.

Да:

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

А не:

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

Вот пример понимания, чтобы различить:

>>> [i for i in xrange(10) if i == 9]
[9]
Johnsyweb
источник
6

Я не поощряю это, но скажу, что вы работаете в командной строке, у вас нет ничего, кроме Python, и вам действительно нужен однострочник, вы можете сделать это:

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

Здесь мы делаем предварительную обработку \nперед оценкой кода Python.

Это супер хаки! Не пишите такой код.

Тьяго Лопо
источник
1

может быть с "и" или "или"

после ложного нужно написать "или"

после истины нужно написать "и"

подобно

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

результат:

false 1
false 2
false 3
true 4
false 5

или может быть как

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

попал сюда, выполнив поиск в Google "как разместить несколько статусов в одной строке python", не отвечает на вопрос напрямую, может быть, это кому-то еще нужно.

Шимон Дудкин
источник
1

Для python -cориентированного решения и при условии, что вы используете оболочку Bash, да, у вас может быть простой однострочный синтаксис, как в этом примере:

Предположим, вы хотите сделать что-то подобное (очень похожее на ваш образец, включая except: passинструкцию):

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

Это НЕ будет работать и приведет к этой ошибке:

  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 `

Это связано с конкуренцией между интерпретацией \nуправляющих последовательностей Bash и Python . Чтобы решить эту проблему, можно использовать $'string'синтаксис Bash для принудительной \nинтерпретации Bash ПЕРЕД интерпретацией Python. Чтобы сделать пример более сложным, я добавил типичную end=..\n..спецификацию Python в вызов Python print: в конце вы сможете получить ОБЕ \nинтерпретации от bash и Python, работающих вместе, каждая над своим фрагментом текста, вызывающим озабоченность. Итак, наконец, правильное решение выглядит так:

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

Это приводит к правильному чистому выводу без ошибок:

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

Примечание: это должно работать и с execориентированными решениями, потому что проблема все та же (соревнование интерпретаторов Bash и Python).

Примечание 2: можно было бы обойти проблему, заменив некоторые \nиз них некоторыми, ;но это не будет работать в любое время (в зависимости от конструкций Python), в то время как мое решение позволяет всегда "однострочно" использовать любую часть классической многострочной программы Python.

Примечание 3: конечно, при использовании одной строки нужно всегда заботиться о пробелах и отступах Python, потому что на самом деле мы здесь не строго «однострочны», НО делаем правильное смешанное управление \nescape-последовательностью между bash и Python . Вот как мы можем работать с любой частью классической многострочной программы Python. Пример решения также иллюстрирует это.

Pierre13fr
источник
0

Вы смешиваете много вещей, поэтому сложно ответить на ваш вопрос. Короткий ответ: насколько я знаю, то, что вы хотите делать, просто невозможно в Python - не зря!

Более длинный ответ заключается в том, что вам следует привыкнуть к Python, если вы хотите разрабатывать на Python. Понимания читать несложно. Возможно, вы не привыкли их читать, но вам нужно привыкнуть к этому, если вы хотите стать разработчиком Python. Если есть язык, который лучше соответствует вашим потребностям, выберите его. Если вы выберете Python, будьте готовы решать проблемы питоническим способом. Конечно, вы можете сражаться против Python, но это будет не весело! ;-)

И если вы расскажете нам, в чем ваша настоящая проблема, вы даже можете получить питонический ответ. «Получение чего-либо в одну строку» для нас обычно не проблема программирования.

Ахим
источник
Я люблю питона! Я просто демонстрировал, как, по моему мнению, понимание может быть лучше структурировано, но не может из-за двоеточия, которое является корнем моей проблемы / вопроса ... По вашему ответу я вижу, что мультисостояния разделены двоеточиями, такими как try: if sam [ 0]! = 'Harry': print ('hellp', sam) невозможно ... это правильно? спасибо ... я просто использую это для некоторых целей отладки, поэтому я ищу небольшой простой код, который можно легко удалить и не занимает много места lol
Рис
Да, насколько я знаю, это невозможно. Но как уже было сказано: то, что вы делаете, отличается от понимания. Если вы хотите, чтобы код можно было легко удалить, поместите его в функцию. Что касается проблемы «except: pass», подумайте о декораторе, который игнорирует исключение или что-то в этом роде. Еще раз: всегда пытайтесь описать свою настоящую проблему, а не проблему с решением, которое вы уже имеете в виду. ;-)
Ахим
3
Почему люди должны начинать свой ответ с неуместных провокационных заявлений типа «вы много чего смешиваете»? Если смогу, проголосуйте против.
Джон Цзян
«Получение чего-либо в одну строку» обычно не проблема программирования. »-> но это часто проблема
Alex F
0

Это реально возможно ;-)

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

В python можно делать очень уродливые вещи, например:

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

которая является функцией шифрования rot13 / cesa в одну строку из 99 символов.

yamm
источник
-2

Вот пример:

для i в диапазоне (80, 90): print (i, end = "") if (i! = 89) else print (i)

Выход: 80 81 82 83 84 85 86 87 88 89

>

JZP
источник