建议先看完前面的章节,前面章节内容:
- 和Python好好谈一谈(print)
- Python你帮我省省心啊(=)
- 把文字扭一扭(关于string的命令)
- 让别人也来参与一下(raw_input)
- 我真得不想看大段的字串啊!(list的概念)
6 原来都是烤串儿而已(slicing/indexing)
已经引入了列表(list)的概念,也提到列表和字串(string)共享部分命令。现在说为什么。因为所谓列表,就是一个一个元素按照固定顺序排列而已;而所谓字串,是一些特殊一点的元素——字符——按照固定顺序排列。情形有一点点像脚本1。
[code language=”python”]
#脚本1
a=’python’
mylist=[‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’]
[/code]
(这一段其实不怎么重要)单就元素顺序排列这点来看,字串(string)毕竟还是比列表(list)特殊一些,比如脚本1的a这个字串里,可以包含’py’, ‘thon’, ‘ytho’这些【字符的组合】,而mylist这个列表里,这些元素就没那么轻易地「随机」组合在一起。跳到结论吧,在字串里查找某个【或某些】字符在哪个位置,用find;在列表里查找某个元素在哪个位置,用index,详见脚本2(注:其实吧,如果真把字串理解为一种特殊的列表的话,index命令也是可以用于字串的)。
[code language=”python”]
#脚本2
a=’python’
mylist=[‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’]
af=a.find(‘y’)
mf=mylist.index(‘h’)
print af
print mf
# >> 1
# 3
[/code]
理解了其实无论字串(string)还是列表(list)本质上都是烤串儿而已,就可以入手一个被称为slicing/indexing的功能了【选取一根串儿上需要的部分】。实现这个功能的方法是用 串[参数]。下面的例子里默认字串 a=’python’ 列表 mylist=[‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’]
a[0]
字串a里选取第1个元素
mylist[1]
列表mylist里选取第2个元素
a[-1]
字串a里选取最后1个元素
mylist[-2]
列表mylist里选取倒数第2个元素
也可以一次按顺序选多个元素,中括号里记得写[起始位置:结束位置],【不过要注意的是结束位置并不包含在里面!】
a[0:2]
字串a里选取前2个元素
mylist[2:5]
列表mylist里选取第3、第4、第5个元素
a[-3:-1]
字串里选取倒数第3和倒数第2个元素
如果想包含最后一个元素,那冒号后面可以不填;另外如果是从第一个元素开始数,冒号前面也可以不写。
a[:3]
字串a里选取前3个元素
mylist[-2:]
列表mylist里选取最后两个元素
最后,如果我们对于字串(string)和列表(list)都培养好了端正的「烤串观」之后,有一个很有用的命令叫len,作用是查一下这个串儿上一共有多少个元素。
[code language=”python”]
#脚本3
a=’python’
mylist=[‘Python’, ‘so’, ‘easy’]
al=len(a)
ml=len(mylist)
print al
print ml
# >> 6
# 3
[/code]
补一句:len可以帮助更好的slicing,因为你选取需要的部分之前总归得要知道这根串儿上有多少东西。
7 串儿上的肉要一块一块地吃(for … in …)
还是再强调一下字串(string)是串儿,列表(list)也是串儿,有了非常稳固的「烤串观」以后,就可以跟着Python一块儿吃肉了。最简单的是 for … in … 这个命令,用法如下:
[code language=”python”]
for 新建变量 in 已有的串儿:
做点儿什么
[/code]
[code language=”python”]
#脚本4
mylist=[‘Python’, ‘so’, ‘easy’]
for words in mylist:
print words
# >> Python
# so
# easy
[/code]
这是第一次接触到所谓loop(循环)的概念。其实说实在的,for… in…这个命令组合一点也没有「循环」的感觉,它的功能很简单:
将「串」里的第一个元素读取到某个「新建变量」之后(比如脚本4里是words),再「做点儿什么」(脚本4里是print words),做完之后继续读取下一个元素,覆盖刚才那个「新建变量」,再做「同样的事情」……以此类推……直到最后一个元素被读取到这个「新建变量」之后,「同样的事情」也干完了,就结束。
一般来说for … in …是不会陷入死循环的,因为一个「串」的开头和结尾都已经定义好了。除非是使用变量【做的事情有问题】,Python一直干又干不完;或者是你在使用变量的时候,做的事情让「串」上的元素变得越来越多,Python自然永远读不到「串」最后的那个元素。这个时候Ctrl+C是最好的朋友,可以手动中断一个脚本。
在句法上,有两个非常重要的点千万要注意:第一点是for … in … 的那行要用冒号:来结束;第二点是接着的那行需要使用【一个】Tab键作为起始(强调「一个」是因为有可能会遇上循环套循环的状况,这时前面有几个Tab键就非常关键了)。
还是实战吧,不过这次的实战需要一点复习和铺垫。任务是【我们有不长的几句话,想知道特定的元音在这几句话里的哪几个词里出现过,在出现这个元音的单词里这个元音又出现过几次】
[code language=”python”]
#脚本5
#输入文本,稍微整理一下#
text="Python is a widely used general-purpose, high-level programming language. Its design philosophy emphasizes code readability."
text_cl=text.lower().replace(‘,’,”).replace(‘.’,”)
words=text_cl.split()
#问下用户想查哪个元音#
print ‘You are reading the following text:\n’
print text+’\n’
vowel=raw_input(‘Which vowel is in your mind? ‘)
#按顺序读一个,找一个,print一个#
for word in words:
rst=str(word.count(vowel))
print word+’\t’+rst
[/code]
小抄:串[数字] 串[数字:数字] len(串) for… in… 嗯?\t \n?