Zero to One, затем попросите другое значение от нуля до одного [dубликата]

Почему вы даже напишете первую версию? В чем преимущество проверки, чтобы убедиться, что что-то ложно, прежде чем устанавливать его true. Если вы всегда собираетесь установить его true, тогда всегда устанавливайте его true.

Когда у вас есть узкое место в производительности, которое вы проследили до ненужного значения одного логического значения, вернитесь и поговорите с нами.

18
задан pythonrubies 15 July 2010 в 22:01
поделиться

6 ответов

 , если s in ('a', 'b'): return 1 elif s in ('c', 'd'): return 2 else: return 3  
33
ответ дан Kevin Guan 15 August 2018 в 18:09
поделиться
  • 1
    вау так просто. благодаря – pythonrubies 15 July 2010 в 22:04
  • 2
    @pythonrubies - если это то, что вы искали, принимайте его как ответ. @Jesse - я бы рекомендовал использовать кортежи вместо списков для фрагмента кода. – Matthew J Morrison 15 July 2010 в 22:07
  • 3
    Быстрый вопрос, есть ли разница между ответом @Jesse Dhillon и @Tim Pietzcker? – pythonrubies 15 July 2010 в 22:08
  • 4
    @Shaded Прошел быстрый тест времени. if или 5.57 usec / func, а if-in - 5.22 usec / func (более 10M итераций). – shookster 15 July 2010 в 22:14
  • 5
    @Dan, две причины. Во-первых, кортежи неизменяемы, поэтому семантически имеет смысл использовать их для значений, которые не меняются. В этом случае вы всегда будете сравнивать с a, b, c, d , и эти значения известны во время компиляции, поэтому семантически правильное решение будет заключаться в использовании неизменяемого типа. Во-вторых, это связано с повышением производительности / эффективности при использовании кортежей, и я не помню подробностей, но вы ожидаете, что кортежи будут использовать меньше памяти и быстрее создавать экземпляр. – Jesse Dhillon 15 July 2010 в 22:45
  d = {'a': 1, 'b': 1, 'c': 2, 'd': 2} return d.get (s, 3)  
12
ответ дан James Roth 15 August 2018 в 18:09
поделиться
  • 1
    Я бы сказал, что это довольно умно. – Jesse Dhillon 15 July 2010 в 22:12
  • 2
    Теперь мне интересно, если это быстрее. – pythonrubies 15 July 2010 в 22:23
  • 3
    Это может быть еще больше уменьшено: return {'a': 1, 'b': 1, 'c': 2, 'd': 2} .get (s, 3) – James Roth 16 July 2010 в 00:52

Если вы возвращаете только фиксированные значения, лучше всего подходит словарь.

1
ответ дан Mad Scientist 15 August 2018 в 18:09
поделиться
  return 1 if (x in 'ab') else 2 if (x in 'cd') else 3  
1
ответ дан Robert William Hanks 15 August 2018 в 18:09
поделиться
  • 1
    – SilentGhost 18 July 2010 в 18:54
  • 2
    @SilentGhost: цель состоит в том, чтобы решить предлагаемую проблему, а не вариант, OP сказал: «У меня есть переменная s, которая содержит строку с одной буквой» – Robert William Hanks 19 July 2010 в 13:31
  • 3
    Просто поместите 'ab' и 'cd' в список ('ab') и list ('cd'), тогда x не может быть комбинацией «ab» и «cd». – Stefan Gruenwald 27 March 2016 в 06:05
  если s в 'ab': return 1 elif s in 'cd': return 2 else: return 3  
1
ответ дан Tim Pietzcker 15 August 2018 в 18:09
поделиться
  • 1
    Как заметил @Jesse Dillon, это работает только со строками, а также возвращает 1, если s == 'ab' , но ограничения вопроса были конкретными в этом вопросе - s - однобуквенная строка. – Tim Pietzcker 15 July 2010 в 22:22
  • 2
    Правильно, я бы не сказал, что это неправильно, учитывая параметры вопроса. +1 для доказательства того, что __ содержит __ , является предикатом для проверки существования подстрок внутри строк. – Jesse Dhillon 16 July 2010 в 00:39

Возможно, еще немного самодокументирования, используя if else:

  d = {'a': 1, 'b': 1, 'c': 2, 'd': 2} #  # Хороший выбор - заменить регистр с помощью dict, когда возможно возвращение d [s], если s в d else 3  

Также можно реализовать популярный первый ответ, если else:

  return (1, если s in ('a', 'b') else (2, если s in ('c', 'd') else 3))  
1
ответ дан Tony Veijalainen 15 August 2018 в 18:09
поделиться
Другие вопросы по тегам:

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