Python——内置数据类型(下)
022. 字符串 Ⅰ
字符串的基本特点
字符串的本质是:字符序列。 Python的字符串是不可变的,我们无法对原字符串做任何修改。但,可以将字符串的一部分复制到新创建的字符串,达到“看起来修改”的效果。
Python不支持单字符串类型,单字符也是作为一个字符串使用的。
字符串的编码
Python3直接支持Unicode,可以表示世界上任何书面语言的字符。Python3的字符默认就是16位Unicode编码,ASCII码是Unicode编码的子集。
使用内置函数 ord() 可以把字符转换成对应的Unicode码;
使用内置函数 chr() 可以把十进制数字转换成对应的字符。
引号创建字符串
我们可以通过 单引号 或 双引号 创建字符串。
使用两种引号的好处是可以创建本身就包含引号的字符串,而不用使用转义字符。
连续三个单引号或三个双引号,可以帮助我们创建多行字符串。
空字符串和len()函数
Python允许空字符串的存在,不包含任何字符且长度为0。
len() 用于计算字符串含有多少字符。
023. 字符串 Ⅱ
转义字符
转义字符 | 描述 |
---|---|
\(在行尾时) | 续行符 |
\ | 反斜杠符号 |
\ ’ | 单引号 |
\ " | 双引号 |
\b | 退格(BackSpace) |
\n | 换行 |
\t | 横向制表符 |
\r | 回车 |
字符串拼接
- 可以使用+将多个字符串拼接起来。
(1) 如果+两边都是字符串,则拼接。
(2) 如果+两边都是数字,则加法运算。
(3) 如果+两边类型不同,则抛出异常。 - 可以将多个字面字符串直接放到一起拼接。
字符串复制
使用*可以实现字符串复制。
不换行打印
通过参数 end = “任意字符串” ,实现末尾添加任何内容。
从控制台读取字符串
我们可以使用 input() 从控制台读取键盘输入的内容。
024. 字符串 Ⅲ
str()实现数字转型字符串
str() 可以帮助我们将其他数据类型转换为字符串。
当我们调用print()函数时,解释器自动调用了str()将非字符串的对象转成了字符串。
使用[]提取字符
字符串的本质就是字符序列。 我们可以通过在字符串后面添加[],在[]里面指定偏移量,可以提取该位置的单个字符。
正向搜索:
最左侧第一个字符,偏移量是0,第二个偏移量是1,以此类推。直到len(str)-1为止。
反向搜索:
最右侧第一个字符,偏移量是-1,倒数第二个偏移量是-2,以此类推,直到-len(str)为止。
replace()实现字符串替换
字符串是“不可改变”的,我们通过[]可以获取字符串指定位置的字符,但我们不能改变字符串。但是,我们确实有时候需要替换某些字符。这时,只能通过创建新的字符串来实现。
整个过程中,实际上我们是创建了新的字符串对象,并指向了变量a,而不是修改了以前的字符串。
025. 字符串切片slice操作
切片slice操作可以让我们快速地提取子字符串。标准格式为:
[起始偏移量start : 终止偏移量end : 步长step]
典型操作(三个量为正数的情况) 如下:
操作和说明 | 示例 | 结果 |
---|---|---|
[:] 提取整个字符串 | “abcdef” [:] | “abcdef” |
[start:] 从start索引开始到结尾 | “abcdef” [2:] | “cdef” |
[:end] 从头开始直到end-1 | “abcdef” [:2] | “ab” |
[start:end] 从start到end-1 | “abcdef” [2:4] | “cd” |
[start: end: step] 从start提取到end-1,步长是step | “abcdef” [1:5:2] | “bd” |
其他操作(三个量为负数) 如下:
示例 | 说明 | 结果 |
---|---|---|
“abcdefghijklmn”[-3:] | 倒数三个 | “lmn” |
“abcdefghijklmn”[-8:-3] | 倒数第八个到倒数第三个(包头不包尾) | “ghijk” |
“abcdefghijklmn”[::-1] | 步长为负,从右到左反向提取 | “nmlkjihgfedcba” |
切片操作时,起始偏移量和终止偏移量不在[0,字符串长度-1]这个范围,也不会报错。起始偏移量小于0则会当做0,终止偏移量大于“长度-1”会被当成-1。
026. 字符串的分割和合并
split()分割和join合并
split() 可以基于指定分隔符将字符串分割成多个子字符串(存储到列表中)。如果不指定分隔符,则默认使用空白字符(换行符 / 空格 / 制表符)。
join() 的作用和split()作用刚好相反,用于将一系列子字符串
拼接字符串要点:
使用字符串拼接符+,会生成新的字符串对象,因此不推荐使用+来拼接字符串。推荐使用join函数,因为join函数在拼接字符串之前会计算所有字符串的长度,然后逐一拷贝,仅新建一次对象。
效率测试
import time
time01 = time.time() #起始时刻
a = ''
for i in range(1000000):
a += 'huhu'
time02 = time.time() #终止时刻
print("使用+拼接字符串的运算时间:"+str(time02-time01))
time03 = time.time() #起始时刻
li = []
for i in range(1000000):
li.append("huhu")
a = "".join(li)
time04 = time.time() #终止时刻
print("使用join函数的运算时间:"+str(time04-time03))
运行结果:
027. 字符串 Ⅳ
字符串驻留机制和字符串比较
字符串驻留:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。Python支持字符串驻留机制,对于符合标识符规则的字符串(仅包含下划线(_)、字母和数字)会启用字符串驻留机制。
字符串比较和同一性
我们可以直接使用 == ,!= 对字符串进行比较,是否含有相同的字符。
我们使用 is / not is,判断两个对象是否同一个对象。比较的是对象的地址,即id(obj1)是否和id(obj2)相等。
成员操作符
in / not in 关键字,判断某个字符(子字符串)是否存在于字符串中。
028. 字符串常用方法汇总
常用查找方法
以一段文本作为测试:
a = “大家好,希望大家能够一起加油,好好学习,天天向上”
方法和使用示例 | 说明 | 结果 |
---|---|---|
len(a) | 字符串长度 | 24 |
a.startswith(“大家好”) | 以指定字符串开头 | True |
a.endswith(“向上”) | 以指定字符串结尾 | True |
a.find(“大”) | 第一次出现指定字符串的位置 | 0 |
a.rfind(“大”) | 最后一次出现指定字符串的位置 | 6 |
a.count(“大家”) | 指定字符串出现了几次 | 2 |
a.isalnum() | 所有字符全是字母或数字 | False |
去除首尾信息
- 可以通过 strip() 去除字符串首尾指定信息。
- 通过 lstrip() 去除字符串左边指定信息。
- 通过 rstrip() 去除字符串右边指定信息。
大小写转换
设定一个测试变量:
a = “huhu want to be BETTER”
示例 | 说明 | 结果 |
---|---|---|
a.capitalize() | 产生新的字符串,首字母大写 | ‘Huhu want to be better’ |
a.title() | 产生新的字符串,每个单词都首字母大写 | ‘Huhu Want To Be Better’ |
a.upper() | 产生新的字符串,所有字符全转成大写 | ‘HUHU WANT TO BE BETTER’ |
a.lower() | 产生新的字符串,所有字符全转成小写 | ‘huhu want to be better’ |
a.swapcase() | 产生新的字符串,所有字母大小写转换 | ‘HUHU WANT TO BE better’ |
格式排版
center()、ljust()、rjust()这三个函数用于对字符串实现排版。
- center() 实现居中对齐。
- ljust() 实现左对齐。
- rjust() 实现右对齐。
其他方法
- isalnum() 是否为字母或数字
- isalpha() 检测字符串是否只由字母组成(含汉字)
- isdigit() 检测字符串是否只由数字组成(有小数点.为False)
- isspace() 检测是否为空白符
- isupper() 是否为大写字母
- islower() 是否为小写字母
029. 字符串的格式化
format()基本用法
Python2.6开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
基本语法是通过 {} 和 : 来代替以前的%。
format函数可以接受不限个参数,位置可以不按顺序。
我们可以通过 {索引} / {参数名},直接映射参数值,实现对字符串的格式化,非常方便。
填充与对齐
填充常与对齐一起使用。
^ 、< 、> 分别是居中、左对齐、右对齐,后面带宽度。
: 号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充。
数字格式化
浮点数通过f,整数通过d进行需要的格式化。
数字 | 格式 | 输出 | 描述 |
---|---|---|---|
3.1415926 | {:.2f} | 3.14 | 保留小数点后两位 |
3.1415926 | {:+.2f} | 3.14 | 带符号保留小数点后两位 |
3.1415926 | {:.0f} | 3 | 不带小数 |
5 | {:0>2d} | 05 | 数字补零(填充左边,宽度为2) |
5 | {:x<4d} | 5xxx | 数字补x(填充右边,宽度为4) |
10 | {:x<4d} | 10xx | 数字补x(填充右边,宽度为4) |
1000000 | {:,} | 1,000,000 | 以逗号分隔的数字格式 |
0.25 | {:.2%} | 25.00% | 百分表比格式 |
1000000000 | {:.2e} | 1.00E+09 | 指数记法 |
13 | {:<10d} | 13 | 左对齐(默认为空格,宽度为10) |
030. 可变字符串
在Python中,字符串属于不可变对象,不支持原地修改,如果需要修改其中的值,只能创建新的字符串对象。但是,经常我们确实需要原地修改字符串,可以使用 io.StringIO对象 或 array模块 。
sio.seek(3) 即将指针移动到指定字符,从0开始数。
sio.write(“l”)即将指定字符修改为l。
031. 运算符总结
基本运算符
运算符 | 说明 |
---|---|
and , or , not | 布尔与、布尔或、布尔非 |
is , is not | 同一性判断,判断是否为同一个对象 |
< , <= , > , >= , != , == | 比较值是否相当,可以连用 |
I , ^ , & | 按位或、按位异或、按位与 |
<< , >> | 移位 |
~ | 按位翻转 |
+ , - , * , / , // , % | 加、减、乘、浮点除、整数除、取余 |
** | 幂运算 |
- bin()可以将数字转成二进制表示。
- 左移1位相当于乘以2,左移2位相当于乘以4,左移n位相当于乘以2n。
- 右移1位相当于除以2,同上。
- 字符串的加法相当于字符串拼接。
- 字符串的乘法相当于将字符串复制几次。
复合赋值运算符
运算符 | 描述 | 示例 | 等价于 |
---|---|---|---|
+= | 加法赋值 字符串拼接 | sum += n a += “hu” | sum = sum + n a = a + “hu” |
-= | 减法赋值 | num -= n | num = num - n |
*= | 乘法赋值 | a *= b | a = a * b |
/= | 浮点除赋值 | a /= b | a = a / b |
//= | 整数除赋值 | a //= b | a = a // b |
%= | 取余赋值 | a %= b | a = a % b |
**= | 幂运算赋值 | a **= 2 | a = a ** 2 |
<<= | 左移赋值 | a <<= 2 | a = a << 2 |
>>= | 右移赋值 | a >>= 2 | a = a >> 2 |
&= | 按位与赋值 | a &= b | a = a & b |
I= | 按位或赋值 | a I= b | a = a I b |
^= | 按位异与赋值 | a ^= b | a = a ^ b |
注:与C和JAVA不一样,Python不支持自增(++)和自减(- -)。
运算符优先级问题
如下优先级,从高到低。
运算符 | 描述 |
---|---|
** | 指数(最高优先级) |
~ | 按位翻转 |
* , / , % , // | 乘,除,取模,取整除 |
+ , - | 加法,减法 |
>> , << | 右移,左移运算符 |
& | 位 “AND” |
^ , I | 位运算符 |
<= , < , > , >= | 比较运算符 |
< , > , == , != | 等于运算符 |
= , %= , /= , //= , -= , += , *= , **= | 赋值运算符 |
is , is not | 身份运算符 |
in , not in | 成员运算符 |
not , or , and | 逻辑运算符 |
实际使用中,记住如下简单的规则即可,复杂的表达式一定要用 小括号 组织。
- 乘除优先加减
- 位运算和算术运算 > 比较运算符 > 赋值运算符