2.1 基础知识
2.1.1 数值基础
在Python中,一共存在三种内置数值类型:整型(int)、浮点型(float)和复数类型(complex)。
在大多数情况下,我们只需要用到前两种类型:int与float。二者之间可以通过各自的内置方法进行转换:
在定义数值字面量时,如果数字特别长,可以通过插入_分隔符来让它变得更易读:
Python里的数值类型十分让人省心,你大可随心所欲地使用,一般不会碰到什么奇怪的问题。不过,浮点数精度问题是个例外。
浮点数精度问题
2.1.2 布尔值其实也是数字
布尔(bool)类型是Python里用来表示“真假”的数据类型。你肯定知道它只有两个可选值:True和False。不过,你可能不知道的是:布尔类型其实是整型的子类型,在绝大多数情况下,True和False这两个布尔值可以直接当作1和0来使用。
布尔值的这个特点,最常用来简化统计总数操作。
2.1.3 字符串常用操作
01.把字符串当序列来操作
字符串是一种序列类型,这意味着你可以对它进行遍历、切片等操作,就像访问一个列表对象一样:
02.字符串格式化
在当前的主流Python版本中,至少有三种主要的字符串格式化方式。
(1)C语言风格的基于百分号%的格式化语句:'Hello, %s' % 'World'。
(2)新式字符串格式化(str.format)方式(Python 2.6新增):"Hello,{}".format ('World')。(3)f-string字符串字面量格式化表达式(Python 3.6新增):name = 'World';f'Hello, {name}'。
第一种字符串格式化方式历史最为悠久,但现在已经很少使用。相比之下,后两种方式正变得越来越流行。从个人体验来说,f-string格式化方式用起来最方便,是我的首选。和其他两种方式比起来,使用f-string的代码多数情况下更简洁、更直观。
0.3 拼接多个字符串
假如要拼接多个字符串,比较常见的Python式做法是:首先创建一个空列表,然后把需要拼接的字符串都放进列表,最后调用str.join来获得大字符串。
在拼接字符串时,+=和join同样好用。
2.1.4 不常用但特别好用的字符串方法
Python为字符串类型实现了非常多内置方法。在对字符串执行某种操作前,请一定先查查某个内置方法是不是已经实现了该操作,否则一不留神就会重复发明轮子。
日常编程中,我们最常用到的字符串方法有.join()、.split()、.startswith(),等等。虽然这些常用方法能满足大部分的字符串处理需求,但要成为真正的字符串高手,除了掌握常用方法,了解一些不那么常用的方法也很重要。在这方面,.partition()和.translate()方法就是两个很好的例子。
str.partition(sep)的功能是按照分隔符sep切分字符串,返回一个包含三个成员的元组:(part_before, sep, part_after),它们分别代表分隔符前的内容、分隔符以及分隔符后的内容。
举个例子,我有一个字符串s,它的值可能会是以下两种格式。(1)'{key}:{value}',键值对标准格式,此时我需要拿到value部分。(2)'{key}',只有key,没有冒号:分隔符,此时我需要拿到空字符串''。
除了partition方法,str.translate(table)方法有时也非常有用。它可以按规则一次性替换多个字符,使用它比调用多次replace方法更快也更简单:
2.1.5 字符串与字节串
(1)字符串:我们最常挂在嘴边的“普通字符串”,有时也被称为文本(text),是给人看的,对应Python中的字符串(str)类型。str使用Unicode标准,可通过.encode()方法编码为字节串。
(2)字节串:有时也称“二进制字符串”(binary string),是给计算机看的,对应Python中的字节串(bytes)类型。bytes一定包含某种真正的字符串编码格式(默认为UTF-8),可通过.decode()解码为字符串。
最佳实践
在我们的程序中,应该尽量保证总是操作普通字符串,而非字节串。必须操作处理字节串的场景,一般来说只有两种:
(1)程序从文件或其他外部存储读取字节串内容,将其解码为字符串,然后再在内部使用;(2)程序完成处理,要把字符串写入文件或其他外部存储,将其编码为字节串,然后继续执行其他操作。
当你要把字符串写入文件(进入计算机的领域)时,请谨记:普通字符串采用的是文本格式,没法直接存放于外部存储,一定要将其编码为字节串——也就是“二进制字符串”——才行。
以下是本章要点知识总结。(1)数值基础知识· Python的浮点数有精度问题,请使用Decimal对象做精确的小数运算· 布尔类型是整型的子类型,布尔值可以当作0和1来使用· 使用float('inf')无穷大可以简化边界处理逻辑
(2)字符串基础知识
· 字符串分为两类:str(给人阅读的文本类型)和bytes(给计算机阅读的二进制类型)
· 通过.encode()与.decode()可以在两种字符串之间做转换
· 优先推荐的字符串格式化方式(从前往后):f-string、str.format()、C语言风格格式化
· 使用以r开头的字符串内置方法可以从右往左处理字符串,特定场景下可以派上用场
· 字符串拼接并不慢,不要因为性能原因害怕使用它
(3)代码可读性技巧· 在定义数值字面量时,可以通过插入_字符来提升可读性
· 不要出现“神奇”的字面量,使用常量或者枚举类型替换它们
· 保留数学算式表达式不会影响性能,并且可以提升可读性
· 使用textwrap.dedent()可以让多行字符串更好地融入代码
(4)代码可维护性技巧
· 当操作SQL语句等结构化字符串时,使用专有模块比裸处理的代码更易于维护
· 使用Jinja2模板来替代字符串拼接操作(
5)语言内部知识
· 使用dis模块可以查看Python字节码,帮助我们理解内部原理
· 使用timeit模块可以对Python代码方便地进行性能测试
· Python语言进化得很快,不要轻易被旧版本的“经验”所左右