之前我们提到过:有同学在写入文件之后发现文件内容并没有改动,有可能是因为在关闭文件时写成了 f.close,没就加括号。那么为什么不加括号就不行,而且程序也没有报错提示呢?
这就要提到 Python 中的一个重要概念:万物皆对象。除了我们熟知的数字、字符、列表、字典是对象外,函数、模块,甚至类型本身,也是对象,只不过在功能和表现上会有所不同。
以我们熟知的 print 函数为例,你可以把 print 函数本身作为输出的对象:
从输出中可以看出,它告诉你这是一个内置方法(built-in function),但作为参数的这个 print 就并没有触发它的函数效果,因为它没有加括号,也就是说,函数没有被调用。
如果加了括号呢?
print() 本身输出了一个空行,而它没有返回值,所以传递给外面 print 的是 None。结果就是一个空行(来自里面的 print())和一个 None(来自外面的 print(None))。
因此,当函数不加括号时,它就和你在代码中写个 123、'Hello' 一样,只是一个值,并不触发函数的执行效果。加了括号,函数执行,产生效果,并获得函数的返回值。
更进一步:既然函数是对象,那么它也可以赋值给其他变量:
当 fn 赋值给变量 gn 后,gn 也就相当于是 fn 的一个别名,它和 fn 指向同一个对象,并且可以像正常定义的函数一样通过加上括号来调用。
反过来,定义好的函数名也可以被赋值为其他的对象:
被赋值成其它类型后的函数名也就无法再继续调用原函数了。
在 #PY小贴士# 里,我们会分享 python 知识点、开发小技巧、学习中的常见问题等。篇幅短小,适合碎片时间阅读,欢迎关注!
本栏目接受投稿,采纳后将署名发表,可附个人博客、公众号、Github等。
如果你在编程学习中有疑问,可通过以下方式向我们提问:
1. 加入码上行动答疑群(最及时响应)
2. 加入知识星球 https://t.zsxq.com/IiAiiQj
3. 发微博加上 #编程教室# 并 @Crossin(非私信)
提问时请表述清楚,附上必要代码、输出等截屏。