Python中的字符串

在Python中,字符串的类型可以归为三类:str,bytes,bytearray,其中str和bytes是不可变类型,而bytearray是可变类型。由于Python 2.X和Python 3.X的区别,相应的,它们在Python 2.X和Python 3.X中有不同的意义。

 

在Python 2.X中,str即可以表示8bit的文本(例如ASCII文本,Latin-1文本),也可以表示二进制数据,也就是说,在Python 2.X中,str和bytes类型是等价的;如果要表示Unicode文本,需要单独使用unicode字符串;而bytearray只有在Python 2.6中才有,表示可以修改的bytes数据;

在Python 3.X, str表示Unicode文本,bytes表示二进制数据,二者不等价;bytearray和Python 2.X中的意义一样,也表示可以修改的bytes数据。

所有的的字符串问题,包括读写文件,都可以归纳为上述问题

 

str、bytes和bytearray相互转换

1 Python 2.X

# str与bytes等价
>>>B = b'spam'          # bytes字面量
>>>S = 'eggs'            # str字面量
>>>type(B), type(S)
(<type 'str'>, <type 'str'>)


# str与unicode的转换,也即bytes与unicode的转换
>>>str(u'spam')     #unicode转换为str
spam
>>>unicode('spam')   #str转换为unicode,unicode函数可以选择编码,默认是平台编码
u'spam'


# str与bytearray的转换,也即bytes与bytearray的转换
>>>S = 'spam'
>>>C = bytearray(S)
>>>C
bytearray(b'spam')

 

2 Python 3.X

# str与bytes的转换,有两种方法:
# 1 使用str类型的encode方法
# 2 使用bytes函数
>>>S = 'eggs'
>>>S.encode()
b'eggs'
>>>bytes(S, encoding='ascii')
b'eggs'


# bytes与str的转换,有两种方法:
# 1 使用bytes类型的decode方法
# 2 使用str函数
>>>B = b'spam'
>>>B.decode()
'spam'
>>>str(B, encode='asci')
'spam'



# str与bytearray的转换
>>>S = 'spam'
>>>C = bytearray(S, 'latin1')   # 必须指明编码
>>>C
bytearray(b'spam')


# bytes与bytearray的转换
>>>B = b'spam'
>>>C = bytearray(B)
>>>C
bytearray(b'spam')

对于上面的由bytes转换为str的例子,如果调用str函数不传递编码参数'ascii',那么str函数并不是使用平台的默认编码,而是返回bytes对象的一个print string,看例子就明白了:

>>>B = b'spam'
>>>str(B)
"b'spam'"

 

字面量的表示方法

1 Pyhon 2.X

在Python 2.X中,声明字面量可以使用前缀b/B,u/U。其中对于Python 2.X来说,不使用前缀和使用前缀b/B的效果是一样的,都表示str(或者bytes)类型,如果要表示unicode字符串,则必须带前缀u/U。

 

2 Python 3.X

在Python 3.X中,声明字面量可以使用b/B,u/U前缀。其中,对于Python 3.X来说,不使用前缀和使用前缀u/U的效果是一样的,都表示str类型(也即unicode字符串),如果要表示bytes类型,那么必须加前缀b/B。但是需要注意一点的就是,u/U前缀在Python 3.0中不支持。

 

字面量中嵌入字符编码

Python支持在字符串字面量中直接嵌入字符编码,字符编码的形式可以为\xNN,也可以是\uNNNN,也可以是\UNNNNNNNN。

1 Python 2.X

由于str类型(也即是bytes类型)在Python 2.X中是8bit的,因此只能使用\XNN的形式;对于unicode字符串,可以使用上面三种形式:

>>>S = '\x31'        # 字符'1'的编码为\x31
>>>S
'1'

>>>S = '\u0031'      # \u形式不支持
>>>S
'\\u0031'

>>>S = '\U00000031'  # \U形式不支持
>>>S
'\\U00000031'

>>>S = u'\x31'
>>>S
u'1'

>>>S = u'\u0031'
>>>S
u'1'

>>>S = '\U00000031'
>>>S
u'1'

 

2 Python 3.X

由于Python 3.X中str类型就是unicod的,所以支持上述三种形式,相反,Python 3.X中的bytes类型只支持\xNN:

>>>S = '\x31'     
>>>S
'1'

>>>S = '\u0031'
>>>S
'1'

>>>S = '\U00000031'
>>>S
'1'


>>>S = b'\x31'
>>>S
b'1'

>>>S = b'\u0031'         #不识别
>>>S
b'\\u0031'

>>>S = b'\U00000031'       #不识别
>>>S
b'\\U00000031'

为了进一步的理解,我们可以使用len函数来看长度。对于Python 2.X和Python 3.X,凡是打印出字符'1'的,使用len计算长度都是1,凡是不识别的,对于\u形式,len计算的长度是6,对于\U形式,len计算的长度是10。

 

类型混用

1 Python 2.X

在Python 2.X中,如果unicode字符串与bytes类型(也即str类型)混用,如果bytes类型中只包含ASCII字符,那么,Python自动将bytes类型转换成unicode字符串:

>>>u'ab' + 'cd'
u'abcd'

>>>u'ab' + 'cd\xef'           # 含有非ASCII字符,不支持
UnicdoeDecodeError:'ascii' codec can't decode byte 0xef in position 2:orinal not in range(120)

 

2 Python 3.X

unicode字符串与bytes类型混用,Python不会自动转换,必须手动转换成统一类型,要么统一成unicode字符串,要么统一成bytes类型。

 

Python中的字符串是一种不可变的序列类型,用于表示文本数据。字符串可以通过单引号(')、双引号(")或三引号('''或""")来创建。三引号字符串可以跨越多行,常用于多行字符串和注释。 字符串Python中是序列的一种,所以它支持一些通用的序列操作,比如索引、切片、乘法和成员资格测试等。 下面是字符串的一些常见操作: 1. 索引与切片:通过索引可以访问字符串中的特定字符,通过切片可以获取字符串的一部分。 ```python s = "Hello, world!" print(s[0]) # 输出 'H' print(s[1:5]) # 输出 'ello' ``` 2. 字符串连接:可以使用加号(+)来连接两个字符串。 ```python s1 = "Hello" s2 = "world" print(s1 + ", " + s2) # 输出 'Hello, world' ``` 3. 重复:使用乘法操作符(*)可以重复字符串。 ```python print("Python" * 3) # 输出 'PythonPythonPython' ``` 4. 成员资格测试:使用in和not in来检查某个字符串是否包含在另一个字符串中。 ```python print('H' in "Hello") # 输出 True print('z' not in "Python") # 输出 True ``` 5. 转义字符:在字符串中可以使用反斜杠(\)来引入特殊字符,如换行(\n)、制表符(\t)等。 ```python print("Hello\nPython") # 输出 'Hello' 后跟一个换行,然后是 'Python' ``` 6. 原始字符串:在字符串前加上前缀r或R表示原始字符串,它不会处理字符串中的转义字符。 ```python print(r"\n") # 输出 '\n' 而不是换行 ``` 7. 字符串方法:Python提供了许多字符串方法,例如upper(), lower(), split(), replace(), find(), format()等,用于处理字符串数据。 ```python s = "hello, world" print(s.upper()) # 输出 'HELLO, WORLD' print(s.split(",")) # 输出 ['hello', ' world'] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值