字典映射中的表达式
Expressions in a dictionary mapping
我有一系列如下形式的条件:
if ':' in particle:
do something
elif 'eq' in particle:
do something else
elif 'lt' in particle:
do another thing
elif 'le' in particle:
etc.
elif 'gt' in particle:
etc., etc.
elif 'ge' in particle:
etc., etc., etc.
elif 'ne' in particle:
more etc.
我想使用字典映射模式来实现它,但键有问题。
我试过这个:
def case_evaluator(particle):
switcher = {
':' in particle: do something,
'eq' in particle: do something else,
'lt' in particle: do another thing,
...
}
return switcher.get(particle, "nothing")
但是,我不断得到 "nothing." 怎么可能什么都没有?
这看起来应该很简单,但是......
你走在正确的轨道上。这称为函数分派。
它需要看起来更像这样:
def case_evaluator(particle):
switcher = {
':': do_something,
'eq': do_something_else,
'lt': do_another_thing,
...
}
return switcher.get(particle, lambda: "nothing")()
其中do_something等都是不带参数的函数。 lambda x: "nothing"
是一个 lambda 函数,它总是 returns "nothing"——如果 switcher.keys()
中找不到 particle
,它是默认调用的函数。
您可能想要一个将字符映射到函数的字典。
char_function_dict = {
':': colon_function,
'eq': eq_function,
'lt': lt_function
# ...and so on...
}
然后,您可以遍历此字典中的键值对。
def apply_function(particle):
for char, function in char_function_dict.items():
if char in particle:
function()
但是请注意,此结构并未真正使用任何特定于词典的内容,也未保留检查字符的顺序。使用 2 元素元组列表可能会更简单。
char_functions = [
(':', colon_function),
('eq', eq_function),
('lt', lt_function)
# ...and so on...
]
def apply_function(particle):
for char, function in char_functions:
if char in particle:
function()
break # so successive functions are not run
设置这些结构中的任何一个以允许将参数 and/or 关键字参数传递给函数很容易:
def apply_function(particle, *args, **kwargs):
for char, function in char_functions:
if char in particle:
function(*args, **kwargs)
break
我有一系列如下形式的条件:
if ':' in particle:
do something
elif 'eq' in particle:
do something else
elif 'lt' in particle:
do another thing
elif 'le' in particle:
etc.
elif 'gt' in particle:
etc., etc.
elif 'ge' in particle:
etc., etc., etc.
elif 'ne' in particle:
more etc.
我想使用字典映射模式来实现它,但键有问题。
我试过这个:
def case_evaluator(particle):
switcher = {
':' in particle: do something,
'eq' in particle: do something else,
'lt' in particle: do another thing,
...
}
return switcher.get(particle, "nothing")
但是,我不断得到 "nothing." 怎么可能什么都没有?
这看起来应该很简单,但是......
你走在正确的轨道上。这称为函数分派。 它需要看起来更像这样:
def case_evaluator(particle):
switcher = {
':': do_something,
'eq': do_something_else,
'lt': do_another_thing,
...
}
return switcher.get(particle, lambda: "nothing")()
其中do_something等都是不带参数的函数。 lambda x: "nothing"
是一个 lambda 函数,它总是 returns "nothing"——如果 switcher.keys()
中找不到 particle
,它是默认调用的函数。
您可能想要一个将字符映射到函数的字典。
char_function_dict = {
':': colon_function,
'eq': eq_function,
'lt': lt_function
# ...and so on...
}
然后,您可以遍历此字典中的键值对。
def apply_function(particle):
for char, function in char_function_dict.items():
if char in particle:
function()
但是请注意,此结构并未真正使用任何特定于词典的内容,也未保留检查字符的顺序。使用 2 元素元组列表可能会更简单。
char_functions = [
(':', colon_function),
('eq', eq_function),
('lt', lt_function)
# ...and so on...
]
def apply_function(particle):
for char, function in char_functions:
if char in particle:
function()
break # so successive functions are not run
设置这些结构中的任何一个以允许将参数 and/or 关键字参数传递给函数很容易:
def apply_function(particle, *args, **kwargs):
for char, function in char_functions:
if char in particle:
function(*args, **kwargs)
break