我想在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()
答案 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)
形式的任何内容都是函数调用 - 尝试像函数一样调用foo
,bar
作为唯一参数。所以,这个表达式:
'%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 object
从write
获得的值,没有格式化它首先进入字符串(使用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()