#PY小贴士# 函数也是对象

简介: 这就要提到 Python 中的一个重要概念:万物皆对象。除了我们熟知的数字、字符、列表、字典是对象外,函数、模块,甚至类型本身,也是对象,只不过在功能和表现上会有所不同。

之前我们提到过:有同学在写入文件之后发现文件内容并没有改动,有可能是因为在关闭文件时写成了 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(非私信)

提问时请表述清楚,附上必要代码、输出等截屏。

相关文章
|
7月前
|
存储 安全 Java
解释Python中的引用和赋值机制。
Python中,变量是对象引用,不存储数据,而存数据在内存的位置。赋值(=)创建变量并让其指向内存中的对象。当多个变量指向同一对象时,它们共享引用。Python使用引用计数管理对象生命周期,对象引用为0时回收。了解这些机制对优化内存使用和防止内存泄漏很重要。例如: ```markdown ```python a = 5 b = a # b引用了同一数字5 del a # 数字5的引用计数仍为1,未被回收 ``` 引用计数并非唯一机制,Python还采用其他策略处理循环引用等复杂情况。
62 2
|
7月前
|
开发者 Python
|
7月前
|
存储 IDE 开发工具
【python原理】Python 3里面print为什么改成函数?为什么会有个奇怪的“...”对象?为什么推荐蛇形命名法?等常见问题
【python原理】Python 3里面print为什么改成函数?为什么会有个奇怪的“...”对象?为什么推荐蛇形命名法?等常见问题
92 0
|
4月前
|
Python
Python模块的创建方法?
【8月更文挑战第18天】Python模块的创建方法?
26 2
|
4月前
|
Python
Python中多变量赋值
【8月更文挑战第5天】
443 5
|
7月前
|
存储 Python
Python学习 -- 类对象从创建到常用函数
Python学习 -- 类对象从创建到常用函数
31 0
【pytest官方文档】解读- 如何自定义mark标记,并将测试用例的数据传递给fixture函数
【pytest官方文档】解读- 如何自定义mark标记,并将测试用例的数据传递给fixture函数
【pytest官方文档】解读- 如何自定义mark标记,并将测试用例的数据传递给fixture函数
|
SQL 数据挖掘 Python
四个函数搞清 Python 作用域
四个函数搞清 Python 作用域
|
数据可视化 Java Python
再谈Python的引用和变量
再谈Python的引用和变量
132 0
再谈Python的引用和变量