Як розмістити кілька заяв в один рядок?


143

Я не був впевнений, під якою назвою точно розмірковувати над цим питанням, кодування гольфу здається доцільним, якщо трохи не визначено.

Я знаю трохи розуміння python, але їх, здається, дуже важко "читати". Як я це бачу, розуміння може бути таким же, як і наступний код:

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

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

моє запитання:

Чи є спосіб, як я можу отримати наступний приклад в ONE LINE.

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

Щось подібне було б чудово:

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

Але я знову стикаюся з суперечливим ":" Я також хотів би знати, чи є спосіб запустити спробу (або щось подібне) без винятку, мені здається абсолютно безглуздим, що мені потрібно поставити хіба що: пройти туди. її марно промальована лінія.

Дякую за ваш внесок ... і тут є смайлик : D


Чому б коли-небудь кинути виняток?
Ігнасіо Васкес-Абрамс

1
sam [2] може не існувати. Це гіпотетичний приклад. спасибі
Rhys

4
Розуміння - це щось інше в Python. Вкладати все в один рядок - це не розуміння.
Фелікс Клінг

Я знаю про це так. Дякую. Я просто демонстрував, як я думаю, що розуміння може працювати краще, але не можу через товстої кишки, яка є коренем моєї проблеми / питання
Rhys

Просто використовуйте \ns та використовуйте пробіли для відступів.

Відповіді:


144

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


1
цікаво, я думаю, ваш останній приклад наближається до відповіді, яку я шукав. спасибі
Rhys

що стосується питання "спробувати" ... Що робити, якщо я знаю, що в якийсь момент він викине виняток, але я просто хочу, щоб код продовжував працювати ... наприклад, щоб перевірити, чи може рядок бути цілим числом спробуйте: int (string) ... Якщо це не вдається, просто продовжуйте переходити до наступного рядка, не потрібно винятку. Я бачу, що ви говорите, але чи є інший спосіб, який може відповідати цьому виду перевірки / поводження з помилками
Rhys

4
Re try:: Правила синтаксису Python просто не дозволяють вам піти з єдиним пунктом "спробувати" без супроводу "крім". Що я роблю, це завершити спробу, за винятком власної функції, і зателефонувати до цього. Як 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

52

Ви можете використовувати вбудований оператор exec, наприклад:

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

Де \nє новий рядок і \tвикористовується як відступ (вкладка).
Також слід порахувати місця, які ви використовуєте, щоб ваш відступ точно відповідав.

Однак, як і всі інші відповіді, про які вже говорилося, це, звичайно, слід використовувати лише тоді, коли ви дійсно повинні поставити його в одну лінію.

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


4
Дякую! Це слід позначити як правильну відповідь, оскільки воно насправді працює, на відміну від інших. Але звичайно, ніколи цього не робіть, якщо не доведеться! Мені справді потрібен цей синтаксис, оскільки мені доводиться вводити скрипти у фіксованому однорядковому текстовому полі.
Санджай Манохар

Дякую ! Рятувальник! Я не використовую це в своєму сценарії, але в інтерактивній оболонці це корисно для налагодження ... Я часто просто виходжу з інтерактивної оболонки та перезавантажую її, щоб отримати чисте середовище, і тоді мені доведеться повторити певні кроки, тобто імпортувати модуль, який виконує деякі функції, а потім зробить деякий тест із певною функцією. Soooo, я шукав спосіб помістити "імпорт модуля, запуск деяких функцій" в oneliner, тому я можу швидко передзвонити його з історії та запустити його (замість того, щоб передзвонювати 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())

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]

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 `

Це тому, що конкуренція між Bash та Python Interpretation \nвтікачами послідовностей. Щоб вирішити проблему, можна використовувати $'string'синтаксис Bash, щоб змусити \nінтерпретувати Bash перед Питоном. Щоб зробити приклад більш складним, я додав типову end=..\n..специфікацію Python у виклику друку на Python: наприкінці ви зможете отримати BOTH \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 та відступи, тому що насправді ми тут не суворо "однолицеві", АЛЕ робимо належне змішане управління \nпослідовністю втечі між bash та Python . Ось так ми можемо мати справу з будь-яким твором класичної багаторядкової програми Python. Зразок розчину ілюструє це також.


0

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

Більш довга відповідь полягає в тому, що вам слід зробити себе більш комфортним з Python, якщо ви хочете розвиватися в Python. Поняття важко читати. Можливо, ви не звикли їх читати, але вам доведеться звикати, якщо ви хочете бути розробником Python. Якщо є мова, яка краще відповідає вашим потребам, виберіть її. Якщо ви вибрали Python, будьте готові вирішувати проблеми пітонічним шляхом. Звичайно, ти вільний битися проти Python, але це не буде весело! ;-)

І якби ви сказали нам, у чому полягає ваша реальна проблема, ви можете навіть отримати пітонічну відповідь. "Отримати щось в один рядок" у нас зазвичай не є проблемою програмування.


Я люблю пітона! Я просто демонстрував, як я думаю, що розуміння може бути краще структуровано, але не можу завдяки двокрапці, яка є коренем моєї проблеми / питання ... Я бачу, що у вашій відповіді, що багатоступеневі кольори, відокремлені колонами, такі як спроба: if sam [ 0]! = 'Harry': print ('hellp', sam) не можливий ... це правильно? дякую ... я просто використовую це для деяких цілей налагодження, тому я шукаю невеликий простий код, який можна легко видалити і не займає багато місця,
Rhys,

Так, наскільки я знаю, це неможливо. Але як уже хтось твердить: те, що ти робиш, - це щось інше, ніж розуміння. Якщо ви бажаєте легко видалити код, введіть його у функцію. Щодо проблеми "крім: 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 символами.


-2

Ось приклад:

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

Вихід: 80 81 82 83 84 85 86 87 88 89

>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.