определение функции одной строки 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