从python 3.5中的函数返回多个值[重复]

Posted

技术标签:

【中文标题】从python 3.5中的函数返回多个值[重复]【英文标题】:Returning multiple values from function in python 3.5 [duplicate] 【发布时间】:2016-09-26 23:55:14 【问题描述】:

我正在尝试从下面的“year_calc”函数(Python 3.5)返回值方面获得一些帮助。本质上,代码用于返回“b”,因为我需要为每次迭代将“b”的新起始值传递给“year_calc”——我可以让它正常工作。但是,我希望返回每个 year_calc 迭代中的“total_cost”值并将其相加直到完成。注意while循环下的“grand_total”。我意识到这不像所说的那样工作 - 只是添加它,这样它可能会增加我试图完成的事情的清晰度。我只是不确定如何提取正在返回的特定值。有什么见解吗?

def main():
    archive_total = float(input('Enter archive total (GB): '))
    transfer_rate = float(input('Enter transfer rate (Gbps): '))
    days_to_transfer = ((((archive_total*8/transfer_rate)/60)/60)/24)
    xfer_per_day = archive_total/days_to_transfer
    day_cost = xfer_per_day * 0.007 / 30
    days = 365
    total_days = 0
    sum = 0
    b = xfer_per_day * 0.007 / 30
    total_years = 1
    grand_total = 0.0
    total_cost = 0.0
    while total_years < years_to_transfer + 1:
        b = year_calc(day_cost, days, total_days, sum,b,total_years,total_cost)
        total_years += 1
        grand_total += total_cost

def year_calc(day_cost,days,total_days,sum,b,total_years,total_cost):
    while total_days < days -1:
        b += day_cost
        sum += b
        total_days += 1
        total_cost = sum + day_cost
    print('Year',total_years,'cost: $', format(sum + day_cost, ',.2f'))
    return (b, total_cost)

main()

【问题讨论】:

认为你想要b, total_cost = year_calc(day_cost, days, total_days, sum,b,total_years,total_cost)。但我不确定你为什么将total_cost 作为参数传递给year_calc。顺便说一句,您不需要 return (b, total_cost) 中的括号。此外,您不应该使用sum 作为变量名,因为这会影响内置的sum 函数。除非您尝试在重新定义它的函数之一中使用 sum 函数,否则这里不会有任何伤害。 【参考方案1】:

如果我正确理解你的描述,这实现了你想要的:

def main():
    # ...
    total_cost = 0.0
    while total_years < years_to_transfer + 1:
        b, total_cost = year_calc(day_cost, days, total_days, sum,b,total_years,total_cost)
        # ...

def year_calc(day_cost,days,total_days,sum,b,total_years,total_cost):
    # ...
    return (b, total_cost)

main()

【讨论】:

【参考方案2】:

year_calc 与任何返回多个项目的函数一样,将在一个元组中返回其值。因此,您可以更改此行:

b = year_calc(day_cost, days, total_days, sum,b,total_years,total_cost)

到这个:

b, total_cost = year_calc(day_cost, days, total_days, sum,b,total_years)

这是因为 Python 处理多重赋值的方式:

>> a, b = 1,2
>> print a
1
>> print b
2

顺便说一句,您应该尽量避免为变量使用像sum 这样的内置名称。而且我不确定years_to_transfer 是什么——你是否在代码的其他地方定义了它?

【讨论】:

【参考方案3】:

嗯,看起来有点像尝试在 Python 中编写 VBA... :-)

好的,首先:我认为您不想将 total_cost 传递给函数 year_calc,因为您不依赖于获得的任何值。所以从定义行中删除它:

def year_calc(day_cost,days,total_days,sum,b,total_years):
    ...

下一步:计算 total_cost 的新值并从函数返回一个元组。说的很对。

现在,当调用 year_calc 时,您应该从调用函数中删除 total_cost 变量。但是你应该记住你返回的是一个元组,所以将值赋给一个元组:

(b, total_cost) = year_calc(day_cost, days, total_days, sum,b,total_years)

底线:没有 ref 变量(或输出变量,...)要在 python 的函数中发送。输入参数,仅此而已。如果要返回 2 个不同的计算,请返回一个元组,但也将值分配给一个元组。干净多了。

【讨论】:

以上是关于从python 3.5中的函数返回多个值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python 3.5 TypeError:参数有多个值[重复]

如何从 Python 中的函数返回多个值? [复制]

从函数返回多个值[重复]

从函数调用分配多个返回值的性能[重复]

如何使用具有多个返回值的python赋值运算符

从c#中的方法返回多个值[重复]