Как поместить несколько операторов в одну строку? - PullRequest
122 голосов
/ 29 мая 2011

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

Я немного разбираюсь в 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

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

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

Ответы [ 8 ]

122 голосов
/ 29 мая 2011

К сожалению, то, что вы хотите, невозможно с 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 тогда говорит, что вы не хотите с этим обращаться конкретно.Но это означает, что ваш код продолжит работу, чего не произошло бы в противном случае.

49 голосов
/ 27 июня 2014

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

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

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

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

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

6 голосов
/ 29 мая 2011

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

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

Руководство по стилю 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]
5 голосов
/ 11 января 2018

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

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

Что мыздесь выполняется предварительная обработка \n перед оценкой кода Python.

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

1 голос
/ 22 марта 2016

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

после ложной необходимости писать "или"

после истинной необходимости писать "и"

как

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 голос
/ 29 мая 2011

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

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

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

0 голосов
/ 18 августа 2017

Вот пример:

для i в диапазоне (80, 90): print (i, end = ""), если (i! = 89), в противном случае print (i)

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

>

0 голосов
/ 09 апреля 2015

Его возможно; -)

# 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 символами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...