0.动态类型
列表可以通过引用其元素,改变对象自身(in-place change)。这种对象类型,称为可变数据对象(mutable object),词典也是这样的数据类型。
而像之前的数字和字符串,不能改变对象本身,只能改变引用的指向,称为不可变数据对象(immutable object)。
元组也是一个immutable object
1.字符串相关
1.1raw字符串与多行字符串
1.1.1raw字符串
在字符串前面加个前缀r,表示这是一个raw字符串,里面的字符就不需要转义了。例如:
r'(~_~)/ (~_~)/'
但是r'...'表示法不能表示多行字符串,也不能表示包含'和"的字符串
1.1.2多行字符串
如果要表示多行字符串,可以用'''...'''表示:
'''Line 1
Line 2
Line 3'''
上面这个字符串的表示方法和下面的是完全一样的:
'Line 1 Line 2 Line 3'
1.1.3raw字符串+多行字符串
在多行字符串前面添加r,把这个多行字符串也变成一个raw字符串,可以包含'和"的字符串:
r'''Python is created by "Guido".
It is free and easy to learn.
Let's start learn Python in imooc!'''
1.2Python中Unicode字符串
1.2.1背景
字符串还有一个编码问题。
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。
如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。
类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。
Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。
因为Python的诞生比Unicode标准发布的时间还要早,所以最早的Python只支持ASCII编码,普通的字符串'ABC'在Python内部都是ASCII编码的。
Python在后来添加了对Unicode的支持,以Unicode表示的字符串用u'...'表示,比如:
print u'中文'
中文
注意:不加 u ,中文就不能正常显示。
Unicode字符串除了多了一个u之外,与普通字符串没啥区别,转义字符和多行表示法仍然有效:
1.2.2unicode字符串
u'中文 日文 韩文'
1.2.3unicode字符串+多行字符串
u'''第一行
第二行'''
1.2.4unicode字符串+raw字符串+多行字符串
ur'''Python的Unicode字符串支持"中文",
"日文",
"韩文"等多种语言'''
1.2.5 UnicodeDecodeError异常与首行注释
如果中文字符串在Python环境下遇到 UnicodeDecodeError,这是因为.py文件保存的格式有问题。可以在第一行添加注释
# -*- coding: utf-8 -*-
目的是告诉Python解释器,用UTF-8编码读取源代码。然后用Notepad++ 另存为... 并选择UTF-8格式保存。
1.3Python中的格式化字符串
http://www.cnblogs.com/wilber2013/p/4641616.html
https://www.cnblogs.com/kaituorensheng/p/5709970.html
1.4字符串方法
http://www.cnblogs.com/yujiemeigui/p/7069210.html
1.4.1删除
strip() 删掉字符串两边的指定字符集合中的字符
lstrip() 去掉字符串左边的指定字符集合中的字符
rstrip() 删除字符串右侧的指定字符集合中的字符
注:strip、lstrip、rstrip不是直接删除指定字符串,而是指定字符集合中的字符
1.4.2统计
count() 统计字符串中指定字符串出现的次数
1.4.3分割
split() 从左到右根据指定的分隔符将字符串进行分割,可指定进行多少次分隔,负数表示最大分割
partition() 从左到右根据指定的分隔符将字符串进行分割,只进行一次分隔
rpartition() 从右到左根据指定的分隔符将字符串进行分割,只进行一次分隔
rsplit() 从右到左根据指定的分隔符将字符串进行分割,可指定进行多少次分隔,负数表示最大分割
splitlines() 以 、 、 为分隔符,将字符串分割,可选择返回的list元素是否包含这些分隔符
1.4.4替换
replace() 替换字符串中的子串,可以指定进行多少次替换
expandtabs() 把字符串的 符号转为空格
1.4.5大小写
capitalize() 将字符串的首字母大写
lower() 将字符串中的大写字符替换为小写
swapcase() 字符串的大小写互换
titile() 将字符串中所有单词的第一个首字母大写
upper() 将字符串中的小写字母转为大写字母
1.4.6对齐
center() 字符串居中对齐
ljust() 左对齐,右填充
rjust() 右对齐,左填充
zfill() 在字符串的左侧补充0至需要的长度
1.4.7编码
encode() 以指定的编码格式编码字符串
1.4.8格式化
format() 格式化输出字符串,可使用%和{}两种占位符
http://www.cnblogs.com/nulige/p/6115793.html
1.4.9根据list生成
join() 将序列中的元素以指定的字符连接,生成新字符串
1.4.10字符转换
maketrans() "创建字符转换表两个字符串的长度必须相同,为一一对应的关系"
translate() 使用maketrans()产生的翻译表对字符串进行翻译
1.4.11查找/包含
index() 检测字符串是否包含指定子串,不包含则报错
endswith() 判断字符串是否以指定的子串结尾
find() 检测字符串是否包含指定子串,不包含返回-1
rfind() 返回字符串在指定范围内最后一次出现的位置,没有匹配返回-1
rindex() 返回字符串在指定范围内最后一次出现的位置,没有匹配则报错
startswith() 检测字符串某范围的开头是否为指定子串
1.4.12判断
isspace() 检测字符串是否由空格、tab、回车组成
isalnum() 判断一个字符串是否由字母和数字组成
isalpha() 判断一个字符串是否全部是字母
isdecimal() 判断一个字符串是否全由Unicode数字,全角数字组成
isdigit() 判断一个字符串是否全由Unicode数字,byte数字(单字节),全角数字(双字节),罗马数字组成
isnumeric() 判断一个字符串是否全由Unicode数字,全角数字(双字节),罗马数字,汉字数字组成
isidentifier() 判断是否是合法标识符,可用来判断变量名是否合法
islower() 判断字符串是否全部由小写字母组成
isprintable() 判断字符串中所有字符是否可打印
istitle() 判断字符串中每个单词首字母是否都为大写
isupper() 判断字符串是否全是大写
2.Python中的布尔类型
Python把0、空字符串''和None看成False,其他数值和非空字符串都看成True
另:Python中也有短路运算
3.Python中的运算符
http://www.cnblogs.com/fjping0606/p/4761067.html
4.附:字符串方法详解
4.1删除
strip() 删掉字符串两边的指定字符串
s = '*****Hello world*****' print('原字符串>>>>',s,'<<<<') s1 = s.strip('*') print('更改后的字符串>>>>',s1,'<<<<') 结果如下: 原字符串>>>> *****Hello world***** <<<< 更改后的字符串>>>> Hello world <<<<
lstrip() 去掉字符串左边的指定字符串
s = '*******hello world*******' s1 = s.lstrip('*') print(type(s1),'开始位置',s1,'结束位置') 结果如下: <class 'str'> 开始位置 hello world******* 结束位置
rstrip() 删除字符串右侧的指定字符串
>>> s='hello world ' >>> print len(s),len(s.rstrip()),s.rstrip() 16 11 hello world
4.2统计
count() 统计字符串中指定字符串出现的次数
s = 'hello world' s1 = s.count('l',3,10) #表示统计字母l,从索引位置3到9位置(顾首不顾尾)的子串的个数 print(type(s1),s1) 结果如下: <class 'int'> 2
4.3分割
split() 分割字符串
s = 'hello world' s1 = s.split('l') #表示以字母l为分隔符 print(type(s1),s1) #得到一个列表 结果如下: <class 'list'> ['he', '', 'o wor', 'd']
partition() 从左到右根据指定的分隔符将字符串进行分割,只进行一次分隔
S = "http://www.w3cschool.cc/" print (S.partition("://")) 结果如下: ('http', '://', 'www.w3cschool.cc/')
rpartition() 从右到左根据指定的分隔符将字符串进行分割,只进行一次分隔
s = 'William is a big SB' s1 = s.rpartition(' ') print(type(s1),s1) 结果如下: <class 'tuple'> ('William is a big', ' ', 'SB')
rsplit() 从右到左根据指定的分隔符将字符串进行分割,可指定进行多少次分隔,负数表示最大分割
>>> s.rsplit('aaa',2) ['aaabbbaaabbb', 'bbb', 'bbb'] >>> s.rsplit('aaa',-1) ['', 'bbb', 'bbb', 'bbb', 'bbb']
splitlines() 以 、 、 为分隔符,将字符串分割,可选择返回的list元素是否包含这些分隔符
>>> s = 'hello Alex is a big SB Yes, he is' >>> s = 'hello Alex is a big SB Yes he is' >>> s.splitlines() ['hello', 'Alex is a big SB', 'Yes', 'he is'] >>> s.splitlines(True) ['hello ', 'Alex is a big SB ', 'Yes ', 'he is']
4.4替换
replace() 替换字符串中的子串,可以指定进行多少次替换
s = 'hello world world' s1 = s.replace('world','python',1) #只替换一个world print(type(s1),s1) 结果如下: <class 'str'> hello python world
expandtabs() 把字符串的 符号转为空格
# 每个 前面的字符串长度len(str) # 如果len(str)<tabsize,那么会给它补的空格个数为tabsize-len(str) # 如果len(str)>=tabsize,那么会给它补的空格个数为tabsize-len(str)%tabsize >>> s='1 11 111 1111 11111 111111' >>> s.expandtabs(1) '1 11 111 1111 11111 111111' >>> s.expandtabs(2) '1 11 111 1111 11111 111111' >>> s.expandtabs(3) '1 11 111 1111 11111 111111' >>> s.expandtabs(4) '1 11 111 1111 11111 111111' >>> s.expandtabs(5) '1 11 111 1111 11111 111111'
4.5大小写
capitalize() 将字符串的首字母大写
s = 'hello world' s1 = s.capitalize() # 将s字符串的首字母大字 print(type(s1),s1) 结果如下: <class 'str'> Hello world
lower() 将字符串中的大写字符替换为小写
s = 'HELLO WORLD' s1 = s.lower() print(type(s1),s1) 结果如下: <class 'str'> hello world
swapcase() 字符串的大小写互换
s = 'HELLO WORLD' s1 = s.swapcase() print(type(s1),s1) 结果如下: <class 'str'> hello world
titile() 将字符串中所有单词的第一个首字母大写
s = 'my name is william' s1 = s.title() print(type(s1),s1) 结果如下: <class 'str'> My Name Is William
upper() 将字符串中的小写字母转为大写字母
s = 'hello world' s1 = s.upper() print(type(s1),s1) 结果如下: <class 'str'> HELLO WORLD
4.6对齐
center() 字符串居中对齐
s = 'hello world' s1 = s.center(26,'#') #新字符串长度为26,左右以"#"填充 print(type(s1),s1) 结果如下: <class 'str'> #######hello world########
ljust() 左对齐,右填充
s = 'hello world' s1 = s.ljust(50,'*') print(type(s1),s1) 结果如下: <class 'str'> hello world***************************************
rjust() 右对齐,左填充
s = 'hello world' s1 = s.rjust(50,'*') print(type(s1),s1) 结果如下: <class 'str'> ***************************************hello world
zfill() 在字符串的左侧补充0至需要的长度
s = 'hello world' s1 = s.zfill(12) # 指定的长度若超过字符串的长度则会在左侧打印0补齐 print(type(s1),s1) 结果如下: 11 <class 'str'> 0hello world
4.7编码
encode() 以指定的编码格式编码字符串
s = '世界你好' s1 = s.encode('gbk') print(type(s1),s1) 结果如下: <class 'bytes'> b'xcaxc0xbdxe7xc4xe3xbaxc3'
4.8格式化
format() 格式化输出字符串,可使用%和{}两种占位符
s = 'My name is {0},My age is {1}' s1 = s.format('william',18) print(type(s1),s1) 结果如下: <class 'str'> My name is william,My age is 18 # ******分隔符*******
s = "Hello,my name is {name}, I'm {age} year old, I am a {profession}" s1 = s.format(profession='programmer',age=18,name='william') print(type(s1),s1) #format通过字典的key来填充,括号中间可以不按顺序传参。 结果如下: <class 'str'> Hello,my name is william, I'm 18 year old, I am a programmer
4.9根据list生成
join() 将序列中的元素以指定的字符连接,生成新字符串
s1 = '-' s2 = '' seq = ('h','e','l','l','o') print(s1.join(seq)) print(s2.join(seq)) 结果如下: h-e-l-l-o hello
4.10字符转换
maketrans() 创建字符转换表;两个字符串的长度必须相同,为一一对应的关系
translate() 使用maketrans()产生的翻译表对字符串进行翻译
# python3中deltab在maketrans中 # python2中deltab在translate中,且必须导入string模块 s = 'mnaei' s1 = '12345' rev = str.maketrans(s,s1) str = 'my name is william' print(str.translate(rev)) 结果如下: 1y 2314 5s w5ll531
4.11查找/包含
index() 检测字符串是否包含指定子串,不包含则报错
s = 'hello world' s1 = s.index('o',5,10) #表示从索引5至索引10的位置的开始查找字符"o"的所在索引位置。 print(type(s1),s1) 结果如下: <class 'int'> 7
endswith() 判断字符串是否以指定的子串结尾
s = 'hello world' s1 = s.endswith('or',1,9) #g表示从索引位置1至8(顾首不顾尾)查找是否以字符 'or'结尾 print(type(s1),s1) 结果如下: <class 'bool'> True
find() 检测字符串是否包含指定子串,不包含返回-1
s = 'hello world' s1 = s.find('l',5,10) #查找索引位置5至9中的字符"l"的位置 print(type(s1),s1) 结果如下: <class 'int'> 9
rfind() 返回字符串在指定范围内最后一次出现的位置,没有匹配返回-1
>>> s='aaabbbaaabbbaaabbbaaabbb' >>> s.rfind('aaa',5,-6) 12 >>> s.rfind('aaa',5,-1) 18
rindex() 返回字符串在指定范围内最后一次出现的位置,没有匹配则报错
>>> s='aaabbbaaabbbaaabbbaaabbb' >>> s.rindex('aaa',-6,-1) 18 >>> s.rindex('aaa',-5,-1) Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: substring not found
startswith() 检测字符串某范围的开头是否为指定子串
s = 'hello world' s1 = s.startswith('llo',2,10) #表示从索引2位置到9的位置搜索是否有以字符"llo" 开头的 print(type(s1),s1) 结果如下: <class 'bool'> True
4.12判断
isspace() 检测字符串是否由空格、tab、回车组成
s = ' ' s1 = s.isspace() print(type(s1),s1) 结果如下: <class 'bool'> True
isalnum() 判断一个字符串是否由字母和数字组成
s = 'William是一个大SBBBBBB' s1 = s.isalnum() print(type(s1),s1) s2 = 'helloworld666 ' s3 = s2.isalnum() print(type(s3),s3) 结果如下: <class 'bool'> True <class 'bool'> False
isalpha() 判断一个字符串是否全部是字母
s = '88888hello world88888' s1 = s.isalpha() print(type(s1), s1) s2 = 'helloworld' s3 = s2.isalpha() print(type(s3), s3) 结果如下: <class 'bool'> False <class 'bool'> True
isdecimal()
True: Unicode数字,全角数字(双字节) False: 罗马数字,汉字数字 Error: byte数字(单字节) 注: Unicode数字:u"1",u"2",u"3",u"4",... 全角数字:1,2,3,4,5... 半角数字:1,2,3,4,5,... byte数字:b"1",b"2",b"3",... 罗马数字:"Ⅰ","Ⅱ","Ⅲ","Ⅳ"... 汉字数字:"〇","零","一","壱","二","弐","三","参","四","五","六","七","八","九","十","廿","卅","卌","百","千","万","万","亿"
isdigit()
True: Unicode数字,byte数字(单字节),全角数字(双字节),罗马数字
False: 汉字数字
Error: 无
isnumeric()
True: Unicode数字,全角数字(双字节),罗马数字,汉字数字
False: 无
Error: byte数字(单字节)
isidentifier() 判断是否是合法标识符,可用来判断变量名是否合法
print( "_a".isidentifier() ) print( "中国123a".isidentifier() ) 结果如下: True False
islower() 判断字符串是否全部由小写字母组成
>>> s='aaab' >>> s.islower() True >>> s='aaabC' >>> s.islower() False
isprintable() 判断字符串中所有字符是否可打印
s = ' ' s1 = s.isprintable() print(type(s1), s1) s2 = 'hello world' s3 = s2.isprintable() print(type(s3), s3) 结果如下: <class 'bool'> False <class 'bool'> True
istitle() 判断字符串中每个单词首字母是否都为大写
s = '888What Is Your Name?' s1 = s.istitle() print(type(s1),s1) s2 = '888what is your name?' s3 = s2.istitle() print(type(s3),s3) 结果如下: <class 'bool'> True <class 'bool'> False
isupper() 判断字符串是否全是大写
s = '888MY NAME IS WILLIAM' s1 = s.isupper() print(type(s1),s1) 结果如下: <class 'bool'> True