解包不同数量的变量
Unpacking different numbers of variables
我想制作一个函数,它可以灵活地解包输入变量的数量。
更具体地说,例如我有以下内容:
def flexi_func(vars):
func_var_a, func_var_b, func_var_c, func_var_d = vars
#do something
my_vars = [var_a, var_b, var_c, var_d]
flexi_func(my_vars)
如果输入变量的数量为 4,则此方法工作正常。但是假设我想让相同的函数只对三个或两个输入变量进行操作。假设 'do something' 位已经是灵活的。然后解压我可以写的变量
def flexi_func(vars):
if len(vars) == 4:
func_var_a, func_var_b, func_var_c, func_var_d = vars
elif len(vars) == 3:
func_var_a, func_var_b, func_var_c = vars
elif len(vars) == 2:
func_var_a, func_var_b = vars
#do something
这也很好用。这对我来说似乎有点笨拙,特别是如果我有 N>4 个变量。是否有更简洁、更 Pythonic 的方式来解包元组,以便我可以使用解包的变量?
我从 this question 知道我可以做这样的事情(在 Python 3):
foo, bar, *other = func()
但我需要做更多的工作才能访问 other
中的内容,所以它并不比我的 if...elif...
方法好。
首先,针对要求提供上下文或可能需要这样做的具体示例的评论,我承认在我能想到的几乎所有情况下都应该可以完全避免拆包。这也适用于我原来的问题 - 可以修改函数的 do something
部分以通过列表索引访问项目。
但是,原则上,我确信存在需要解包的情况,即使只是为了清楚起见。下面是我能找到的为每个输入项分配变量的最佳方法。答案 here and here.
中给出了更多背景细节
def flexi_func(var_list):
for i, var in enumerate(var_list):
vars()['my_func_{}'.format(i)] = var
#do something
return
这会将每个输入变量分配给 vars()
内置字典。这比 globals()
内置字典更可取,并且与 locals()
内置字典不同,它是可写的。要访问 do something
部分中的变量,您必须像这样引用字典:print(vars()['my_func_2'])
.
最后,如果你想使用字母而不是数字作为变量标签(就像我在问题陈述中所做的那样),你可以将 alphabet = [chr(i) for i in range(ord('a'),ord('z')+1)]
添加到函数的顶部并调用变量 'my_func_{}'.format(alphabet[i])
.
我想制作一个函数,它可以灵活地解包输入变量的数量。
更具体地说,例如我有以下内容:
def flexi_func(vars):
func_var_a, func_var_b, func_var_c, func_var_d = vars
#do something
my_vars = [var_a, var_b, var_c, var_d]
flexi_func(my_vars)
如果输入变量的数量为 4,则此方法工作正常。但是假设我想让相同的函数只对三个或两个输入变量进行操作。假设 'do something' 位已经是灵活的。然后解压我可以写的变量
def flexi_func(vars):
if len(vars) == 4:
func_var_a, func_var_b, func_var_c, func_var_d = vars
elif len(vars) == 3:
func_var_a, func_var_b, func_var_c = vars
elif len(vars) == 2:
func_var_a, func_var_b = vars
#do something
这也很好用。这对我来说似乎有点笨拙,特别是如果我有 N>4 个变量。是否有更简洁、更 Pythonic 的方式来解包元组,以便我可以使用解包的变量?
我从 this question 知道我可以做这样的事情(在 Python 3):
foo, bar, *other = func()
但我需要做更多的工作才能访问 other
中的内容,所以它并不比我的 if...elif...
方法好。
首先,针对要求提供上下文或可能需要这样做的具体示例的评论,我承认在我能想到的几乎所有情况下都应该可以完全避免拆包。这也适用于我原来的问题 - 可以修改函数的 do something
部分以通过列表索引访问项目。
但是,原则上,我确信存在需要解包的情况,即使只是为了清楚起见。下面是我能找到的为每个输入项分配变量的最佳方法。答案 here and here.
中给出了更多背景细节def flexi_func(var_list):
for i, var in enumerate(var_list):
vars()['my_func_{}'.format(i)] = var
#do something
return
这会将每个输入变量分配给 vars()
内置字典。这比 globals()
内置字典更可取,并且与 locals()
内置字典不同,它是可写的。要访问 do something
部分中的变量,您必须像这样引用字典:print(vars()['my_func_2'])
.
最后,如果你想使用字母而不是数字作为变量标签(就像我在问题陈述中所做的那样),你可以将 alphabet = [chr(i) for i in range(ord('a'),ord('z')+1)]
添加到函数的顶部并调用变量 'my_func_{}'.format(alphabet[i])
.