应听友要求,根据喜马拉雅上的音频节目『听学编程之Python』整理所得。
除了数值外,Python处理字符串特别方便,甚至在编程界,也算是最方便的类型。要掌握哪些入门知识呢?字符串 unicode 列表。
1 字符串
用单引号或双引号标识。所有的字符都被放在单引号和双引号
>>> ' hello' # single quotes
'spam eggs’
加法和乘法 索引 查找
1.1 字符加法和乘法
字符串可以由 + 操作符连接(粘到一起),可以由 * 重复:
>>>'hello' + 'world'
字符的乘法
‘hello'*9
1.2 索引 index
什么叫索引,一个班所有的学生都有学号,按照学号排好队,学号就是索引,从0开始。表示了内存中的位置序号。
1.2.1 找到索引的字符
>>> ’hello’[0] h
如果是negative numbers,负数,那就是从右到左。最后一个是-1
>>> ’hello’[-1] o
1.2.2 使用索引切片 slicing
slicing 切片。获取子字符串。那怎么取呢?
>>> ’hello’[0:2]
‘he'
‘hello’[1:]
‘hello’[:1]
1.3 查找
找到字符的索引。
需要使用方法了。方法就是函数,属于类或者类的实例叫做对象。听不懂不要紧。’hello’就是一个对象,是str类的实例。
isinstance(‘hello’,str) true
'hello'.find('l') 2
‘hello'.rfind('l') 3
len(‘hello’) 是一个内置函数,是解释器自带的函数,直接使用即可。exit()就是这样的。解释器看得懂。
2 unicode 编码和解码 encode decode
2.1第一印象
s = ‘中国’
u = u’中国’
首先介绍一个内置函数,内置函数就是随时随地直接使用的,已经帮你加载好了。
type()
如果你不知道就是用type(), str unicode
解释器内部是不支持的,解释器不懂中国话,我们要把中国话编码成为4个字节32位的 ,只能当成一段字面文字,但是不能当做 变量名称。解释器就当成一段乌拉哇啦的话。不解释,不语义分析。
2.2 深入理解
但是如果仅仅是存储,那还好,问题是,至少要显示在屏幕上吧。这就麻烦了。显示出来的过程是这样的,比如曹县,特别喜欢举牌子,计算机cpu读到一个字符,其实是读到代表这个字符的一个数字,指挥员根据数字,再查一下表就知道了,应该把哪块牌子举起来。你们就看到相应的字符了。这就是编码code。一定记住,不是encode和decode。
128个数字 就表示了所有英文,127个牌子就可以显示所有文字了,连控制字符都有了,比如某一个数字,指挥员看到之后,不举牌子,高喊三声伟大,或者表示,我从下一行开始举牌子了。
但是十几万个中文怎么办,需要1 到100000个数字吧。度多少块也就是3位数 搞定所有英文, 7位数才能搞定中文。
如果二进制呢?8位数搞定所有英文,但是 16位数才能搞定中文。
这就是编码code。一定记住,不是encode和decode。
但是 unicode 是个美好的幻想。人类的所有字符都是用一套数字来表示。汉字也在某一个区间里面。美国人不同意了,你这太浪费了。
压缩格式应运而生,utf-8特点是应用某种规则,就能把所有字符全部专为8位数搞定的。
能把unicode 转化成为和ascii单字符宽度8字节相同的一种编码格式。# -*- coding: utf-8 -*-
unicode 是一种编码体系 就是unicode
ascii 是一种编码体系 由于是系统默认就是str
美国造了一辆火车轨道宽度是8位,用的很好,中国必须要16位宽的火车才行。怎么办。聪明人想到了一个办法,把中国的16位宽度的火车拆成两个8位的车厢,放到8位轨道上跑。根据车厢的不同,有的就是直接为一个,有的拆成3个,有的拆成4个,同时保证能拆,能装,等到了站,还能组装成16位宽的车厢,不会错乱。这就是utf-8 Unicode Transformation Format 全编码变形(转换)8位格式。
2.3 怎么用呢?
我们输入中文的时候,解释器是美国人不懂中文啊,但是他能听得懂这是音符啊,所以他也能模仿出来对不对,这就行了。最常见的办法就是拆成符合英文习惯的8位,这就可以存放的。但是只能拆装,比如组装起来输出一下是可以的。但是无法处理啊对不对,序列已经变得不随机了,有的是1个,有的是3个。怎么办?
转化为unicode编码,这个时候使用unicode的字符串来存储,就可以使用和前面的str,一样的序列操作来操作了。当我们处理完了之后,如果需要传输,或者只要确保不把一整段的字符串内部序列变化,就又可以拆装,压缩成utf-8格式的,能和str一起用的格式。
3. 列表
字符串是一种序列,序列有两种,一种是可变的一种是不可变的。不可变的就比如字符串,tuple元组 xrange生成器。 而可变的包括列表 bytearray list
特点就是有序。
比如 常用的list。[],里面用逗号分隔。
3.1 合并 乘法
a= [1] + [‘a’]
3.2 切片
a=[1,2,3]
b = [1,2]
3.3 查找 长度
a.find(1) a,rfind(1)
3.4 修改,删除 附加
a[1] = ‘b’
a.remove(‘b’)
a.append(‘b’)
那我们已经学习了python的字符串和序列处理方法,能干什么用处呢?坦白说在一开始录音频的时候,我也不知道,我只想着先把知识点说完,看看能干什么,我就一直想着,字符串,文字,字符串,文字,慢慢的。就在结束的那一刻,突然有两个字出现在我的脑海中,文章,紧接着,我就想到了一个我以前想做但是一直没有做的事情。我要把一个人的话全部搜集整理出来,谁的话呢?贾宝玉,从哪里呢?红楼梦。红楼梦那是中文前无古人,后不知道有没有来着的巅峰之作,内行人都知道,曹雪芹擅长从语言表现人的性格,一开口就知道这个人是谁,性格,地位,目的交代的清清楚楚,而且百人百词,同样的话,两个人说就有一两个字的区别,对谁说有区别,什么时机说又有区别,却又恰当好处的体现出了此时此刻人物的关系。中文的运用,曹雪芹绝对的已经出神入化了。一句话包含多少心思机巧,爱恨情仇啊。比如说,红楼梦里面脏话少没得说吧,塑造的人物黛玉那是曹雪芹心里最干干净净的姑娘了吧,但是她确实为数不多 4,5个人吧,骂过别人放屁的人其中之一,骂谁呢?你们猜一猜看,宝玉。一个遇到谁都礼让退让,把自己压抑到极致的女孩子,只有在她爱的宝玉面前,能够骂出这个词,通便下来,你能感受黛玉对宝玉的信任到什么程度了吧,也就能想到后面宝玉和薛宝钗成亲对她造成了多大的打击了?
首先是预处理,我们使用文本编辑器,把换行符全部替换掉,再用结束引号,替换成为引号加上换行符。就准备好了。把文本存储好,名字就叫红楼梦.txt。
打开文件的函数叫做
由于文本太多,我们一行行的进行处理,
所有的值,以
问:“
道:“
说:“
叫:“
叹:“
”结束
从 :“向前移动如果有标点符号之间,表示说话的人,如果出现宝玉则使用。
,
?
换行
。
gem_talkers=[]
gem_talks=[]
file = open('/Users/henry/Downloads/红楼梦.txt')
for line in file.readlines():
u_line = unicode(line,'utf-8')
colon_index = u_line.rfind(u':“')
if colon_index > -1 :
talker = u_line[:colon_index]
for sign in reversed(talker):
if sign in [u',',u'?',u'。']:
talker = talker[talker.rfind(sign)+1:]
if talker.rfind(u’宝玉’) > -1:
talk = u_line[colon_index:]
gem_talks.append(talk)
gem_talkers.append(talker)
file.close()
for i in range(0,len(gem_talks)):
print unicode(i) + u' ' + gem_talkers[i].strip() + gem_talks[i].strip()
pass
配合音频,边听边看效果更好哦!点击这里『听学编程之Python』