0
infilehandle = open ("receipts-10-28-13.txt", "r")

# FUNCTIONS

def stripsigns( astring ):
    """Remove dollar signs"""
    signs = "$"
    nosigns = ""
    for numbers in astring:
        if numbers not in signs:
            nosigns = nosigns + numbers
    return nosigns

def totaltake():
    """Calculate total take"""
    total = 0
    for line in infilehandle:
        values = line.split(':')
        cardnumbers = values[1]
        cardnumbers = stripsigns(cardnumbers)
        total = (total + eval(cardnumbers))
        total = round(total,2)
    return total

# more code etc

def computetax(rate, total):
    total = totaltake() - totaltip()
    taxed = total * rate
    taxed = round(taxed,2)
    return taxed

# more code etc

# VARS

total = totaltake()
tips = totaltip()
tax = computetax(rate,total)

rate = eval(input("Input the tax rate as an integer:"))

# PRINT

print("Total take: $", totaltake())
print("Total tips: $", totaltips())
print("Tax owed: $", computetax(rate,total))

我正在尝试创建一个文件,该文件将查看 txt 文件中的元素,然后根据文件中的数字进行计算。这些函数都是 totaltake() 的变体,它从文件中获取数字并找到总和,或者是 computetax(),它获取其他函数计算和乘/除/等的数字。我已经单独测试了所有功能并且它们都可以工作,但是当我尝试将它们放在一个文件中时,它并没有给我想要的输出,我不知道为什么。它打印 vars 列表中第一个的值,其他所有内容为 0 - 所以对于我上面的代码版本,它打印

Total take: $ 6533.47
Total tips: $ 0
Tax owed: $ 0

所以基本上,我做错了什么?

4

1 回答 1

0

请参阅python 中的文件对象是否是可迭代的

文件对象是迭代器,这意味着一旦文件被迭代完成,您不能再次迭代文件,除非它已通过调用重置到文件的开头file.seek(0)

当您只调用 时totaltake(),因为infilehandle尚未迭代,for 循环会遍历 中的所有行infilehandle,这就是您得到预期结果的原因。

但是,当您将 , 放在computetax()一起时totaltake()totaltake()它会被自己调用,然后再被调用computetax()。因为infilehandle第一次调用已经迭代完成totaltake(),所以第二次不进入for循环,返回初始值 for total, 0, 。

由于返回的值totaltake()不应该改变,您应该修改computetax()以便您可以total作为参数传递而不是调用totaltake(). 您应该这样做,以便它也tips作为参数而不是重新计算值。

如果不能修改computetake(),也可以infilehandle通过添加infilehandle.seek(0)到开头来寻找到开头totaltake(),允许再次迭代。

于 2013-11-05T21:56:39.953 回答