Более 2 правил возврата в def () Python - PullRequest
1 голос
/ 20 января 2020

Если я создаю функцию, подобную этой, можно ли добавить еще if, elif операторов? continue для отрицательного числа или break для больших значений в одной большой строке? Без if:if: дерева? factorial () только для примера.

from functools import reduce

def factorial(n):
    """return n!"""
    return 1 if n<2 else reduce(lambda x, y: x*y, {i+1 for i in range(n)}) 

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Да, вы можете. Каждая часть в троичном выражении a if b else c является выражением, которое снова может быть троичным, таким образом, вы можете связать множество троичных слов друг с другом, например, a if b else c if d else e. Без скобок порядок оценки будет слева направо, т. Е. Так же, как вы читали бы его, но вы также можете добавить парены и, например, использовать троичную форму для условия. Является ли это очень читабельным, это другой вопрос.

Говоря о читабельности: хотя вы можете объединять их в цепочку, вы можете подумать о том, чтобы не объединять их все в одну строку для лучшего компромисса между краткостью и читабельностью:

def factorial(n):
    return -1 if n < 0 else \
            1 if n < 2 else \
            n * factorial(n-1)

Помните продолжение строки \ или ставьте скобки вокруг всего выражения. Однако обратите внимание, что ни continue, ни break нельзя использовать, поскольку они работают только внутри циклов.

2 голосов
/ 20 января 2020

Вы можете использовать структуру if-elif-else вместо условного выражения:

def factorial(n):
   if n<0:
       return None
   elif n<=1:
       return 1
   else:
       return reduce(lambda x, y: x*y, {i+1 for i in range(n)}) 
...