Python 在for循环中保存函数调用的值
我想将函数调用的值保存在txt文件中,但得到的是typeerror:需要一个字符缓冲区对象Python 在for循环中保存函数调用的值,python,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() 您发布的代码至少有四个问题,没有一个会显示您实际
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()
您发布的代码至少有四个问题,没有一个会显示您实际看到的错误 首先,有一个缩进错误: 你不能随意缩进你想要的代码;for语句紧跟赋值语句,myfile.write调用应该在for循环中。因此:
myfile = open('xyz.txt', 'w')
for w in b:
myfile.write('%d' (printme(w)))
如果您修复了这个错误,您的下一个错误将是TypeError,但它将是因为'str'对象是不可调用的,与字符缓冲区对象无关
在Python中,任何形式的foo-bar都是一个函数调用,它试图像调用函数一样调用foo,而bar是它唯一的参数。所以,这个表达式:
'%d' (printme(w))
…尝试将字符串“%d”作为函数调用,并将printmew的结果作为其唯一参数传递。这显然行不通,因为字符串不像函数那样可调用。因此有例外
您可能想在那里使用%运算符,如下所示:
'%d' % (printme(w))
这很接近,但仍然不完全正确,因为printmew不是一个值的元组。元组是由逗号而不是括号创建的,因此一个值的元组中必须有一个逗号。因此:
'%d' % (printme(w),)
这里实际上不需要元组,因为%对单个值有特殊处理。但是,如果您试图创建一个元组,那么您应该正确地使用它,而不是错误地使用它,并且让您的代码无论如何都能正常工作
现在我们接近了,但我们有另一个问题:printme不返回数字,它打印一个数字,然后不返回任何数字。这是从任何不返回不同内容的函数中获得的默认值。因此,%运算符将给出另一个TypeError,这一次表示“%d格式:需要一个数字,而不是NoneType
要解决此问题,您需要返回该值,而不是打印该值,或者在打印该值的同时返回该值:
def printme( x ):
"Function f(x) = x(x+2)"
return x*(x+2)
当然,名为printme的函数返回一个值有点误导,所以您可能希望在此时重命名它
如果你能解决这个问题,那么一切都能正常工作。表示任何地方都需要字符缓冲区对象时不存在TypeError
最有可能的情况是,在实际代码中,您试图写入从printme返回的值,而不首先使用%运算符或其他方式将其格式化为字符串。例如,如果您这样做:
myfile.write(printme(w))
…如果没有解决上一个问题,则尝试写入None,如果解决了,则尝试写入某个数字,这两个数字都不是字符串或其他字符缓冲区对象,因此出现错误
要解决这个问题,只需使用您向我们展示的代码,而不是不同的代码
总而言之,这里有一个工作代码,它完成了您显然想要做的事情:
def printme( x ):
"Function f(x) = x(x+2)"
return x*(x+2)
myfile = open('xyz.txt', 'w')
for w in b:
myfile.write('%d' % (printme(w),))
myfile.close()
我想这就是你想要的
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()
请发布带有回溯的实际错误,而不是它的描述。您只能将字符串写入文件。除此之外,printme函数不返回'anything',因此您试图在此时将'nothing'写入文件。首先,提示被破坏。请使用myfile.write{}.FormatPrintMe。您向我们展示的代码没有演示您描述的问题。它实际上引发了一个TypeError:“str”对象不可调用。这是因为其他任何东西都是作为函数对任何东西的调用,所以“%d”printmew是作为函数对“%d”的调用,这毫无意义。@GrijeshChauhan:您建议的代码不起作用。首先,您可能是指格式而不是格式化。第二,如果不添加{}占位符,则无法使用格式。您更改了他的代码尝试的输出格式。如果他不想在数字之间留空格,您会认为他希望在数字后面加一个换行符,而实际上由于忘记关闭文件而使代码变得更糟,而且没有解释你对他的代码所做的多次修改…啊!我错过了副本的最后一行:P对不起。关于\n我猜他会想要它的。这应该可以做到-thx。但是我的txt文件不显示任何特征线!我猜对了。如果你愿意,你可以在一行中完成。我已经分开了,因为这是我的添加。啊哈,对不起!!我使用的是linux,不需要\r:DWorks perf。-谢谢。如果我想在我正在迭代的列表b中的每个数字之间添加特征线,是否应将其添加到for循环中?@user2128383:是。因为您已经在使用%-格式,所以显而易见的方法是将其添加到格式字符串:myfile.write“%d\n”%printmew,。如果你想把它单独写出来,当然你可以这样做。
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()