● Python3访问字符串
Python不支持单字符类型,单字符在Python中也是作为一个字符串来使用;
字符串切片截取;
空值
空值是Python里一个特殊的值,用None
表示。None
不能理解为0
,因为0
是有意义的,而None
是一个特殊的空值。
最后,理解变量在计算机内存中的表示也非常重要。当我们写:
a = 'ABC'
时,Python解释器干了两件事情:
-
在内存中创建了一个
'ABC'
的字符串; -
在内存中创建了一个名为
a
的变量,并把它指向'ABC'
。
也可以把一个变量a
赋值给另一个变量b
,这个操作实际上是把变量b
指向变量a
所指向的数据,例如下面的代码:
a = 'ABC'
b = a
a = 'XYZ'
print(b)
最后一行打印出变量b
的内容到底是'ABC'
呢还是'XYZ'
?如果从数学意义上理解,就会错误地得出b
和a
相同,也应该是'XYZ'
,但实际上b
的值是'ABC'
,让我们一行一行地执行代码,就可以看到到底发生了什么事:
执行a = 'ABC'
,解释器创建了字符串'ABC'
和变量a
,并把a
指向'ABC'
:
执行b = a
,解释器创建了变量b
,并把b
指向a
指向的字符串'ABC'
:
执行a = 'XYZ'
,解释器创建了字符串'XYZ',并把a
的指向改为'XYZ'
,但b
并没有更改:
所以,最后打印变量b
的结果自然是'ABC'
了。
字符编码
我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。
由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。
但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。
你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
>>> fruit='banana'
>>> letter=fruit[1] #从fruit中选择索引为1的字符并将他赋给
letter
>>> letter'a'>>>
除了数字,Python还可以操纵字符串,可以一几种不同的方式表达。他们可以包含在单引号(‘...’)或者("...")双引号中,其结果相同
>>> 'apple''apple'
>>> 'doesn\'t' #可以用\’转义字符
"doesn't"
>>> "doesn't" #或者用两个不一样的引号
"doesn't"
>>> '"Yes,"he said'
'"Yes,"he said'
>>> "\"Yes,\"he said"
'"Yes,"he said'
>>> '"Isn\'t," seh said.'
'"Isn\'t," seh said.'
在交互式解释器,输出字符串包含在引号和特殊字与反斜杠转义。虽然这时有所不同,从输入(包含引号可以改变),这两个字符串是一样的。如果字符串包含双引号和单引号,该字符串给括在双引号中,否则被括在单引号中。print() 函数生成一个更可读的输出。\可用于转义引号。
>>> '"Isn\'t"she said.''"Isn\'t"she said.'
>>> print('"Isn\'t"she said.')
"Isn't"she said.
>>>
>>> s='First line.\nSecond line.' #\n表示换行=
>>> s'First line.\nSecond line.'
>>> print(s)First line.Second line.
>>>
如果你不想被\前缀解释为特殊字符,你可以使用原始字符串之前的字符串前加一个 r ;
>>> print('C:\some\name')
C:\some
ame
>>> print(r'C:\some\name')
C:\some\name
>>>
字符串连接
1:字符串可以通过+或者*操作符连接;
>>> #重复3次‘un’之后,后面加上‘ium’
>>> 3*'um'+'ium'
'umumumium'
>>>
2:两个或多个字符串(封闭的引号隔开)相邻之间自动连接;
>>> 'py''thon' #中间留不留空格效果一样
'python'
>>>
注:这只适用于两个字符串,而不是用于变量或者表达式;
>>> prefix='py'
>>> preix 'thon'
SyntaxError: invalid syntax
>>> ('un'*3)'ium'
SyntaxError: invalid syntax
>>>
3:如果你想连接两个变量,使用+操作符可以实现
>>> prefix='py'
>>> prefix+'thon'
'python'
>>>
4:一下字符串有其有用,当你想要打破输入一个长字符串;
>>> text=('My name is Anne,This is My page,'
'Welcome to my house!')
>>> text'My name is Anne,This is My page,Welcome to my house!'
>>>
字符串访问
1:字符串可以被索引(下标)访问;没有单独的字符类型,一个字符就是一个
字符串的大小;
>>> word='python'
>>> word[0] #在位置0,word的第一个字符
'p'
>>> word[5]
'n'
>>>
2:索引也有可能是负数,从右边开始计数;
>>> word[-1]
'n'
>>> word[-6]
'p'
>>>
注意:-0和0是一样的,负数索引从零开始;
字符串切片
>>> word[0:2] #从零位置到2的字符
'py'
>>> word[2:5]
'tho'
>>>
注意:一开始总是被包括,最后总是被排除在外,这确保s[:i]+s[i:]总是等价于s
>>> word='python'
>>> word[:2]+word[2:]
'python'
>>> word[:4]+word[4:]
'python'
>>> word[:8]+word[:8]
'pythonpython'
>>> word[:1]+word[1:]
'python'>>>
切片索引可以使用默认值,s[:i]省略第一个索引默认为零;s[i:]省略第二个索引默认被切片的字符串的大小。
试图使用太大的索引将导致一个错误。
>>> word[89] #word只有6个字母Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
word[89]IndexError: string index out of range
>>>
但是,此种情况下是可以使用切片的:
>>> word[2:89]
'thon'
>>>
上次已经说过Python字符串不能改变——他们是不可变的。因此,指定字符串中的索引位置导致一个错误。
>>> word[0]='J'Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
word[0]='J'TypeError: 'str' object does not support item assignment>>> word[2:]='py'Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
word[2:]='py'TypeError: 'str' object does not support item assignment>>> 'j'+word[1:]
'jython'
>>>
字符串处理是非常常用的技能,但 Python 内置字符串方法太多,常常遗忘,为了便于快速参考,特地依据 Python 3.5.1 给每个内置方法写了示例并进行了归类,便于大家索引。
PS: 可以点击概览内的绿色标题进入相应分类或者通过右侧边栏文章目录快速索引相应方法。
String Method 概览
字符串大小写转换
str.capitalize()
str.lower()
str.casefold()
str.swapcase()
str.title()
str.upper()
字符串格式输出
str.center(width[, fillchar])
str.ljust(width[, fillchar]);
str.rjust(width[, fillchar])
str.zfill(width)
str.expandtabs(tabsize=8)
str.format(^args, ^^kwargs)
str.format_map(mapping)
字符串搜索定位与替换
str.count(sub[, start[, end]])
str.find(sub[, start[, end]]); str.rfind(sub[, start[, end]])
str.index(sub[, start[, end]]); str.rindex(sub[, start[, end]])
str.replace(old, new[, count])
str.lstrip([chars]); str.rstrip([chars]); str.strip([chars])
static str.maketrans(x[, y[, z]]); str.translate(table)
字符串的联合与分割
str.join(iterable)
str.partition(sep);
str.rpartition(sep)
str.split(sep=None, maxsplit=-1);
str.rsplit(sep=None, maxsplit=-1)
str.splitlines([keepends])
字符串条件判断
str.endswith(suffix[, start[, end]]);
str.startswith(prefix[, start[, end]])
str.isalnum()
str.isalpha()
str.isdecimal();
str.isdigit();
str.isnumeric()
str.isidentifier()
str.islower()
str.isprintable()
str.isspace()
str.istitle()
str.isupper()