python 字符串
字符
a、A、中、+、*、の......均表示一个字符
一般 utf-8 编码下,一个汉字 字符 占用 3 个 字节
一般 gbk 编码下,一个汉字 字符 占用 2 个 字节
编码
规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储。(其实际是对字符集中字符进行编码,即:每个字符用二进制在计算中表示存储);
通俗的说:编码就是按照规则对字符进行翻译成对应的二进制数,在计算器中运行存储,用户看的时候(比如浏览器),在用对应的编码解析出来用户能看懂的;
ASCII编码
有96个打印字符,和32个控制字符组成;一共96+32=128个;
ASCII 用 7 位二进制数来对每 1 个字符进行编码
而由于7位还还不够1个字节,而电脑的内部常用字节来用处理,每个字节中多出来的最高位用0替代;
0 000 0000.........................0
0 111 1111..........................127;
从0----127,来表示128个ACSii编码;
比如:
字符 'A' ---------- 在计算器内部用0100 0001 (65)来表示;
字符 'a' ---------- 在计算器内部用0 110 0001 (97)来表示;
注意:'10'在计算器内部是没有编码的,因为它是字符串,而不是单个字符。可以分别对1, 0字符编码存储;
扩展ASCii字符集
将标准的ASCii最高位1,得到十进制代码128---255(1 000 0000----1 111 1111);所以字符集一共有0---255, 256个字符;
gb2312字符集
仅支持简体中文,所有汉字字符在计算机内部采用2个字节来表示,每个字节的最高位规定为1【正好与标准ASCii字符(最高位是0)不重叠,并兼容】,不支持繁体字;
所以:gb2312表示汉字的编码为:[129--255][129--255] (两个字节,每个字节最高位是1);小于127的字符,与ASCii编码相同;
gbk字符集
gb2312的扩充,兼容gb2312,除了收录gb2312所有的字符外,还收录了其他不常见的汉字、繁体字等;
gbk中字符是一个或两个字节,单字节字符00--7F(0---127)这个区间和ASCII是一样的;
双字节字符的第一个字节是在81--FE(129--254)之间。通过这个可以判断是单字节还是双字节;
即:在gbk字符编码,如果第一个字节是>128的,则再往后找一个字节,组成汉字;如果第一个字节<128,则表示的是一个单字节(此时和ASCII是一样的);
Unicode--统一码、万国码
容纳世界上所有语言字符和符号的集合(以及对应的二进制数字);
Unicode只是一个编码规范,目前实际实现的unicode编码主要有三种:UTF-8、UCS-2和UTF-16,三种unicode字符集之间可以按照规范进行转换。
python字符串默认使用Unicode编码表示文本,
Ubicode编码通常是2个字节,如果你写的文本基本上全部是英文的话,用Unicode编码比ASCII编码需要多一倍的存储空间,在存储和传输上就十分不划算。
UTF-8编码
UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部分修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或发送文字的应用中,优先采用的编码。
UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间:
在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:
进制
bit (比特,位):计算机内存和处理信息的最小单位,一个比特值可以是0或1,不能再分割;1bit 等于一个二进制位;01011110 = 表示一个8位(bit)的二进制数
byte (字节):一个字节等于8个二进制位 (bit)
二进制:0 | 1
16进制:0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A| B | C | D | E | F
1位16进制数 = 4位二进制位
2个16进制位 = 一个字节(8位)
例如:数字15
用16进制表达:0xF(长度1)
用二进制表示:1111(长度4)
十进制 | 二进制 | 八进制 | 十六进制 |
---|---|---|---|
0 | 0b0 | 0o0 | 0x0 |
1 | 1 | 1 | 1 |
2 | 10 | 2 | 2 |
3 | 11 | 3 | 3 |
4 | 100 | 4 | 4 |
5 | 101 | 5 | 5 |
6 | 110 | 6 | 6 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
在线进制转换工具:链接
进制转换
- bin() 转换成二进制字符串
- orc() 转换成八进制字符串
- hex() 转换成十六进制字符串
- int() 转十进制
- ord(alphabet) 返回一个字符的ASCII值或者Unicode值
- chr(number) 返将一个整数 (0-1114111) 转换为 一个字符(整数对应的 ASCII 字符)
字符串
函数的使用
1、python的字符串是不可以改变的字符序列
1、a,b = 1,2 #交叉赋值,所以交换a,b的数据不需要再创建一个变量
3、is / is not 判断两个对象是否是同一个对象,如果是返回True,否则返回False
3、in / not in 判断字符串是否在,返回True or False
3、字符串的切片 字符串序列[(开始索引a):(结束索引b)(:(步长s))] #不包括结束索引b
3、print(1,2,3,end=''), end:输出完毕后在末尾自动追加一个字符串,print()中默认end=('/n')所以print函数会换行,我们用end=' '可以让结果的结尾避免换行,通常用来避免不同print之间的换行
3、print(1,2,3,sep='*'), sep:分隔号*,往可迭代对象中插入分隔符
1 print(1,2,3,sep = "*") #1*2*3 2 print("我爱","我自己",sep="*") #我爱*我自己
3、id(ibj) 返回一个对象在内存中的地址
2、del 变量名; 删除变量,删除与对象的关联关系,可能释放对象
2、bool(obj)返回Ture 或者 Flase
3、len(x) 求序列的长度
3、abs(x)绝对值
3、pass 通常用来避免空白,pass语句通常称之为空语句
3、None 空值 用来占位;用来解除变量;常见的空值有 0, 0.0, 0j, ''空字符串,[]空列表,()空元组,{}空字典
3、运算符 +; -; *; /; //地板除,结果去除小数取整; **幂运算;%求余
4、round(number,ndigits=0)对number进行四舍五入,ndigits是小数点向右取整的位数,负数表示先左取整的位数
5、pow(x,t,z)相当于x**y或者x**y%z
1、complex(a,b)可以用数字创建一个复数 (a+bj)
6、help(函数)函数查看文档
7、%占位符 print("我叫%s,年龄%d"%("LXP-Never",23))
8、input() 以'字符串'的形式获取用户输入
3、list() 创建空列表或L = [] list(range()) 用可迭代对象创建一个列表
9、help('_main_') 在交互模式在查看当前作用域的所有变量 退出键:q
9、str() 字符串构造函数
str(123) #结果 #‘123’
10、原始字符串
作用:原始字符串能够让字符串中的每一个字符都保持原样,让转义字符\无效,但是原始字符串不能以单个反斜杠结尾
格式:r'字符串内容'
但是如果字符串最后一个就是\,该如何显示呢?下面的代码会给出答案
1 #Author:凌逆战 2 s = 'C:\newfile\test.py' 3 print(s) 4 #C: 5 #ewfile est.py 6 print(len(s)) # 16 7 s = r'C:\newfile\test.py' 8 print(s) # C:\newfile\test.py 9 print(len(s)) # 18 10 11 print(r'C:\Program Files\foo\bar' '\\') # C:\Program Files\foo\bar\
1、转义字符:
\' 单引号(')
\" 双引号(")
\\ 一个反斜杠
\n 换行
\r 返回光标至行首
\t 水平制表符
\v 垂直制表符
\f 换页
\b 倒退
\0 空字符,字符值为零
\xXX XX为两位十六进制表示的字符
\uXXXX XXXX为四个十六进制表示的Unicode16字符
\UXXXXXXXX 8个十六进制表示的Unicode32字符
这些转义字符要在" "字符串中打印
字符串format函数的使用
from math import * print("hello,%s"%('凌逆战')) # hello,凌逆战 print('{},{},{}'.format("孙悟空", '猪八戒', '沙悟净')) # 孙悟空,猪八戒,沙悟净 print('{0},{1},{2}'.format("孙悟空", '猪八戒', '沙悟净')) # 孙悟空,猪八戒,沙悟净 print('{1},{0},{2}'.format("孙悟空", '猪八戒', '沙悟净')) # 猪八戒,孙悟空,沙悟净 print('{1},{0},{2},{0}'.format("孙悟空", '猪八戒', '沙悟净')) # 猪八戒,孙悟空,沙悟净,孙悟空 # 命名参数和未命名参数混合使用 print("{foo} {} {bar} {}".format(1, 2, bar=4, foo=3)) # 3 1 4 2 print("{foo} {1} {bar} {0}".format(1, 2, bar=4, foo=3)) # 3 2 4 1 # 精度 print('{name}的值是 {value}'.format(value=pi, name='π')) # π的值是 3.141592653589793 print('{name}的值是 {value:.2f}'.format(value=pi, name='π')) # π的值是 3.14,如果不.2f,默认保留6位,# 将数字作为浮点数进行处理 #字符串格式设置 print("{num:b}".format(num=42)) # 101010 # 将数字作为二进制数进行处理 print("{num:c}".format(num=65)) # A # 将整数转换成Unicode编码 print("{num:d}".format(num=65)) # 65 # 十进制 print("{num:e}".format(num=65)) # 6.500000e+01 # 科学计数法 print("{num:.2%}".format(num=0.65)) # 65.00% # *100百分号表示 # 宽度 print("{num:10}".format(num=3)) # 3 # 宽度10,数字右对齐 print("{name:10}".format(name="Bob")) # Bob # 宽度10,字符串左对齐 print("{pi:10.2f}".format(pi=pi)) # 3.14 # .号左边是宽度,右边是精度 print("{:.5}".format("Guido van Rossum")) # Guido # 也可指定其他类型的精度 print('One googol is {:,}'.format(100000)) # One googol is 100,000 # 千位分隔符 # print(f'e的值为{e}') # 在python 3.6中 e的值为2.787948764 # 下述三个标志(s、r和a)指定分别使用str、repr和ascii进行转换 print("{pi!s} {pi!r} {pi!a}".format(pi="π")) # π 'π' '\u03c0'
1、符号、对齐、填充
在指定的宽度和精度前面可以添加一个标志,标志可以是
零、加号、减号、空格填充字符串
默认的填充是空格,但也能使用填充字符$来填充
1 print('{:010.2f}'.format(pi)) # 0000003.14 2 print('{:+10.2f}'.format(pi)) # +3.14 3 print('{:-10.2f}'.format(pi)) # 3.14 4 print('{: 10.2f}'.format(pi)) # 3.14 5 print('{:$^10.2f}'.format(pi)) # $$$3.14$$$
左对齐、右对齐和居中,分别使用<、>和^
1 print('{0:<10.2f}\n{0:^10.2f}\n{0:>10.2f}'.format(pi)) 2 # 3.14 3 # 3.14 4 # 3.14
字符串的方法
对象.方法(方法传参)
假设字符串的变量名为s
方法 | 说明 |
---|---|
'+'.join('1234') |
将字符串'+'插入含字符串的可迭代对象(列表、元组、字符串),返回字符串 1+2+3+4 |
'1+2+3+4'.split('+') |
将字符串按指定字符拆分,返回列表 ['1', '2', '3', '4'] |
S.isdigit() |
判断字符串中的字符是否全为数字 |
S.isalpha() |
判断字符串是否全为英文字母 |
S.islower() |
判断字符串所有字符是否全为小写英文字母 |
S.lower() |
生成将英文转换为小写的字符串 |
S.isupper() |
判断字符串所有字符是否全为大写英文字母 |
S.upper() |
生成将英文转换为大写的字符串 |
S.isspace() |
判断字符串是否全为空白字符 |
S.center(width[,fill]) |
将原字符串居中,width是字符串的总宽度,fill是填充字符,默认是空格 |
S.count(sub[, start[,end]]) |
获取一个字符在字符串中的个数 |
S.find(sub[, start[,end]]) |
获取字符串中子串sub的索引,失败返回-1 |
S.index(sub) |
返回一个字符在字符串中的索引,若没有,会报一个异常 |
S.strip() |
返回去掉左右空白字符的字符串 |
'*** SPM * eve!!! ***'.strip(' *!') |
能删除字符串左右两边的指定字符。 # SPM * eve |
S.lstrip() / S.rstrip() |
返回去掉左侧空白字符的字符串 / 返回去掉右侧空白字符的字符串 |
S.replace(old, new[, count]) |
将原字符串的old用new代替,生成一个新的字符串 |
S.startswith(prefix[, start[, end]]) |
返回S是否是以prefix开头,如果以prefix开头返回True,否则返回False, |
S.endswith(suffix[, start[, end]]) |
返回S是否是以suffix结尾,如果以suffix结尾返回True,否则返回False |
以下是不常用的 |
|
S.title() |
生成每个英文单词的首字母大写字符串 |
S.isnumeric() |
判断字符串是否全为数字字符 |
1、注释:单行注释#,多行注释''' '''或者""" """。
三单/双引号还可用于打印多行内容,x = ''' '''。
2、range()函数 用来创建一个生成一系列整数的可迭代对象(整数序列生成器),range函数的返回值可用于for语句来一次迭代输出整数,生成的是数字序列
range(start,stop) 从start开始,到stop,但是不包括stop,可以取步长
3、列表可以嵌套列表 L = [1, 2, [3.1, 3.2, 3.3], 4]
列表会把字符串分开来, L = list("hello") # L = ['h', 'e', 'l', 'l', 'o']
列表可以用运算符(+ - * )进行拼接、重复
4、重复要做的事放在循环内
5、for 循环中else 语句,是执行完for语句之后,再执行else中的代码
6、str和repr。str能够转换成用户能看懂的字符串;repr能够获得合法的python表达式
1 print(repr("Hello,\nWorld")) 2 # 'Hello,\nWorld' 3 print(str('Hello,\nWorld')) 4 # Hello, 5 # World
判断是否为空
方法一: if not name: # 如果name有值则为真,not name 就是假,那么如果name是空,那么就是假,not name 就是真
break
方法二: if name == ' ': #如果名字为空,结束输入操作,
break
字节串
字节:字节(byte)是由8位(比特位bit)组成的数据单位,是计算机进行数据管理的单位字节是用0~255范围内的整数表示的
作用:存储以字节为单位的数据
说明:字节串是不可变的序列,字节串是0~255之间的整数
创建空字节串的字面值:b"" 或 B""
创建非空字节串的字面值:
b'ABCD' #b'ABCD'
b'\x41\x42' #b'AB'
b'hello tarena' #b'hello tarena'
字节串的构造函数 bytes
bytes() 生成一个空的字节串 等同于 b''
bytes(整型可迭代对象) 用可迭代对象初始化一个字节串
bytes(整数n) 生成n个值为零的字节串
bytes(字符串, encoding='utf-8') 用字符串的转换编码生成一个字节串
字节串的运算
+ += * *=
<, <= , > ,>= , == ,!=
in not in
索引 切片
示例:
b = b'abc' + b'123' # b=b'abc123'
b += b'ABC' # b=b'abc123ABC'
b'ABD' > b'ABC' # True
b = b'ABCD'
65 in b # True
b'A' in b # True
用于序列函数:
len(x), max(x), min(x), sum(x), all(x), any(x)
bytes 与 str的区别:
bytes 存储字节(0-255)
str 存储Unicode字符(0-65535)
bytes 与 str 转换
解码(decode)——字节串(bytes)转换成字符串(str)
s = b.decode('utf-8')
编码(encode)——字符串(str)转换成字节串(bytes)
b = s.encode('utf-8')
字节数组 bytearray
可变的字节序列
创建字节数组的构造函数:
bytearray() 创建空的字节数组
bytearray(整数)
bytearray(整型可迭代对象)
bytearray(字符串,encoding='utf-8')
注: 以上参数等同于字节串
字节数组的运算:
+ += * *=
比较运算: < <= > >= == !=
in / not in
索引 / 切片赋值
bytearray的方法:
B.clear() 清空字节数组
B.append(n) 追加一个字节(n为0-255的整数)
B.remove(value) 删除第一个出现的字节,如果没有出现,则产生ValueError错误
B.reverse() 字节的顺序进行反转
B.decode(encoding='utf-8') # 解码
B.find(sub[, start[, end]]) 查找