测试知识:Part II 练习

未匹配的标注

这堂课要求你使用内置对象的基础来实践。和之前一样,在此过程中有一些新概念可能会突然出现,所以当完成时(或者甚至即使没有完成时)确保直接转到附录D的答案。如果时间有限,建议从练习10和11开始(它们是这堆练习中最实用的),且当时间允许时再从头到尾完成。这全是基础材料,所以尽可能完成更多;编程是需要实践的活动,没有什么可以替代练习来巩固学到的知识。

  1. 基础。交互式地实验在本书这部分各种操作报告中发现的常见类型操作。首先,启动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]
  2. 索引和切片。在交互式提示符处,定义名为L的列表,它包含了4个字符串或数字(比如:L = [0,1,2,3])。然后,使用下面的边界情况来做实验。在真实程序中可能从不会看到这些情况(特别不会像这里出现的那么诡异!),但它们旨在让你思考底层的模型,且有一些在不那么人为的形式中可能会有用——比如,如果序列和你预料的一样长,那么边界外切片会有所帮助:

    • 当你尝试在边界外索引会发生什么(比如:L[4])?
    • 那在边界外切片呢?(比如:L[-1000:100])?
    • 最后,如果尝试逆序提取一个序列,下边界大于上边界(比如:L[3:1]),Python会如何处理它呢?提示:尝试对这个切片赋值(L[3:1]=['?']),然后看一下这个值被放在哪?你认为这可能是当在边界外切片时的同样现象吗?
  3. 索引,切片,删除。定义另一个有4个项的列表,然后把一个空列表分配给它的偏移量之一(比如:L[2]=[])。发生了什么?然后把空列表分配给一个切片(L[2:3]=[])。现在发生了什么?回忆下:给切片赋值删除了切片,然后把新的值插入切片原来所在的位置。
    del语句删除偏移量、键、属性和名称。使用在列表上来删除一项(比如:del L[0])。如果删除整个切片(del L[1:])会发生什么?当把非序列分配给切片时(L[1:2]=1)会发生什么?

  4. 元组赋值。键入下面的行:

    >>> X = 'spam'
    >>> Y = 'eggs'
    >>> X, Y = Y, X

    当键入这个序列时,你认为会有什么发生在 X 和 Y 身上?

  5. 字典键。考虑下面的代码片段:

    >>> D = {}
    >>> D[1] = 'a'
    >>> D[2] = 'b'

    已经学习了字典不能被偏移量访问,所以这里会发生什么?下面会对这个主题有所启示吗?(提示:字符串、整数、元组共享什么类型属性?)

    >>> D[(1, 2, 3)] = 'c'
    >>> D
    {1: 'a', 2: 'b', (1, 2, 3): 'c'}
  6. 字典索引。创建一个名为D,有三个条目(键为'a', 'b', 'c')的字典。如果尝试索引一个不存在的键(D['d'])会发生什么?如果尝试分配一个不存在的键'd'(比如:D['d'] = 'spam'),Python会做什么?这个和列表的边界外赋值、引用相比较如何?这听起来像不像变量名的规则?

  7. 通用操作。运行交互式的测试来回答下面的问题:

    • 当尝试对不同/混合类型使用 + 操作符时会发生什么(比如:字符串 + 列表,列表 + 元组)?
    • 当运算对象之一是字典是 + 是否有效?
    • append 方法是否同时适合列表和字符串?在列表上使用 keys 方法会如何?(提示:append对其主体对象做了什么假设?)
    • 最后,当对两个列表或两个字符串进行切片或连接时,得到的是什么类型的对象?
  8. 字符串索引。定义4个字符的字符串:S = "spam"。然后键入下面的表达式:S[0][0][0][0][0]。关于这次正在发生什么有什么思路吗?(提示:回忆下:字符串是字符集,但Python的字符是单字符的字符串。)如果将这个表达式应用到如['s', 'p', 'a', 'm']的列表,它是否还有效?为什么?

  9. 不可变类型。再次定义一个4个字符的字符串:S = "spam"。编写一个赋值语句,只使用切片和连接,修改字符串为"slam"。能只使用索引和连接来执行同样的操作吗?索引赋值可以吗?

  10. 嵌套。编写一个数据结构来表示你的个人信息:名字(first, middle, last),年龄,工作,地址,电子邮件地址和电话。可以使用你喜欢的任何类型对象类型(列表、元组、字典、字符串,数字)的组合来构建这个数据结构。然后,通过索引访问这个数据结构的每个部分。对这个对象,一些结构是否比其它的更有意义?

  11. 文件。编写一个脚本,创建新的名为myfile.txt的输出文件,并把字符串"Hello file world!"写进去。然后编写另一个脚本,打开myfile.txt然后读取并打印其内容。从系统命令行运行这两个脚本。当运行脚本时,这个新文件出现在当前目录了吗?如果给传入open的文件名添加一个不同目录路径会如何?注意:文件的write方法(默认)不会添加换行符到字符串中;如果想要完全地终结在文件中的这行,在字符串末尾添加上一个明确的\n

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~