zl程序教程

您现在的位置是:首页 >  Python

当前栏目

python 字符串

2023-02-18 16:40:05 时间

字符

  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="*")   #我爱*我自己
print(a,b,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’
str()

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\
row

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
str\repr

判断是否为空

方法一:  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]]) 查找