Вы можете использовать это регулярное выражение (любые пробелы или любые небелые пробелы) как можно дольше и вплоть до 0.
[\s\S]*
Это выражение будет соответствовать как можно меньше, но как многие, необходимые для остальной части выражения.
[\s\S]*?
Например, в этом регулярном выражении [\s\S]*?B
будет соответствовать aB
в aBaaaaB
. Но в этом регулярном выражении [\s\S]*B
будет соответствовать aBaaaaB
в aBaaaaB
.
Вы могли использовать словарь:
def f(x):
return {
'a': 1,
'b': 2,
}[x]
Мне всегда нравилось делать его этот путь
result = {
'a': lambda x: x * 5,
'b': lambda x: x + 7,
'c': lambda x: x - 2
}[value](x)
Если Вы хотели бы значения по умолчанию, Вы могли бы использовать словарь get(key[, default])
метод:
def f(x):
return {
'a': 1,
'b': 2
}.get(x, 9) # 9 is default if x not found
Если Вы действительно просто возвращаете предопределенное, фиксированное значение, Вы могли бы создать словарь со всеми возможными входными индексами как ключи, наряду с их соответствующими значениями. Кроме того, Вы не могли бы действительно хотеть, чтобы функция сделала это - если Вы не вычисляете возвращаемое значение так или иначе.
, О, и если Вы испытываете желание делать что-то подобное переключателю, см. здесь .
В дополнение к методам словаря (который я действительно как, BTW), можно также использовать if-elif-else для получения функциональности переключателя/случая/значения по умолчанию:
if x == 'a':
# Do the thing
elif x == 'b':
# Do the other thing
if x in 'bc':
# Fall-through by not using elif, but now the default case includes case 'a'!
elif x in 'xyz':
# Do yet another thing
else:
# Do the default
Это, конечно, не идентично переключателю/случаю - Вы не можете иметь, проваливаются так же легко как бросающий повреждение; оператор, но у Вас может быть более сложный тест. Его форматирование более хорошо, чем серия вложенной IFS, даже при том, что функционально вот что это значит ближе к.
подробно останавливаясь "dict как переключатель" идея. если Вы хотите использовать значение по умолчанию для своего переключателя:
def f(x):
try:
return {
'a': 1,
'b': 2,
}[x]
except KeyError:
return 'default'
Существует шаблон, который я узнал из Скрученного кода Python.
class SMTP:
def lookupMethod(self, command):
return getattr(self, 'do_' + command.upper(), None)
def do_HELO(self, rest):
return 'Howdy ' + rest
def do_QUIT(self, rest):
return 'Bye'
SMTP().lookupMethod('HELO')('foo.bar.com') # => 'Howdy foo.bar.com'
SMTP().lookupMethod('QUIT')('') # => 'Bye'
можно использовать его любое время, которое необходимо диспетчеризировать на маркере и выполнить расширенную часть кода. В конечном автомате Вы имели бы state_
методы и отправка на self.state
. Этот переключатель может быть чисто расширен путем наследования базовому классу и определения собственного do_
методы. Часто времена Вы не будете даже иметь do_
методы в базовом классе.
Редактирование: как точно то, который использовал
В случае SMTP, Вы получите HELO
от провода. Соответствующие нормы (от twisted/mail/smtp.py
, измененный для нашего случая) похожи на это
class SMTP:
# ...
def do_UNKNOWN(self, rest):
raise NotImplementedError, 'received unknown command'
def state_COMMAND(self, line):
line = line.strip()
parts = line.split(None, 1)
if parts:
method = self.lookupMethod(parts[0]) or self.do_UNKNOWN
if len(parts) == 2:
return method(parts[1])
else:
return method('')
else:
raise SyntaxError, 'bad syntax'
SMTP().state_COMMAND(' HELO foo.bar.com ') # => Howdy foo.bar.com
, Вы получите ' HELO foo.bar.com '
(или Вы могли бы добраться 'QUIT'
или 'RCPT TO: foo'
). Это маркируется в [1 111] как [1 112]. Фактическое имя поиска метода взято от [1 113].
(Исходный метод также называют state_COMMAND
, потому что он использует тот же шаблон для реализации конечного автомата, т.е. getattr(self, 'state_' + self.mode)
)
Решения, которые я использую:
Комбинация из 2 решений, размещенных здесь, относительно легко читаемая и поддерживающая значения по умолчанию.
result = {
'a': lambda x: x * 5,
'b': lambda x: x + 7,
'c': lambda x: x - 2
}.get(whatToUse, lambda x: x - 22)(value)
где
.get('c', lambda x: x - 22)(23)
ищет «лямбда x: x - 2»
в словарном коде и использует его с x = 23
.get('xxx', lambda x: x - 22)(44)
не находит его в слове и использует по умолчанию «лямбда x: x - 22»
с x = 44
.