如何优化这些python函数?
“”“ 我有三个python函数:a()、b()、c(),它们的流程几乎相同。不同之处在于“x”、“y”、“z”,这三个函数只是函数名或变量名的一部分。 如何才能友好优雅地编写这些函数? “”“如何优化这些python函数?,python,design-patterns,optimization,Python,Design Patterns,Optimization,“”“ 我有三个python函数:a()、b()、c(),它们的流程几乎相同。不同之处在于“x”、“y”、“z”,这三个函数只是函数名或变量名的一部分。 如何才能友好优雅地编写这些函数? “”“ 最好的方法不仅仅是重写这些函数,而是重新构造它们使用的各种项,方法是将它们从名称中带有x、y或z的变量更改为存储在将字符串“x”、“y”和“z”映射到适当内容的结构中的项。大概是这样的: do_funcs = {'x': do_x, 'y': do_y, 'z': do_z} # make ids wh
最好的方法不仅仅是重写这些函数,而是重新构造它们使用的各种项,方法是将它们从名称中带有x、y或z的变量更改为存储在将字符串“x”、“y”和“z”映射到适当内容的结构中的项。大概是这样的:
do_funcs = {'x': do_x, 'y': do_y, 'z': do_z}
# make ids whatever is in var1
# but with the keys as "x", "y", "z" instead of "x_id", "y_id", "z_id"
ids = {}
# make resu;ts whatever is in var2
# but with the keys as "x", "y", "z" instead of "x_result", "y_result", "z_result"
results = {}
processes = {'x': x_process, 'y': y_process, 'z': z_process}
然后您可以编写一个函数:
def do_stuff(which):
do_funcs[which]()
some = ids[which]
results[which] = processes[which]()
def do_something(do_fun, id1, id2, process_fun):
do_fun()
some = var1[id1]
var2[id2] = process_fun()
do_something(do_x, 'x_id', 'x_result', x_process)
然后你调用dou-stuff('x')
,dou-stuff('y')
,或者dou-stuff('z')
这只是一个草图,因为如何做到最好取决于其他东西的定义和使用方式。不过,其基本思想是不使用部分变量名作为参数。如果你发现自己有一大堆东西叫做
x_blah
,y_blah
和z_blah
,甚至像“x_id”
和“y_id”
这样的dict键,你应该尝试重新构造这些东西,使它们成为由单个值直接参数化的数据结构(例如,字符串“x”
,“y”
或“z”
)。最好的方法不仅仅是重写这些函数,而是重新构造它们使用的各种项,将它们从名称中带有x、y或z的变量更改为存储在将字符串“x”、“y”和“z”映射到适当内容的结构中的项。大概是这样的:
do_funcs = {'x': do_x, 'y': do_y, 'z': do_z}
# make ids whatever is in var1
# but with the keys as "x", "y", "z" instead of "x_id", "y_id", "z_id"
ids = {}
# make resu;ts whatever is in var2
# but with the keys as "x", "y", "z" instead of "x_result", "y_result", "z_result"
results = {}
processes = {'x': x_process, 'y': y_process, 'z': z_process}
然后您可以编写一个函数:
def do_stuff(which):
do_funcs[which]()
some = ids[which]
results[which] = processes[which]()
def do_something(do_fun, id1, id2, process_fun):
do_fun()
some = var1[id1]
var2[id2] = process_fun()
do_something(do_x, 'x_id', 'x_result', x_process)
然后你调用dou-stuff('x')
,dou-stuff('y')
,或者dou-stuff('z')
这只是一个草图,因为如何做到最好取决于其他东西的定义和使用方式。不过,其基本思想是不使用部分变量名作为参数。如果你发现自己有一大堆东西叫做
x_blah
,y_blah
和z_blah
,甚至像“x_id”
和“y_id”
这样的dict键,你应该尝试重新构造这些东西,使它们成为由单个值直接参数化的数据结构(例如,字符串“x”
,“y”
或“z”
)。这三个函数基本相同,只是它们调用了哪些函数以及使用了哪些映射索引。因此,您可以将被调用函数和映射索引作为参数传递给统一函数:
def do_stuff(which):
do_funcs[which]()
some = ids[which]
results[which] = processes[which]()
def do_something(do_fun, id1, id2, process_fun):
do_fun()
some = var1[id1]
var2[id2] = process_fun()
do_something(do_x, 'x_id', 'x_result', x_process)
这三个函数基本相同,只是它们调用了哪些函数,以及使用了哪些映射索引。因此,您可以将被调用函数和映射索引作为参数传递给统一函数:
def do_stuff(which):
do_funcs[which]()
some = ids[which]
results[which] = processes[which]()
def do_something(do_fun, id1, id2, process_fun):
do_fun()
some = var1[id1]
var2[id2] = process_fun()
do_something(do_x, 'x_id', 'x_result', x_process)
您可以使用lambda函数:
def a():
print 'a'
def b():
print 'b'
def c():
print 'c'
def a_process():
print 'a'
def b_process():
print 'b'
def c_process():
print 'c'
def func(x):
do = {'a':lambda: a(), 'b':lambda: b(), 'c':lambda:c()}
do[x]()
some = var1['{}_id'.format(x)]
process = {'a':lambda: a_process(), 'b':lambda: b_process(), 'c':lambda:c_process()}
var2['{}_result'.format(x)] = process[x]()
func('c')
您可以使用lambda函数:
def a():
print 'a'
def b():
print 'b'
def c():
print 'c'
def a_process():
print 'a'
def b_process():
print 'b'
def c_process():
print 'c'
def func(x):
do = {'a':lambda: a(), 'b':lambda: b(), 'c':lambda:c()}
do[x]()
some = var1['{}_id'.format(x)]
process = {'a':lambda: a_process(), 'b':lambda: b_process(), 'c':lambda:c_process()}
var2['{}_result'.format(x)] = process[x]()
func('c')
请看[这][1]篇文章。这可能会有帮助[1]:看看[1]这篇文章。这可能会有帮助[1]:谢谢!我得到了你的建议。这些代码是由其他人编写的,在很多地方都有使用,但我会尝试重新构造它。谢谢!我听了你的建议。这些代码是别人写的,在很多地方都有使用,但我会尝试重新构造它。