在Python中返回许多不带字典的变量
我有一个函数在Python中返回许多不带字典的变量,python,dictionary,return,Python,Dictionary,Return,我有一个函数compute\u params(),它计算许多我想在另一个函数中使用的变量,比如main\u func()。目前,我的代码类似于: def compute_params(i): a = i/2 b = a + 2. c = 2*a/b - 1. d = a + b + c e = ((a + 1.)**2 - d)/c # ...and so on with more complex computations and more var
compute\u params()
,它计算许多我想在另一个函数中使用的变量,比如main\u func()
。目前,我的代码类似于:
def compute_params(i):
a = i/2
b = a + 2.
c = 2*a/b - 1.
d = a + b + c
e = ((a + 1.)**2 - d)/c
# ...and so on with more complex computations and more variables.
return a, b, c, d, e
def main_func(imax):
for i in range(imax):
a, b, c, d, e = compute_params(i)
# Do something with a, b, c, ...
我的问题是:
- 考虑到速度问题,返回并获取5、10个变量(或者在我的实际函数中更多)是否是一个问题
- 如果第一个问题的答案是肯定的,那么考虑到我需要将实数变量名保存在
中(将它们放在大方程式中),如何简单地使用字典或类似的工具来实现这一点main\u func()
compute_-params()
在代码中的不同位置使用,这就是为什么它的内容没有直接包含在main_-func()
中的原因
编辑回答我的几个建议:我想避免使用类或字典,因为(1)我的变量唯一的共同点是在同一个等式中有用,因此没有逻辑理由将它们分组到一个对象中,最重要的是(2)由于这些系数在复杂的方程中出现了数百次,读起来已经很痛苦,我想避免像
params.a+params.b/params.c
这样的事情,我现在只写a+b/c
,这就是人们发明面向对象编程的原因之一,相同的变量可以与一组函数相关。这就是人们发明面向对象编程的原因之一,在面向对象编程中,相同的变量可以与一组函数相关。这本身并没有速度问题。如果这段代码在一个紧密的循环中,系统运行速度太慢,无法满足您的需要,您使用了探查器,发现问题就在这里,那么可能存在问题。这根本不是我第一个想要提高速度的地方
也就是说:这是不可读的代码。您需要更好的变量名,并且传递大量的变量而没有更多的结构,这是错误代码的标志。“计算参数”本身也是毫无意义的;什么样的情人
这些变量不是有意义吗?它们不能被分成一个或几个类吗
我想你会发现,如果你能把它们中的一些组合到一个命名良好的类中,你想做的一些计算结果自然会适合作为该类的方法。但至少,您可以只交给类实例,而不必到处重复冗长的变量列表。这本身并不存在速度问题。如果这段代码在一个紧密的循环中,系统运行速度太慢,无法满足您的需要,您使用了探查器,发现问题就在这里,那么可能存在问题。这根本不是我第一个想要提高速度的地方 也就是说:这是不可读的代码。您需要更好的变量名,并且传递大量的变量而没有更多的结构,这是错误代码的标志。“计算参数”本身也是毫无意义的;什么样的情人 这些变量不是有意义吗?它们不能被分成一个或几个类吗
我想你会发现,如果你能把它们中的一些组合到一个命名良好的类中,你想做的一些计算结果自然会适合作为该类的方法。但至少,您可以只传递类实例,而不必到处重复冗长的变量列表。如果您不喜欢传递许多变量,您可以尝试使用
命名的tuple
。然后,您只需传递命名的整数,仍然可以很好地处理变量,而无需解压缩列表:
from collections import namedtuple
variables = namedtuple('variables', ['a', 'b', 'c', 'd', 'e'])
var = variables(1,2,3,4,5)
var.a # 1
var.b # 5
如果您不喜欢传递许多变量,可以尝试使用名为tuple的
变量。然后,您只需传递命名的整数,仍然可以很好地处理变量,而无需解压缩列表:
from collections import namedtuple
variables = namedtuple('variables', ['a', 'b', 'c', 'd', 'e'])
var = variables(1,2,3,4,5)
var.a # 1
var.b # 5
根据计算参数的方式,一个选项是一个简单的类:
class Params(object):
def __init__(self, i):
self.a = i / 2.0
self.b = self.a + 2
self.c = (2 * (self.a / self.b)) - 1.
self.d = self.a + self.b + self.c
self.e = (((self.a + 1) ** 2) - self.d) / self.c
然后可以传递该类的单个实例:
def main_func(imax):
for i in range(imax):
params = Params(i)
# use e.g. params.a in an equation
或者,使用字典可能类似于:
def create_params(i):
params = {'a': i / 2.0}
params['b'] = params['a'] + 2
params['c'] = (2 * (params['a'] / params['b'])) - 1
params['d'] = params['a'] + params['b'] + params['c']
params['e'] = (((params['a'] + 1) ** 2) - params['d']) / params['c']
return params
然后可以通过以下键轻松访问:
def main_func(imax):
for i in range(imax):
params = create_params(i)
# use e.g. params['a'] in an equation
或者,如果您有一个接受参数(或某个子集)的函数,则可以直接将字典解压缩到其中:
def func(a, d, **kwargs): # kwargs mops up unused parameters
# does stuff with a and d
return result
result = func(**params)
根据计算参数的方式,一个选项是一个简单的类:
class Params(object):
def __init__(self, i):
self.a = i / 2.0
self.b = self.a + 2
self.c = (2 * (self.a / self.b)) - 1.
self.d = self.a + self.b + self.c
self.e = (((self.a + 1) ** 2) - self.d) / self.c
然后可以传递该类的单个实例:
def main_func(imax):
for i in range(imax):
params = Params(i)
# use e.g. params.a in an equation
或者,使用字典可能类似于:
def create_params(i):
params = {'a': i / 2.0}
params['b'] = params['a'] + 2
params['c'] = (2 * (params['a'] / params['b'])) - 1
params['d'] = params['a'] + params['b'] + params['c']
params['e'] = (((params['a'] + 1) ** 2) - params['d']) / params['c']
return params
然后可以通过以下键轻松访问:
def main_func(imax):
for i in range(imax):
params = create_params(i)
# use e.g. params['a'] in an equation
或者,如果您有一个接受参数(或某个子集)的函数,则可以直接将字典解压缩到其中:
def func(a, d, **kwargs): # kwargs mops up unused parameters
# does stuff with a and d
return result
result = func(**params)
你(有点)想要宏吗
你可以试试。你(有点)想要宏吗
您可以尝试。严格来说,您不会返回多个值,而是返回一个元组。
元组返回(a、b、c…)太多的参数和/或返回值通常被认为是一种代码味道-您是否可以将这些参数封装在其他东西中(是的,包括字典)?@Matthias我知道这个微妙之处,但除非Python中有一种方法可以真正返回函数中的多个值,否则我想不区分返回多个变量和返回一个元组是合理的。@jonrsharpe我在问题中添加了一点来回答这个建议(我在回答的第一条评论中表达了同样的想法)。严格来说,您不会返回多个值,而是返回一个元组。作为元组返回(a、b、c…)很容易。太多的参数和/或返回值通常被认为是代码味道-您能将这些参数封装在其他东西中吗(是的,包括字典)?@Matt