在日常开发中,Python的内置数据类型你绕不过去,就像你学开车,油门刹车总得搞明白吧。哪怕你是搞AI、做后端、写爬虫、跑脚本,这些最基本的类型都天天跟你打交道。问题是,大多数人其实从来没认真琢磨过:到底有多少种?怎么分类?它们之间有啥关系?今天我就来聊聊这个话题。
先说结论,Python 的内置数据类型其实主要可以归为三大类:数值类型(numeric)、序列类型(sequence)、集合类型(set/dict)还有布尔类型(bool)和空值(NoneType)这俩特殊成员。听起来挺多,但只要你用过 Python,基本都见过,只是可能你没意识到它们是被官方“封神”的一类。
数值类型嘛,咱最熟的几个:int、float、complex。别看 complex 平时没人提,但它确实在处理数学建模、信号分析那堆高级活时能用上。我之前在某个搞算法竞赛的项目里,实打实用过复数搞 FFT,那时候才真正体会到它不是教材里的摆设。
序列类型就更多了,str、list、tuple 三兄弟,简直是 Python 世界的扛把子。你写个接口收个 json,返回个结果,处理点日志,哪个不跟它们打交道?而且这仨有个很有意思的地方:都是容器类型,支持切片、索引、遍历。你平时用着可能感觉它们差不多,但实际上 tuple 是不可变的(immutable),list 是可变的(mutable),str 虽然看起来像 list,其实是字符的 tuple —— 不能直接改某个字符。
然后是集合类型,set 和 dict。说实话,我超级喜欢用 set,尤其是在做去重、交并集、快速查找的时候。dict 就更不用说了,Python 的 dict 是哈希表的高级实现,用法超级灵活,从简单的 key-value 映射,到实现 cache,甚至是某些对象模型的底层逻辑,都是它在撑场子。
再说两个特殊的类型:bool 和 NoneType。bool 类型其实本质是 int 的子类,这点在做 True + True == 2 的时候能验证,虽然听起来很邪门,但这就是 Python 的魔性之处。NoneType 只有一个对象 None,你以为它只是个“空”,但实际它在函数返回值、对象初始化、惰性加载等等地方都有非常重要的应用场景。
讲到这儿,你是不是觉得这些类型基本上跟你平时的使用习惯还挺对得上?别急,我们再看看 print(dir('a')) 这个问题。
很多人看到这题的第一反应是:这不是输出字符串的属性和方法吗?没错,但你有没有认真看过输出里都有什么?我们来简单分析下:
执行 print(dir('a')),你会看到一堆看起来“像方法”的字符串,比如 __add__, __contains__, __getitem__, upper, lower, split 等等。这些都是 str 类型这个 class 自带的 magic method 和实例方法。dir 返回的是对象的所有“属性”名字,注意,是属性名,至于这个属性是方法还是变量,那得你用 getattr 或者 type(obj.attr) 来看。
这里就有意思了,str 类型其实是个 class,它的每个对象(也就是你写的字符串)其实是这个类的实例。所有你能对字符串做的事,比如 s.upper()、s[0] 等操作,都是通过这些方法来实现的。所以你看到的 __getitem__ 就是让你支持 s[i] 这种写法的魔法方法。
而像 __add__ 则是让你支持字符串拼接的,比如 'a' + 'b',背后就是 'a'.__add__('b')。看到没有,Python 的一切语法糖,基本都能还原到方法调用上。这也是为啥 Python 的面试经常考 dir,因为它是理解“对象就是类的实例”的直观入口。
说实话,我觉得新手程序员如果真想搞明白 Python 的底层逻辑,得从 dir() 和 type() 这俩函数开始啃。什么面向对象、什么 duck typing,其实都可以从这两函数里窥见端倪。尤其是那种你自己写了个 class,然后一用 dir(obj) 发现你定义的函数和属性都乖乖排队出现,那个成就感不比写完一段 SQL 高多少。
而且你如果平时写代码能养成习惯,比如:不确定对象有哪些方法,直接 dir(obj) 看一下,再用 help(obj.method) 查看文档,这比死记硬背 API 文档效率高多了。尤其是调试别人代码或者看不懂自己几个月前写的代码的时候,真的管用。
再说点题外话,现在 Python 的类型越来越复杂了,什么 NamedTuple、dataclass、TypedDict、Enum、Protocol 这些新东西层出不穷。但我想说的是,不管这些玩意儿多 fancy,基础的数据类型你一定要掌握牢,因为所有这些高级玩法本质上都还是围绕着那几个基础类型转。就像你得会走路,才谈得上跑马拉松,不然你连脚下的路都看不清。
总结?不总结了,说够了,你们自己回去写两段代码试试就懂了。最后我提个问题:你能不能写一段代码,用 dir() 自动找出一个对象所有可调用的方法,并打印出它们的 docstring?看似简单,其实能暴露你对 callable、attribute、reflection 的理解程度。要不要试试?
以上就是“Python主要的内置数据类型都有哪些? print dir( ‘a ’) 的输出?”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/13316/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料