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

Joh*_*ohn 0 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()
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 7

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


首先,有一个IndentationError:

myfile = open('xyz.txt', 'w')
    for w in b:
    myfile.write('%d' (printme(w)))
Run Code Online (Sandbox Code Playgroud)

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

myfile = open('xyz.txt', 'w')
for w in b:
    myfile.write('%d' (printme(w)))
Run Code Online (Sandbox Code Playgroud)

如果你修复它,你的下一个错误将是a TypeError,但它将是'str' object is not callable,而不是任何有关字符缓冲区对象的错误.

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

'%d' (printme(w))
Run Code Online (Sandbox Code Playgroud)

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


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

'%d' % (printme(w))
Run Code Online (Sandbox Code Playgroud)

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

'%d' % (printme(w),)
Run Code Online (Sandbox Code Playgroud)

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


现在我们已经接近了,但是我们还有另外一个问题:printme不返回数字,它打印一个数字,然后返回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)
Run Code Online (Sandbox Code Playgroud)

当然,一个名为printme而不是返回值的函数有点误导,所以你可能想要在此时重命名它...


如果你解决了这个问题,那么一切正常.没有任何TypeError说法expected a character buffer object.

最有可能的是,在您的实际代码中,您正在尝试获取write的值printme,不是先将其格式化为字符串(使用该%运算符或其他方式).例如,如果您这样做:

myfile.write(printme(w))
Run Code Online (Sandbox Code Playgroud)

...那是试图写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()
Run Code Online (Sandbox Code Playgroud)