将功能组合在一个文件中

时间:2013-11-05 21:17:49

标签: python function printing

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

基本上,我做错了什么?

1 个答案:

答案 0 :(得分:0)

请参阅Is file object in python an iterable

File objects are iterators,这意味着一旦文件被迭代完成,除非通过调用file.seek(0)将文件重置为文件的开头,否则不能再次遍历该文件。

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

但是,当您将computetax()totaltake()放在一起时,totaltake()会自行调用,然后再次调用computetax()。由于infilehandle已在第一次调用totaltake()时迭代完成,因此第二次不输入for循环,并返回total的初始值0

由于totaltake()返回的值不应更改,因此您应修改computetax(),以便将total作为参数传递,而不是调用totaltake()。您应该这样做,以便它还需要tips作为参数,而不是重新计算值。

如果您无法修改computetake(),您还可以通过在infilehandle的开头添加infilehandle.seek(0)来寻找totaltake()的开头,以便再次进行迭代