[Python工匠]输出②数值与字符串

 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语言进化得很快,不要轻易被旧版本的“经验”所左右

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值