Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中返回许多不带字典的变量_Python_Dictionary_Return - Fatal编程技术网

在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