Python绘制正方形函数优化报错:'NoneType'对象不可调用求助
解决Python字符正方形绘制函数的错误问题
嘿,我来帮你搞定这个报错!你遇到的'NoneType' object is not callable错误,根源在于你误解了print()函数的返回值,以及quattrovolte()函数需要的参数类型。
错误原因分析
当你写secondariga = print("|", " "*12, "|", " "*12, "|")时,print()函数确实会输出指定内容,但它的返回值是None——也就是说,secondariga这个变量存储的不是一个可执行的打印操作,而是None。而你的quattrovolte(f)函数需要接收一个可调用的函数对象,当你把secondariga(也就是None)传进去时,函数尝试执行f(),本质上是在调用None(),这自然会触发错误。
修正方案
我们需要把打印操作封装成真正的函数,或者用lambda表达式快速包装,让quattrovolte()能接收到可调用的对象。
方案1:定义独立的打印函数
把打印第一行和第二行的逻辑分别写成函数,这样就能把函数对象传给quattrovolte():
def quattrovolte(f): f() f() f() f() # 封装打印第一行的函数 def stampa_riga_orizzontale(): print("+", " - "*4, "+", " - "*4, "+") # 封装打印中间行的函数 def stampa_riga_verticale(): print("|", " "*12, "|", " "*12, "|") def Quadrato_1(): stampa_riga_orizzontale() quattrovolte(stampa_riga_verticale) stampa_riga_orizzontale() quattrovolte(stampa_riga_verticale) stampa_riga_orizzontale() Quadrato_1()
方案2:用lambda简化代码
如果你不想单独定义函数,可以用lambda表达式直接把打印语句包装成可调用对象,代码会更简洁:
def quattrovolte(f): f() f() f() f() def Quadrato_1(): # 直接打印第一行 print("+", " - "*4, "+", " - "*4, "+") # 用lambda把打印中间行的操作包装成函数传给quattrovolte quattrovolte(lambda: print("|", " "*12, "|", " "*12, "|")) print("+", " - "*4, "+", " - "*4, "+") quattrovolte(lambda: print("|", " "*12, "|", " "*12, "|")) print("+", " - "*4, "+", " - "*4, "+") Quadrato_1()
两种方案都能正常运行,输出和你最初的Quadrato()函数完全一致,同时代码也更简洁规范啦!
内容的提问来源于stack exchange,提问作者Norman Facco
相关产品推荐
相关产品推荐

