You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:30:39