从python 3.5中的函数返回多个值

Returning multiple values from function in python 3.5

本问题已经有最佳答案,请猛点这里访问。

我正在尝试从下面的"yearu calc"函数(python3.5)中获得一些返回值的帮助。本质上,代码用于返回"b",因为我需要一个新的"b"的起始值为每次迭代传递到"year_calc"-我可以让它工作得很好。但是,我希望每年计算迭代的"总成本"值返回并相加,直到完成为止。注意while循环下的"总计"。我意识到这并不是如前所述的那样有效——只需添加它,就可以让我想要完成的事情更加清晰。我只是不知道如何提取正在返回的特定值。有什么见解吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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()


嗯,似乎有点像用Python编写VBA…-)

好的,首先:我认为你不想把总成本传给功能年计算,因为你不依赖于你得到的任何价值。所以从定义行中删除它:

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

下一步:计算总成本的新值,并从函数返回一个元组。这是非常正确的。

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

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

底线:在Python的函数中没有要发送的引用变量(或输出变量,…)。输入参数,不需要更多。如果要返回两个不同的计算,请返回一个元组,但也要将该值赋给一个元组。干净多了。


与返回多个项的任何函数一样,year_calc将以元组的形式返回其值。因此,您只需更改此行:

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

对此:

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

这是因为python处理多个分配的方式:

1
2
3
4
5
>> a, b = 1,2
>> print a
1
>> print b
2

另一方面,您应该尽量避免对变量使用诸如sum这样的内置名称。我不知道years_to_transfer是什么——您在代码的其他地方定义了它吗?


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

1
2
3
4
5
6
7
8
9
10
11
12
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()