Почему вы даже напишете первую версию? В чем преимущество проверки, чтобы убедиться, что что-то ложно, прежде чем устанавливать его true. Если вы всегда собираетесь установить его true, тогда всегда устанавливайте его true.
Когда у вас есть узкое место в производительности, которое вы проследили до ненужного значения одного логического значения, вернитесь и поговорите с нами.
, если s in ('a', 'b'): return 1 elif s in ('c', 'd'): return 2 else: return 3
d = {'a': 1, 'b': 1, 'c': 2, 'd': 2} return d.get (s, 3)
return {'a': 1, 'b': 1, 'c': 2, 'd': 2} .get (s, 3)
– James Roth
16 July 2010 в 00:52
Если вы возвращаете только фиксированные значения, лучше всего подходит словарь.
return 1 if (x in 'ab') else 2 if (x in 'cd') else 3
если s в 'ab': return 1 elif s in 'cd': return 2 else: return 3
s == 'ab'
, но ограничения вопроса были конкретными в этом вопросе - s
- однобуквенная строка.
– Tim Pietzcker
15 July 2010 в 22:22
__ содержит __
, является предикатом для проверки существования подстрок внутри строк.
– 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))
a, b, c, d
, и эти значения известны во время компиляции, поэтому семантически правильное решение будет заключаться в использовании неизменяемого типа. Во-вторых, это связано с повышением производительности / эффективности при использовании кортежей, и я не помню подробностей, но вы ожидаете, что кортежи будут использовать меньше памяти и быстрее создавать экземпляр. – Jesse Dhillon 15 July 2010 в 22:45