Python核心技术与实战——三|字符串
一.字符串基础
Python的字符串支持单引号('')、双引号("")和三引号之中('''....'''和"""...""")三种写法这样就比较方便在字符串中嵌套带引号的字符串。
a = "I'm a student"
并且这三种表示方法是相同的内容
>>> a = 'hello world'
>>> b = "hello world"
>>> c = '''hello world'''>>> a==b==c
True
三引号的作用主要是用于多行字符串或者是注释。
'''
这是一个字符串
'''
a = "I'm a student"
字符串的转义字符
| 转义字符 | 描述 |
|---|---|
| \(在行尾时) | 续行符 |
| \\ | 反斜杠符号 |
| \’ | 单引号 |
| \” | 双引号 |
| \a | 响铃 |
| \b | 退格(Backspace) |
| \e | 转义 |
| \000 | 空 |
| \n | 换行 |
| \v | 纵向制表符 |
| \t | 横向制表符 |
| \r | 回车 |
| \f | 换页 |
| \oyy | 八进制数yy代表的字符,例如:\o12代表换行 |
| \xyy | 十进制数yy代表的字符,例如:\x0a代表换行 |
| \other | 其它的字符以普通格式输出 |
在字符串内,转义字符的长度也只占1个。
>>> a = 'a\nbc\td'
>>> len(a)
6
>>> print(a)
a
bc d
二.字符串的基本操作
1.字符串可以像列表一样遍历、切片和索引。
>>> name = 'jack'
>>> name[0]
'j'
>>> name[0:2]
'ja'
>>> for i in name:
... print(i)
...
j
a
c
k
要注意的是在切片中,获取的元素索引是[index:index+2],则返回的实际元素是从index到index+1之间的元素。
并且Python字符串中的元素是不可变的,不能改变其中的某个元素
>>> name = 'jack'
>>> name[0] = 'J'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
但是可以用下面的方法
>>> name = 'J'+name[1:]
>>> name = name.replace('j','J')
主要是因为在Java等语言中,有可变的字符串类型(StringBuilder),每次添加、改变字符串需要O(1)的时间复杂度,程序运行效率能被大大提高。
而在python中我们通常需要重新创建新的字符串,而每次改变字符串需要O(n)的时间复杂度,其中n为字符串的长度。
这里的通常我着重标注了一下,因为使用加法操作符"+="就是一个例外
>>> a = 'hello'
>>> b = 'world'
>>> a+=b
>>> a
'helloworld' #a+=b ——>a = a+b
在这里举个例子,我们做一个字符串的循环累加
s = ' '
for n in range(0,1000000):
s +=str(n)
理论上,每次创建一个新的字符串就需要O(n)的时间复杂度,总的时间复杂度就是O(1)+O(2)+O(3)...+O(n)=O(n^2),对不对呢?
这个结论在老版本的Python中是适用的,在Python2.5以后,每次处理字符串的拼接操作时(Str1+Str2),Python会先检测Str1还有没有其他的引用。如果没有的话就会尝试原地扩充字符串Buffer的大小,而不是重新分配一块内存来创建新的字符串并进行Copy。这样,在上述例子中的时间复杂度就成了O(n)了。所以在程序中如果使用"+="更加方便就尽可能的使用这个吧!
2.字符串的拼接
其实在上面一条有一部分讲的就是字符串的拼接,还有另外的一种方法——使用字符串的内置函数join()(str.join(iterable)这个用法),把每个元素按照要求的格式拼起来。
>>> l = ['a','b','c']
>>> s = ''
>>> s.join(l)
'a123b123c'
按照则个方式完成上面的案例
l = []
for n in range(0,1000000):
l.append(str(n))
s = ' '.join(l)
由于列表的append的时间复杂度时O(1),这里n次for循环就是O(n),
3.字符串的分割
string.split(separator) #按照要求分割成列表
string.strip(str) #去除首尾的str字符
string.lstrip(str) #去除开头的str字符
strint.rstrip(str) #去除结尾的str字符
我们常常用strip来去除读出的数据前的空格啥的
三.字符串的格式化
我们通常在程序的输出、logging等场景会使用一个字符串作为模板,模板中留有格式符来为后续实际值预留位置。就像这样使用
>>> name = 'jack'
>>> id = 11
>>> print('{} id is {}'.format(name,id))
jack id is 11
在这里,大括号{}就是与预留符,为后面的name和id预留了在字符串里的位置。其实和这样的使用方法时一样的
>>> print('%s id is %d'%(name,id))
只不过string.format()是最新的字符串格式函数与规范,也是官方文档推荐的规范。
四.思考题
在2.5+版本的Python中,下面两个方法哪个是更好的呢?
#方式A
s = ''
for n in range(0,100000):
s+=str(n) #方式B
l = []
for n in range(0,100000):
l.append(str(n))
s = ' '.join(l)
解答:其实如果字符串拼接的次数较少,比如range(100),那么第一种方法更优。但是如果拼接的次数较多,比如range(1000000),方法B稍快一些,虽然它会遍历两次,但join的速度是很快的,列表append和join的开销比+=要小一些。可以加上时间验证一下
import time
n = 100
#方式A
time_1 = time.perf_counter()
s = ''
for n in range(0,n):
s+=str(n)
time_2 = time.perf_counter()
#方式B
l = []
for n in range(0,n):
l.append(str(n))
s = ' '.join(l)
time_3 = time.perf_counter()
print(time_2-time_1,time_3-time_2)
验证
当n=100时,两个时间都差不多,但n=1000000时,时间就成了
方式A:2.7928060934153014
方式B:0.41785306529077815
差距是不是一下就明显了!
Python核心技术与实战——三|字符串的更多相关文章
- Python核心技术与实战——六|异常处理
和其他语言一样,Python中的异常处理是很重要的机制和代码规范. 一.错误与异常 通常来说程序中的错误分为两种,一种是语法错误,另一种是异常.首先要了解错误和异常的区别和联系. 语法错误比较容易理解 ...
- 【学习笔记】第六章 python核心技术与实践--深入浅出字符串
[第五章]思考题答案,仅供参考: 思考题1:第一种方法更快,原因就是{}不需要去调用相关的函数: 思考题2:用列表作为key在这里是不被允许的,因为列表是一个动态变化的数据结构,字典当中的key要求是 ...
- Python核心技术与实战——十九|一起看看Python全局解释器锁GIL
我们在前面的几节课里讲了Python的并发编程的特性,也了解了多线程编程.事实上,Python的多线程有一个非常重要的话题——GIL(Global Interpreter Lock).我们今天就来讲一 ...
- Python核心技术与实战 笔记
基础篇 Jupyter Notebook 优点 整合所有的资源 交互性编程体验 零成本重现结果 实践站点 Jupyter 官方 Google Research 提供的 Colab 环境 安装 运行 列 ...
- Python核心技术与实战——二一|巧用上下文管理器和with语句精简代码
我们在Python中对于with的语句应该是不陌生的,特别是在文件的输入输出操作中,那在具体的使用过程中,是有什么引伸的含义呢?与之密切相关的上下文管理器(context manager)又是什么呢? ...
- Python核心技术与实战——十六|Python协程
我们在上一章将生成器的时候最后写了,在Python2中生成器还扮演了一个重要的角色——实现Python的协程.那什么是协程呢? 协程 协程是实现并发编程的一种方式.提到并发,肯很多人都会想到多线程/多 ...
- Python核心技术与实战——十四|Python中装饰器的使用
我在以前的帖子里讲了装饰器的用法,这里我们来具体讲一讲Python中的装饰器,这里,我们从前面讲的函数,闭包为切入点,引出装饰器的概念.表达和基本使用方法.其次,我们结合一些实际工程中的例子,以便能再 ...
- Python核心技术与实战——五|条件与循环
我们在前面学习了列表.元组.字典.集合和字符串等一系列Python的基本数据结构类型,下就需要把这一个个基本的数据串在一起了,这就要用到我们今天要讲的东西——”条件与循环“. 一.条件语句 条件语句的 ...
- Python核心技术与实战——四|Python黑箱:输入与输出
抽象的看,Python程序可以被看成一个黑箱:通过输入流将数据送达,经过处理后在输入,也就是说具备了一个图灵机运作的必要条件. 输入输出基础 最简单的输入是来自键盘的操作 name = input(' ...
随机推荐
- @清晰掉 spi协议及工作原理分析
说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一.概述. SPI, Serial Perripheral ...
- 关于Anaconda的虚拟环境操作
# 1.创建虚拟环境 conda create -n env_name python==版本号 # 2.激活虚拟环境 conda activate env_name # 3.下载相关模块 pip in ...
- linux系统下自动删除前N天的日志文件
删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令: find /opt/soft/log/ -mti ...
- 为什么在vmware中不能使用ctrl+alt+F1~6切换到字符控制台
为什么在vmware中不能使用ctrl+alt+F1~6切换到字符控制台 是因为vmware虚拟机的快捷键: ctrl+alt也用到了 因为vmware本身的hot keys也用到了ctrl+alt: ...
- 方法一破解:Excel工作表保护密码
在excel2016中实测验证过有效 在Excel中,为了保护自已的工作表不被修改,我们可以添加保护密码. 操作步骤: 1.把Excel文件的扩展名xlsx修改为Rar.瞬间Excel文件变成了压缩包 ...
- Stream之filter、distinct、skip、map、flatMap、match、find、reduce
一.Stream之filter.distinct.skip: package com.cy.java8; import java.util.Arrays; import java.util.List; ...
- robotframework(rf)中对时间操作的datetime库常用关键字
1.对固定日期进行操作,增加或减去单位时间或者时间段 2.对两个时间段进行操作 3.对时间格式转化,获取时间戳. 4.从完整时间中取指定年月日等 5.对时间类型进行格式化 6.获取当前时间或者指定时区 ...
- eclipse 或 STS 卸载SVN 插件
help菜单 ==> about eclipse ==>install details按钮 ==> installed software选项卡 选中下面的这几项,点击 uni ...
- Intersection of Two Arrays(交集)
来源:https://leetcode.com/problems/intersection-of-two-arrays Given two arrays, write a function to co ...
- Sequential game
Sequential game Problem Description Sequential detector is a very important device in Hardware exper ...