内置函数有的要对象.函数名,有的直接函数名
在 Python 里,把“函数”分成两大类,就能解释你看到的两种写法:
1. 真正独立的内置函数(built-in function)
它们活在 builtins 模块里,解释器启动时就自动帮你放到当前全局作用域。
因此直接写名字就能用,不需要、也不能在前面加“对象.”。
例:len('abc')、print('hello')、str(123)、type([])……
2. 定义在某个类型里的“方法”(method)
这些函数是类型对象的属性,必须“绑”到一个实例上才能调用,于是出现
实例.方法名(...) 的写法。
例:
'abc'.upper() # str 类型里的 upper
[1,2,3].append(4) # list 类型里的 append
f = open('a.txt'); f.read() # 文件对象的方法 read
小结
• 只要名字前面没有点,就是“独立函数”;
• 只要出现 对象.函数名(...),那一定是该对象所属类里定义的方法。
补充:为什么 len() 不是 list.len()?
Python 把最常用的“协议性”操作(求长、转字符串、迭代、哈希……)做成独立内置函数,内部只是去调用对象所属类的魔术方法,例如:
len(obj) → obj.__len__()
str(obj) → obj.__str__()
3. repr(x) → x.__repr__() repr(123) # 显示开发者友好的字符串表示 4. iter(x) → x.__iter__() iter([1, 2, 3]) # 而不是 [1,2,3].iter() 5. next(x) → x.__next__() it = iter([1, 2, 3]) next(it) # 而不是 it.next() 6. bool(x) → x.__bool__() 或 x.__len__() bool([]) # False,而不是 [].bool() bool([1, 2]) # True 7. hash(x) → x.__hash__() hash("hello") # 而不是 "hello".hash() 8. abs(x) → x.__abs__() abs(-5) # 而不是 (-5).abs() 9. int(x) → x.__int__() int(3.14) # 而不是 3.14.int() 10. float(x) → x.__float__() float(5) # 而不是 5.float() 11. complex(x) → x.__complex__() complex(3, 4) # 创建复数 12. round(x) → x.__round__() round(3.14159, 2) # 而不是 3.14159.round(2) 13. reversed(x) → x.__reversed__()
reversed()
- 内置函数,返回回一个反向迭代器,不修改原列表,临时反向访问
而
list.reverse()
- 列表方法,原地反转列表,修改原列表,返回值:None
reversed([1, 2, 3]) # 而不是 [1,2,3].reversed() 14. format(x) → x.__format__() format(3.14159, '.2f') # 而不是 3.14159.format('.2f') 容器协议相关 15. getattr(obj, name) → 访问属性 getattr(obj, 'attr') # 而不是 obj.getattr('attr') 16. setattr(obj, name, value) → 设置属性 setattr(obj, 'attr', value) 17. delattr(obj, name) → 删除属性 delattr(obj, 'attr') 18. hasattr(obj, name) → 检查属性 比较运算符相关(虽然通常用运算符,但也有函数形式) dir([]) # 而不是 [].dir()
这样既保证了所有类型接口一致,又保留了书写简洁性。