测试知识:part ii 练习 | 第二部分 类型与操作 —— 第 9 章: 元组,文件和其他 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-金年会app官方网
这堂课要求你使用内置对象的基础来实践。和之前一样,在此过程中有一些新概念可能会突然出现,所以当完成时(或者甚至即使没有完成时)确保直接转到附录d的答案。如果时间有限,建议从练习10和11开始(它们是这堆练习中最实用的),且当时间允许时再从头到尾完成。这全是基础材料,所以尽可能完成更多;编程是需要实践的活动,没有什么可以替代练习来巩固学到的知识。
-
基础。交互式地实验在本书这部分各种操作报告中发现的常见类型操作。首先,启动python交互式解释器,键入下面的每个表达式,然后努力解释在每个例子中发生的事情。注意在其中一些例子中的分号被用作语句分隔符(将多行语句压缩为单行):比如,
x=1;x
赋值然后打印了变量(在本书的下一部分参阅更多语句的语法)。还要记住表达式之间的逗号通常构建了元组(即使没有包裹的小括号):x,y,z
是一个三项的元组,python将其包裹在小括号中打印显示出来。2 ** 16 2 / 5, 2 / 5.0 "spam" "eggs" s = "ham" "eggs " s s * 5 s[:0] "green %s and %s" % ("eggs", s) 'green {0} and {1}'.format('eggs', s) ('x',)[0] ('x', 'y')[1] l = [1,2,3] [4,5,6] l, l[:], l[:0], l[−2], l[−2:] ([1,2,3] [4,5,6])[2:4] [l[2], l[3]] l.reverse(); l l.sort(); l l.index(4) {'a':1, 'b':2}['b'] d = {'x':1, 'y':2, 'z':3} d['w'] = 0 d['x'] d['w'] d[(1,2,3)] = 4 list(d.keys()), list(d.values()), (1,2,3) in d [[]], ["",[],(),{},none]
-
索引和切片。在交互式提示符处,定义名为l的列表,它包含了4个字符串或数字(比如:l = [0,1,2,3])。然后,使用下面的边界情况来做实验。在真实程序中可能从不会看到这些情况(特别不会像这里出现的那么诡异!),但它们旨在让你思考底层的模型,且有一些在不那么人为的形式中可能会有用——比如,如果序列和你预料的一样长,那么边界外切片会有所帮助:
- 当你尝试在边界外索引会发生什么(比如:l[4])?
- 那在边界外切片呢?(比如:l[-1000:100])?
- 最后,如果尝试逆序提取一个序列,下边界大于上边界(比如:l[3:1]),python会如何处理它呢?提示:尝试对这个切片赋值(l[3:1]=['?']),然后看一下这个值被放在哪?你认为这可能是当在边界外切片时的同样现象吗?
-
索引,切片,删除。定义另一个有4个项的列表,然后把一个空列表分配给它的偏移量之一(比如:l[2]=[])。发生了什么?然后把空列表分配给一个切片(l[2:3]=[])。现在发生了什么?回忆下:给切片赋值删除了切片,然后把新的值插入切片原来所在的位置。
del
语句删除偏移量、键、属性和名称。使用在列表上来删除一项(比如:del l[0]
)。如果删除整个切片(del l[1:]
)会发生什么?当把非序列分配给切片时(l[1:2]=1
)会发生什么? -
元组赋值。键入下面的行:
>>> x = 'spam' >>> y = 'eggs' >>> x, y = y, x
当键入这个序列时,你认为会有什么发生在 x 和 y 身上?
-
字典键。考虑下面的代码片段:
>>> d = {} >>> d[1] = 'a' >>> d[2] = 'b'
已经学习了字典不能被偏移量访问,所以这里会发生什么?下面会对这个主题有所启示吗?(提示:字符串、整数、元组共享什么类型属性?)
>>> d[(1, 2, 3)] = 'c' >>> d {1: 'a', 2: 'b', (1, 2, 3): 'c'}
-
字典索引。创建一个名为d,有三个条目(键为'a', 'b', 'c')的字典。如果尝试索引一个不存在的键(d['d'])会发生什么?如果尝试分配一个不存在的键'd'(比如:d['d'] = 'spam'),python会做什么?这个和列表的边界外赋值、引用相比较如何?这听起来像不像变量名的规则?
-
通用操作。运行交互式的测试来回答下面的问题:
- 当尝试对不同/混合类型使用
- 当运算对象之一是字典是
append
方法是否同时适合列表和字符串?在列表上使用keys
方法会如何?(提示:append
对其主体对象做了什么假设?)- 最后,当对两个列表或两个字符串进行切片或连接时,得到的是什么类型的对象?
- 当尝试对不同/混合类型使用
-
字符串索引。定义4个字符的字符串:
s = "spam"
。然后键入下面的表达式:s[0][0][0][0][0]
。关于这次正在发生什么有什么思路吗?(提示:回忆下:字符串是字符集,但python的字符是单字符的字符串。)如果将这个表达式应用到如['s', 'p', 'a', 'm']
的列表,它是否还有效?为什么? -
不可变类型。再次定义一个4个字符的字符串:
s = "spam"
。编写一个赋值语句,只使用切片和连接,修改字符串为"slam"。能只使用索引和连接来执行同样的操作吗?索引赋值可以吗? -
嵌套。编写一个数据结构来表示你的个人信息:名字(first, middle, last),年龄,工作,地址,电子邮件地址和电话。可以使用你喜欢的任何类型对象类型(列表、元组、字典、字符串,数字)的组合来构建这个数据结构。然后,通过索引访问这个数据结构的每个部分。对这个对象,一些结构是否比其它的更有意义?
-
文件。编写一个脚本,创建新的名为myfile.txt的输出文件,并把字符串"hello file world!"写进去。然后编写另一个脚本,打开myfile.txt然后读取并打印其内容。从系统命令行运行这两个脚本。当运行脚本时,这个新文件出现在当前目录了吗?如果给传入
open
的文件名添加一个不同目录路径会如何?注意:文件的write
方法(默认)不会添加换行符到字符串中;如果想要完全地终结在文件中的这行,在字符串末尾添加上一个明确的\n
。