为了账号安全,请及时绑定邮箱和手机立即绑定

为什么闭包一个print输出两个值,输出None怎么回事?

为什么闭包一个print输出两个值,输出None怎么回事?

风景不在对岸 2016-05-14 16:49:09
请问cmp 函数只有一个print只有一个输出,为何输出None,且返回类型也是NoneType
查看完整描述

1 回答

?
清波

TA贡献165条经验 获得超90个赞

每每看到 Python 的闭包,尤其是 __closure__ 属性,简直自豪的要跳起来有没有 哈哈。

题主的代码很奇怪,上半截还是Python 3.x 的语法, 后面就开始用 Python2.x 了。

另外输出还没有错。。。

题主定义完 一个闭包演示函数后,进行了四次演示:

def set_passline(passline):
    
    def cmp(val):
        if val>=passline:
            print('Pass')
        else:
            print('Failed')
    return cmp
f_100 = set_passline(60)
print (type(f_100))
print (f_100.__closure__)
print (f_100(89))
print (type(f_100(89)))

其后得到了6个输出:

//img1.sycdn.imooc.com//57371d910001a67104870134.jpg

第一个, <type 'function'> 自然就是 print (type(f_100)) 的输出。

第二个, (<cell at .......>,) 这个元组就是f_100 的闭包输出了, 其中只包含一个cell 类型, 其内容是个 int 类型。

第三个 第四个, pass 和 其下面的 None, 则是 打印了 f_100(89) 的结果, 首先 f_100(89) 这个函数本身会打印 Pass, 其次 print(f_100(89)) 由于 f_100(89) 没有返回值, 自然就会打印出 None.

第五个 第六个, Pass 和其下面的 <type 'NoneType'>  跟 上面的道理一样, 首先 函数会打印Pass 其实 这个函数没有返回值, 所以 type(f_100(89)) 就是 type None 了。


所以 所有的 题主以为是 异常 的现象, 都有一个正常的解释,且跟闭包 没有什么联系。。。 即使定义普通的函数, 如果没有返回值的话, 也会出现这种情况。

查看完整回答
1 反对 回复 2016-05-14
  • 1 回答
  • 0 关注
  • 1788 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信