在for循环中保存函数调用的值

时间:2014-02-18 10:03:57

标签: python

我想在txt文件中保存函数调用的值但是我得到了typeerror:期望一个字符缓冲区对象

def printme( x ):
    "Function f(x) = x(x+2)"
    print x*(x+2)
    return

myfile = open('xyz.txt', 'w')
    for w in b:
        myfile.write('%d' (printme(w)))

myfile.close()

2 个答案:

答案 0 :(得分:7)

您的代码至少有四个问题已发布,并且没有一个会显示您实际看到的错误。


首先,有一个IndentationError

myfile = open('xyz.txt', 'w')
    for w in b:
    myfile.write('%d' (printme(w)))

您不能随意随意缩进代码; for语句在赋值语句之后,myfile.write调用应该在for循环内。所以:

myfile = open('xyz.txt', 'w')
for w in b:
    myfile.write('%d' (printme(w)))

如果你解决了这个问题,你的下一个错误将是TypeError,但它将是'str' object is not callable,而不是关于字符缓冲区对象的任何错误。

在Python中,foo (bar)形式的任何内容都是函数调用 - 尝试像函数一样调用foobar作为唯一参数。所以,这个表达式:

'%d' (printme(w))

...尝试将字符串'%d'作为函数调用,将printme(w)的结果作为唯一参数传递。这显然不会起作用,因为字符串不像函数那样可调用。因此例外。


你可能想在那里使用%运算符,如下所示:

'%d' % (printme(w))

这很接近,但仍然不太正确,因为(printme(w))不是一个值的元组。元组由逗号创建,而不是由括号创建,因此一个值的元组必须包含逗号。所以:

'%d' % (printme(w),)

(这里你实际上并不需要一个元组,因为%对单个值有特殊处理。但如果你尝试来创建一个元组元组,你应该把它弄好,不要弄错,让你的代码可能仍然有用......)


现在我们已经接近了,但是我们遇到了另一个问题:printme没有返回数字,打印一个数字,然后返回{{1} }。 (这是你从None不同的任何函数得到的默认值。)因此,return运算符会给你另一个%,这次是TypeError }。

要解决此问题,您需要'%d" format: a number is required, not NoneType值而不是(或除此之外)打印它:

return

当然,一个名为def printme( x ): "Function f(x) = x(x+2)" return x*(x+2) 的函数返回一个值有点误导,所以你可能想在此时重命名...


如果你解决了这个问题,那么一切正常。任何地方都没有printme TypeError

最有可能的是,在您的实际代码中,您尝试expected a character buffer objectwrite获得的值,没有格式化它首先进入字符串(使用printme运算符或其他)。例如,如果您这样做:

%

...要么试图写myfile.write(printme(w)) (如果你没有解决最后一个问题)或某个数字(如果你做的话),那么它们都不是字符串(或其他“字符缓冲对象”),因此错误。

要解决这个问题,只需使用您展示给我们的代码而不是代码。


总而言之,这里的工作代码可以完成您正在尝试做的事情:

None

答案 1 :(得分:1)

我认为这就是你想要的

def printme( x ):
    "Function f(x) = x(x+2)"
    return x*(x+2)

b = [1,2,3,4,5]

myfile = open('xyz.txt', 'w')

for w in b:
    myfile.write(str(printme(w)))
    myfile.write("\n")

# !!! EDIT !!!
myfile.close()