序列
字符串
列表和元组
====笔记=====
直接访问一个序列的元素(不用先把它赋值给一个变量):
>>> print ('Faye', 'Leanna', 'Daylen')[1]
Leanna
>>> s = 'abcdefgh'
>>> s[::-1] # 可以视作"翻转"操作
'hgfedcba'
每次都把 位于最后的一个字符砍掉,下面是实现这个要求的一种方法:
>>> s = 'abcde'
>>> i = -1
>>> for i in range(-1, -len(s), -1):
... print s[:i]
... abcd
abc
显示所有字符串
>>>s[:]
'Sfefaseretrt333333rtrtyrtytryt'
如何删除字符和字符串?
>>> aString = 'Hello World!'
>>> aString = aString[:3] + aString[4:]
>>> aString
'Helo World!'
>>> aString = ''
>>> aString
''
>>> del aString
字符串索引。起始/结束索引都没有指定的话会返回整个字符串。
>>> 'nm' not in 'abcd'
True
字符串拼接:
>>> '%s %s' % ('Spanish', 'Inquisition')
'Spanish Inquisition'
或者 把所有的字符串放到一个列表中去,然后用一个 join()方法来把它们连接在 一起。
>>> s = ' '.join(('Spanish', 'Inquisition', 'Made Easy'))
>>> s
'Spanish Inquisition Made Easy'
或者 编译时连接
>>> foo = "Hello" 'world!'
>>> foo
'Helloworld!'
普通字符串转化为 Unicode 字符串:如果把一个普通字符串和一个 Unicode 字符串做连接处理,Python 会在连接操作前先把普 通字符串转化为 Unicode 字符串
u'Hello World!'
重复操作符( * )
repr(),str()或`` 或者 print 被调用时,就可以获得一个适当的字符串描述信息
import re #引入正则表达式模块
原始字符串操作符 r 或 R(转义操作符)
标准内建函数---- cmp()函数也根据字符串的 ASCII 码值进行比较
序列类型函数---- len() max() min() 按照 ASCII 码值排列
字符串类型函数-----input() str() unicode() isinstance()函数来判断一个对象的类型
chr(), unichr(), ord()
表 6.6 字符串类型内建方法
复杂的例子是有 split()和 join()函数的那个.首先我们在 string 上调用 split() 函数,没有用参数,也就是说以空格作为分隔符分隔字符串,然后我们以这个包含单词的列表 做参数调用 join()方法把这些单词用一个新的分隔符冒号重新串在一起,注意,我们首先用 split()函数把 string 切片成一个列表,然后我们在字符串':'上应用 join()方法把这个列表 重新连接成一个字符串.
id()函数返回一个 对象的身份,这个概念有点类似于"内存地址"。
ASCII Unicode UTF-8 区别
ASCII 那 种用一个字节把字符转换成数字,只能表示 95 个可打印字符;Unicode 通过使用一个或多个字节来表示一个字符的方法突破了 ASCII 的限制. 在这样机 制下, Unicode 可以表示超过 90,000 个字符;UTF-8 编码可以用 1 个到 4 个字节来表示其他语言的字符.
-
Python 标准库里面的绝大部分模块都是兼容 Unicode 的.除了 pickle 模块!pickle 模块只 支持 ASCII 字符串。
-
ascii、latin、gbk、Big5、unicode都是字符集,用字节来表示字符,除了ascii是1个字节表示字符外,其它都是使用2个字节表示字符。为了统一,国际标准化组织 ISO,制定unicode用2个字节来统一全世界所有字符。
美国人不同意,因为unicode是2个字节,相比他之前的ascii的1个字节,增加了1倍的储存空间。于是国际标准化组织提出了一种方案,用UTF-8对unicode进行压缩,由2个字节压缩为1个字节。中文转换以后 3 个字节(中文比较特殊,压缩后反而占内存变3个字节,占空间增大),UTF-8 转换过程中会最终生成的是 1-6 个字节不等的数据.
-
re正则表达式引擎需要 Unicode 支持.
-
如何访问列表中的值-----切片操作符([])和索引值或索引值范围一起使用
-
如何更新列表----等号的左边指定一个索引或者索引范围的方式来更新元素,也可以用 append()方法来追加元素到列表中
-
如何删除列表中的元素或者列表(本身)
-
list[1]
-
list.remove(123)
-
pop()
-
更新列表
-
>>>num_list[2:4]=[22,6.34545]
>>>num_list
[43, -1.23, 22, 6.34545] -
如何把列表的单一元素替换成一个列表
-
>>>num_list[0]=[12,23,'ddf']
>>>num_list
[[12, 23, 'ddf'], -1.23, 22, 6.34545]
多个列表对象合并-----用➕,或者 extend()方法。extend()方法比连接操作的一个优点是它实际上 是把新列表添加到了原有的列表里面,而不是像连接操作那样新建一个列表。连接操作符并不能实现向列表中添加新元素的操作。
重复操作符* ---列表和元组跟字符串同属序列类型,*同样适用于列表和元组
复合运算符也适用
列表解析----列表才有的构建--列表解析.这种方法是结合了列表 的方括弧和 for 循环,在逻辑上描述要创建的列表的内容
只有一个 元素的元组需要在元组分割符里面加一个逗号(,)
跟数字和字符串一样,元组也是不可变类型,就是说你不能更新或者改变元组的元素.通过现有字符串的片段再构造一个新字符串的方式解决.
元组的对象和序列类型操作符还有内建函数跟列表的完全一样。可以对元组进行切 片操作,合并操作,以及多次拷贝一个元组,还可以检查一个对象是否属于一个元组,进行元组之 间的比较等.⚠️ +会生成新的元组,* 只生成一次视图
内置函数str()、list()
像列表一样 元组也没有它自己专用的运算符和内建函数.上一节中描述的列表方法都跟列表对象的可变性有关,比如说排序,替换,添加等等,因为元组是不可变的,所以这些操作对元组 来说就是多余的,这些方法没有被实现.
我们把数据传给一个不了解的 API 时,可以确保我们的数据不会 被修改。同样地,如果我们操作从一个函数返回的元组,可以通过内建 list()函数把它转换成 一个列表.⚠️元组内列表属性的元素可变,如下:
所有的多对象的,逗号分隔的,没有明确用符号定义的,比如说像用方括号表示列表和用 圆括号表示元组一样,等等这些集合默认的类型都是元组。
创建一个只有一个元素的元组?由圆括号包裹的一个单一元素首 先被作为分组操作,而不是作为元组的分界符。一个变通的方法是在第一个元素后面添一个逗 号(,)来表明这是一个元组而不是在做分组操作.
通过内建的 list()和 tuple()转换函数,你可以非常轻松 的在两者之间进行转换.
序列类型对象的浅拷贝是默认类型拷贝,并可以以下几种方式实施:(1)完全切片操作[:],(2) 利用工厂函数,比如 list(),dict()等,(3)使用 copy 模块的 copy 函数.全新拷贝的引用-深拷贝⚠️-需要 copy.deepcopy()函数,浅拷贝-copy()函数
----------------练习----后面补做----------
6–1. 字符串.string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下一个字符串 是否是另一个大字符串的一部分?
6–2. 字符串标识符.修改例 6-1 的 idcheck.py 脚本,使之可以检测长度为一的标识符,并且 可以识别 Python 关键字,对后一个要求,你可以使用 keyword 模块(特别是 keyword.kelist)来帮你.
6–3. 排序
(a) 输入一串数字,从大到小排列之.
(b) 跟 a 一样,不过要用字典序从大到小排列之.
6–4. 算术. 更新上一章里面你的得分测试练习方案,把测试得分放到一个列表中去.你的代 码应该可以计算出一个平均分,见练习 2-9 和练习 5-3.
6–5. 字符串
(a)更新你在练习 2-7 里面的方案,使之可以每次向前向后都显示一个字符串的一个字符. (b)通过扫描来判断两个字符串是否匹配(不能使用比较操作符或者 cmp()内建函数)。附加题:
Edit By Vheavens
Edit By Vheavens
在你的方案里加入大小写区分. (c)判断一个字符串是否重现(后面跟前面的一致).附加题:在处理除了严格的回文之外,加入对
例如控制符号和空格的支持。 (d)接受一个字符,在其后面加一个反向的拷贝,构成一个回文字符串.
6–6. 字符串.创建一个 string.strip()的替代函数:接受一个字符串,去掉它前面和后面的 空格(如果使用 string.*strip()函数那本练习就没有意义了)
6–7. 调试.看一下在例 6.5 中给出的代码(buggy.py) (a)研究这段代码并描述这段代码想做什么.在所有的(#)处都要填写你的注释. (b)这个程序有一个很大的问题,比如输入 6,12,20,30,等它会死掉,实际上它不能处理任何的偶
数,找出原因. (c)修正(b)中提出的问题.
6–8. 列表.给出一个整数值,返回代表该值的英文,比如输入 89 返回"eight-nine"。附加题: 能够返回符合英文语法规则的形式,比如输入“89”返回“eighty-nine”。本练习中的值限定在家 0 到 1,000.
6–9. 转换.为练习 5-13 写一个姊妹函数, 接受分钟数, 返回小时数和分钟数. 总时间不 变,并且要求小时数尽可能大.
6–10.字符串.写一个函数,返回一个跟输入字符串相似的字符串,要求字符串的大小写反转. 比如,输入"Mr.Ed",应该返回"mR.eD"作为输出.
Example 6.4 有 bug 的程序(buggy.py)
这是一个用于练习 6-7 的程序,判断这个程序是干什么的,在"#"处添加你的注释,找出其中的错 误,并修改之.
1 #!/usr/bin/env python
2
3#
4 num_str = raw_input('Enter a number: ') 5
6#
7 num_num = int(num_str)
8
9#
10 fac_list = range(1, num_num+1) 11 print "BEFORE:", 'fac_list'
Edit By Vheavens
Edit By Vheavens
12
13 #
14 i = 0
15
16 #
17 while i < len(fac_list):
18
19 #
20 if num_num % fac_list[i] == 0:
21 del fac_list[i]
22
23 #
24 i = i + 1
25
26 #
27 print "AFTER:", 'fac_list'
6–11.转换
(a)创建一个从整数到 IP 地址的转换程序,如下格式: WWW.XXX.YYY.ZZZ. (b)更新你的程序,使之可以逆转换.
6–12.字符串
(a)创建一个名字为 findchr()的函数,函数声明如下:
def findchr(string, char)
findchr()要在字符串 string 中查找字符 char,找到就返回该值的索引,否则返回-1.不能用 string.*find()或者 string.*index()函数和方法
(b)创建另一个叫 rfindchr()的函数,查找字符 char 最后一次出现的位置.它跟 findchr()工作 类似,不过它是从字符串的最后开始向前查找的.
(c)创建第三个函数,名字叫 subchr(),声明如下: def subchr(string, origchar, newchar)
subchr()跟 findchr()类似,不同的是,如果找到匹配的字符就用新的字符替换原先字符.返回 修改后的字符串.
6–13.字符串.string 模块包含三个函数,atoi(),atol(),和 atof(),它们分别负责把字符串转 换成整数,长整型,和浮点型数字.从 Python1.5 起,Python 的内建函数 int(),long(),float()也可以 做相同的事了, complex()函数可以把字符串转换成复数.(然而 1,5 之前,这些转换函数只能工作于 数字之上)
string 模块中并没有实现一个 atoc()函数,那么你来实现一个,atoc(),接受单个字符串做参 数输入,一个表示复数的字符串,例如,'-1.23e+4-5.67j',返回相应的复数对象.你不能用 eval()函 数,但可以使用 complex()函数,而且你只能在如下的限制之下使用 complex():complex(real,imag)
Edit By Vheavens
Edit By Vheavens
的 real 和 imag 都必须是浮点值.
6–14.随机数.设计一个"石头,剪子,布"游戏,有时又叫"Rochambeau",你小时候可能玩过,下面 是规则.你和你的对手,在同一时间做出特定的手势,必须是下面一种手势:石头,剪子,布.胜利者从 下面的规则中产生,这个规则本身是个悖论.
(a) the paper covers the rock, 布包石头.
(b)石头砸剪子,
(c)剪子剪破布.在你的计算机版本中,用户输入她/他的选项,计算机找一个随机选项,然后由你 的程序来决定一个胜利者或者平手.注意:最好的算法是尽量少的使用 if 语句.
6–15.转换
(a)给出两个可识别格式的日期,比如 MM/DD/YY 或者 DD/MM/YY 格式,计算出两个日期间的天 数.
(b)给出一个人的生日,计算从此人出生到现在的天数,包括所有的闰月. (c)还是上面的例子,计算出到此人下次过生日还有多少天.
6–16.矩阵.处理矩阵 M 和 N 的加和乘操作.
6–17.方法.实现一个叫 myPop()的函数,功能类似于列表的 pop()方法,用一个列表作为输入, 移除列表的最新一个元素,并返回它.
6–18. zip() 内建函数 在 6.13.2 节里面关于 zip()函数的例子中,zip(fn,ln)返回的是什么?
6–19.多列输出.有任意项的序列或者其他容器,把它们等距离分列显示.由调用者提供数据和 输出格式.例如,如果你传入 100 个项并定义 3 列输出,按照需要的模式显示这些数据.这种情况下,应 该是两列显示 33 个项,最后一列显示 34 个.你可以让用户来选择水平排序或者垂直排序.