如何优化这些python函数?

如何优化这些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

“”“ 我有三个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 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]:谢谢!我得到了你的建议。这些代码是由其他人编写的,在很多地方都有使用,但我会尝试重新构造它。谢谢!我听了你的建议。这些代码是别人写的,在很多地方都有使用,但我会尝试重新构造它。