определение функции одной строки python
Это должно быть просто, но как единственный случайный пользователь python, борющийся с некоторым синтаксисом. Это работает:
def perms (xs):
for x in itertools.permutations(xs): yield list(x)
Но это не будет анализировать:
def perms (xs): for x in itertools.permutations(xs): yield list(x)
Есть ли ограничение на синтаксис однострочной функции? Определение тела (для...) может быть либо двумя, либо одной строкой само по себе, а def: может быть одной или двумя строками с простым телом, но объединение двух неудачных. Есть ли правило синтаксиса, которое исключает это?
Ответы
Ответ 1
Да, есть ограничения. Нет, ты не можешь этого сделать. Проще говоря, вы можете пропустить один перевод строки, но не два. :-)
Смотрите http://docs.python.org/2/reference/compound_stmts.html
Причина этого заключается в том, что это позволит вам сделать
if test1: if test2: print x
else:
print y
Что неоднозначно.
Ответ 2
Если у вас должна быть одна строка, просто сделайте ее lambda
:
perms = lambda xs: (list(x) for x in itertools.permutations(xs))
Довольно часто, когда у вас есть короткие for
цикла для получения данных, вы можете заменить его либо список понимание или выражение порождающего примерно такой же разборчивость в немного меньшем пространстве.
Ответ 3
def perms (xs):
для x в файле itertools.permutations(xs): список выхода (x)
Вы можете использовать exec()
для решения этой проблемы
exec('def perms (xs):\n for x in itertools.permutations(xs):\n yield list(x)\n')
остерегайтесь вставлять отступы или chr (9) после \n
Пример для если Python в одну строку
for i in range(10):
if (i==1):
print(i)
exec('for i in range(10)\n if (i==1):\n print(i)\n')
Это мой проект на GitHub для использования exec для запуска программы Python в режиме интерактивной консоли
* обратите внимание, что запуск нескольких строк выполняется только тогда, когда они заканчиваются на \n