你所不知道的Python | 字符串连接的秘密

字符串连接,就是将 2 个或以上的字符串合并成一个,看上去连接字符串是一个非常基础的小问题,但是在 Python 中,我们可以用多种方式实现字符串的连接,稍有不慎就有可能因为选择不当而给程序带来性能损失。 方法 1:加号连接 很多语言都支持使用加号连接字符串,Python 也不例外,只需要简单的将 2 个或多个字符串相加就可以完成拼接。 a = 'Python' b = '私房菜' r = a + b # 输出'Python私房菜' 方法 2:使用%操作符 在 Python 2.6 以前,%操作符是唯一一种格式化字符串的方法,它也可以用于连接字符串。 a = 'Python' b = '私房菜' r = '%s%s' % (a, b) # 输出'Python私房菜' 方法 3:使用 format 方法 format 方法是 Python 2.6 中出现的一种代替%操作符的字符串格式化方法,同样可以用来连接字符串。 a = 'Python' b = '私房菜' r = '{}{}'.format(a, b) 方法 4:使用 f-string Python 3.6 中引入了 Formatted String Literals(字面量格式化字符串),简称 f-string,f-string 是%操作符和 format 方法的进化版,使用 f-string 连接字符串的方法和使用%操作符、format 方法类似。 a = 'Python' b = '私房菜' r = f'{a}{b}' 方法 5:使用 str.join()方法 字符串有一个内置方法 join,其参数是一个序列类型,例如数组或者元组等。 a = 'Python' b = '私房菜' r = ''.join([a, b]) 对比测试 既然连接字符串有这么多方法,那么使用时到底选择哪种呢?我们从代码可读性和性能两个层面来评估一下上面 5 种方法。 ...

六月 28, 2018 · 1 分钟 · Zhiya

你所不知道的Python | 字符串格式化的演进之路

字符串格式化对于每个语言来说都是一个非常基础和常用的功能,学习 Python 的同学大概都知道可以用%语法来格式化字符串。然而为了让我们更方便的使用这个常用功能,语言本身也在对字符串格式化方法进行迭代。 Python 2.6 以前:%操作符 在 Python 2.6 出现之前,字符串迭代只有一种方法,就是%(也是取模)操作符,%操作符支持 unicode 和 str 类型的 Python 字符串,效果和 C 语言中的 sprintf()方法相似,下面是一个使用%格式化字符串的例子: print("I'm %s. I'm %d year old" % ('Tom', 27)) %符号前面使用一个字符串作为模板,模板中有标记格式的占位符号,%后面是一个 tuple 或者 dict,用来传递需要格式化的值。占位符控制着显示的格式,下面列表展示了占位符的种类: 占位符 内容 %d 十进制整数 %i 十进制整数 %o 八进制整数 %u 无符号整数 %x 无符号十六进制(小写) %X 无符号十六进制(大写) %e 浮点型(科学记数法,小写) %E 浮点型(科学记数法,大写) %f 浮点数 %F 浮点数 %g 浮点型,如果小数位数超过 4 位,使用科学记数法表示(小写) %G 浮点型,如果小数位数超过 4 位,使用科学记数法表示(大写) %c 单个字符 %r 字符串(调用 repr()方法生成) %s 字符串(调用 str()方法生成) 除了对数据类型的指定,%操作符还支持更复杂的格式控制: ...

六月 11, 2018 · 2 分钟 · Zhiya

初学者必备 | Python Cheat Sheet 中文版

笔者整理了 Python3 中内置方法的速查表,包含: 内置方法 列表处理方法 字典处理方法 元组处理方法 集合处理方法 序列类型的切片方法 共计 100 多个方法,点击图片——查看原图——下载。

五月 31, 2018 · 1 分钟 · Zhiya

简析Python中的四种队列

队列是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 在 Python 文档中搜索队列(queue)会发现,Python 标准库中包含了四种队列,分别是 queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque。 collections.deque deque 是双端队列(double-ended queue)的缩写,由于两端都能编辑,deque 既可以用来实现栈(stack)也可以用来实现队列(queue)。 deque 支持丰富的操作方法,主要方法如图: 相比于 list 实现的队列,deque 实现拥有更低的时间和空间复杂度。list 实现在出队(pop)和插入(insert)时的空间复杂度大约为 O(n),deque 在出队(pop)和入队(append)时的时间复杂度是 O(1)。 deque 也支持 in 操作符,可以使用如下写法: q = collections.deque([1, 2, 3, 4]) print(5 in q) # False print(1 in q) # True deque 还封装了顺逆时针的旋转的方法:rotate。 # 顺时针 q = collections.deque([1, 2, 3, 4]) q.rotate(1) print(q) # [4, 1, 2, 3] q.rotate(1) print(q) # [3, 4, 1, 2] # 逆时针 q = collections.deque([1, 2, 3, 4]) q.rotate(-1) print(q) # [2, 3, 4, 1] q.rotate(-1) print(q) # [3, 4, 1, 2] 线程安全方面,通过查看 collections.deque 中的 append()、pop()等方法的源码可以知道,他们都是原子操作,所以是 GIL 保护下的线程安全方法。 ...

五月 22, 2018 · 2 分钟 · Zhiya

你真的会正确使用断言吗?

什么是断言 断言是作为一种调试工具被发明出来的,用来检查那些“代码写对了就肯定成立”的条件。例如我们要断言一个变量 a 必须要大于 2,就可以这样写: assert a > 2 当条件不满足时,就会抛出 AssertionError 异常,等同于如下代码: if not assert_condition: raise AssertionError 由于断言是一个 debug 工具,Python 的实现也符合这个设计哲学,在 Python 中 assert 语句的执行是依赖于__debug__变量的,当__debug__为 true 时,assert 语句才会被执行。 if __debug__ and not assert_condition: raise AssertionError 默认情况下,当我们执行一个 Python 文件时,__debug__是会被设置为 True 的,只有加参数-O 或-OO 时,__debug__才会被设置为 False。 新建一个 assert.py 文件,写下如下代码: print(__debug__) assert 2 > 5 当使用 python assert.py 运行时,__debug__会输出 True,assert 2 > 5 语句会抛出 AssertionError 异常。 当使用 python -O assert.py 运行时,__debug__会输出 False,assert 2 > 5 语句由于没有执行不会报任何异常。 断言 or 异常 我们思考这几个问题:断言应该用在哪些情境下?异常和断言的区别是什么? 用一句话来概括断言的使用场景和与异常的区别: 检查先验条件使用断言,检查后验条件使用异常 我们定义一个 read_file 函数: ...

五月 7, 2018 · 1 分钟 · Zhiya