Как присвоить переменную в ЕСЛИ условие, и затем возвратите его?

def isBig(x):
   if x > 4: 
       return 'apple'
   else: 
       return 'orange'

Это работает:

if isBig(y): return isBig(y)

Это НЕ работает:

if fruit = isBig(y): return fruit

Почему не делает 2-й работы!? Я хочу 1 лайнер. Кроме, 1-й вызовет функцию ДВАЖДЫ.

Как сделать это 1 лайнером, не вызывая функцию дважды?

15
задан Ciro Santilli 新疆改造中心法轮功六四事件 15 October 2019 в 07:17
поделиться

5 ответов

Я вижу, что кто-то другой уже указал на мой старый рецепт «Назначить и установить» Поваренной книги, который в своей простейшей версии сводится к следующему:

class Holder(object):
   def set(self, value):
     self.value = value
     return value
   def get(self):
     return self.value

h = Holder()

...

if h.set(isBig(y)): return h.get()

Однако это было предназначено в основном для облегчения транслитерации между Python и языки, в которых присвоение напрямую поддерживается в if или while . Если у вас есть «сотни» таких проверок и возвратов в каскаде, намного лучше сделать что-то совершенно другое:

hundreds = isBig, isSmall, isJuicy, isBlah, ...

for predicate in hundreds:
  result = predicate(y)
  if result: return result

или даже что-то вроде

return next(x for x in (f(y) for f in hundreds) if x)

, если можно получить исключение StopIteration если ни один предикат не удовлетворен, или

return next((x for x in (f(y) for f in hundreds) if x)), None)

if None - правильное возвращаемое значение, когда ни один предикат не удовлетворен, и т. д.

Почти всегда, используя (или даже желая ;-) Уловка / не-идиома Холдера - это "запах дизайна"

16
ответ дан 1 December 2019 в 01:17
поделиться

Если вы хотите писать код на PHP (или C), пишите на нем. Не пытайтесь навязать его методы на другом языке.

Один из основных принципов Python (на мой взгляд) - его удобочитаемость. Вы должны использовать:

fruit = isBig(y)
if fruit: return fruit

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

2
ответ дан 1 December 2019 в 01:17
поделиться

Один лайнер не работает, потому что в Python присваивание ( fruit = isBig (y) ) является оператором, а не выражением. В C, C ++, Perl и бесчисленном множестве других языков это выражение, и вы можете поместить его в if или while или что угодно, но не в Python, потому что создатели Python считали, что им слишком легко злоупотреблять (или злоупотреблять), чтобы писать «умный» код (как вы пытаетесь это сделать).

Кроме того, ваш пример довольно глупый. isBig () всегда будет оценивать как true , поскольку единственная ложная строка - это пустая строка ( "" ), поэтому ваш if в этом случае бесполезен. Я предполагаю, что это просто упрощение того, что вы пытаетесь сделать. Просто сделай это:

9
ответ дан 1 December 2019 в 01:17
поделиться

Это не работает из-за намеренного языкового дизайна, но вы можете использовать этот трюк , чтобы обойти это решение

0
ответ дан 1 December 2019 в 01:17
поделиться

Проблема в том, что операция присваивания не может быть оценена как имеющая логическое значение. Оператор if полагается на возможность оценивать логическое значение. Например,

>>> fruit = 'apple'
>>> bool(fruit = 'apple')
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)

/Users/jem/<ipython console> in <module>()

TypeError: 'fruit' is an invalid keyword argument for this function
>>> bool('a')
True
0
ответ дан 1 December 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: