python核心编程第二版第7章习题答案

2020-04-14 23:23

7-1.字典方法。哪个字典方法可以用来把两个字典合并到一起。 答案:dict.update(dict2)

将字典dict2的键-值对添加到字典dict中

7-2.字典的键。我们知道字典的值可以是任意的Python对象,那字典的键又如何呢?请试着将除数字和字符串意外的其他不同类型的对象作为字典的键,看看哪些类型可以,哪些不行。对那些不能作为字典的键的对象类型,你认为是什么原因呢? 答案:键必须是可哈希的。所有不可变的类型都是可哈希的,因此他们都可以作为字典的键。一个要说明的问题是:值相等的数字表示相同的键。换句话说,整型数字1和浮点型1.0的哈希值是相同的,即它们是相同的键。同时,也有一些可变对象(很少)是可哈希的,它们可以作为字典的键,但很少见。

用元组做有效的键,必须要加限制:元组中只包括像数字和字符串这样的不可变参数,才可以作为字典中有效的键。

内建函数hash()可以判断某个对象是否可以做一个字典的键,如果非可哈希类型作为参数传递给hash()方法,会产生TypeError错误,否则会产生hash值,整数。 >>> hash(1) 1

>>> hash('a') -468864544 >>> hash([1,2])

Traceback (most recent call last):

File \ hash([1,2])

TypeError: unhashable type: 'list' >>> hash({1:2,})

Traceback (most recent call last):

File \ hash({1:2,})

TypeError: unhashable type: 'dict' >>> hash(set('abc'))

Traceback (most recent call last):

File \ hash(set('abc'))

TypeError: unhashable type: 'set' >>> hash(('abc')) -1600925533 >>> hash(1.0) 1

>>> hash(frozenset('abc')) -114069471

>>> hash(((1,3,9)))

1140186820

>>> hash(((1,3,9),(1,2))) 340745663

>>> hash(((1,3,'9'),(1,2))) 1944127872

>>> hash(((1,3,'9'),[1,2],(1,2)))

Traceback (most recent call last):

File \ hash(((1,3,'9'),[1,2],(1,2))) TypeError: unhashable type: 'list' >>>

7-3.字典和列表的方法。

(a)创建一个字典,并把这个字典中的键按照字母顺序显示出来。

(b)现在根据已经按照字母顺序排列好的键,显示出这个字典中的键和值。 (c)同(b),但这次是根据已按照字母顺序排序好的字典的值,显示出这个字典中的键和值(注意:对字典和哈希表来说,这样做一般没什么实际意义,因为大多数访问和排序(如果需要)都是基于字典的键,这里只把它作为一个练习)。 答案: (a)

>>> dict1 = {'a':1,'b':2,'c':3} >>>

>>> sorted(dict1.keys()) ['a', 'b', 'c'] >>> (b)

>>> dict1 = {'a':1,'b':2,'c':3} >>> for i in sorted(dict1.keys()): print i,dict1[i] a 1 b 2 c 3 >>> (c)

dict1 = {'a':3,'b':1,'c':2,'d':4} print dict1

dict1value = dict1.values() dict1value.sort() for i in dict1value:

for key in dict1.keys(): if i == dict1[key]: print i,key

7-4.建立字典。给定两个长度相同的列表,比如说,列表[1,2,3,...]和['abc', 'def', 'ghi', ...],用这两个列表里的所有数据组成一个字典。像这样:{1:'abc', 2:'def', 3:'ghi', ...}。 答案:

>>> dict(zip([5,3,2,8],['a','d','r','m'])) {8: 'm', 2: 'r', 3: 'd', 5: 'a'} >>>

7–5. userpw2.py。下面的问题和例题7.1 中管理名字-密码的键值对数据的程序有关。 (a)修改那个脚本,使它能记录用户上次的登录日期和时间(用time 模块),并与用户密码一起保存起来。程序的界面有要求用户输入用户名和密码的提示。无论户名是否成功登录,都应有提示,在户名成功登录后,应更新相应用户的上次登录时间戳。如果本次登录与上次登录在时间上相差不超过4 个小时,则通知该用户: “You already logged in at: .”

(b) 添加一个“管理”菜单,其中有以下两项:(1)删除一个用户 (2)显示系统中所有用户的名字和他们的密码的清单。

(c) 口令目前没有加密。请添加一段对口令加密的代码(请参考crypt, rotor, 或其它加密模块) (d) 为程序添加图形界面,例如,用Tkinter 写。 (e) 要求用户名不区分大小写。

(f) 加强对用户名的限制,不允许符号和空白符。

(g)合并“新用户”和“老用户”两个选项。如果一个新用户试图用一个不存在的用户名登录,

询问该用户是否是新用户,如果回答是肯定的,就创建该帐户。否则,按照老用户的方式登录。 答案:略

http://blog.csdn.net/birdzb/article/details/48325751

7-6. 列表和字典。创建一个简单的股票证券投资数据系统。其中应至少包含四项数据:股市行情显示器符号,所持有的股票,购买价格及当前价位 - 你可以随意添加其他数据项,比如收益率,52 周最高指数、最低指数,等等。用户每次输入各列的数据构成一个输出行。每行数据构成一个列表。还有一个总列表,包括了所有行的数据。数据输入完毕后,提示用户选择一列数据项进行排序。把该数据项抽取出来作为字典的键,字典的值就是该键对应行的值的列表。提醒读者:被选择用来排序的数据项必须是非重复的键,否则就会丢失数据,因为字典不允许一个键有多个值。你还可以选择其他计算输出,比如,盈亏比率,目前证券资产价值等。 答案:略。以后补

7-7. 颠倒字典中的键和值。用一个字典做输入,输出另一个字典,用前者的键做值,前者的值做键。

dict1 = {'a':3,'b':1,'c':2,'d':4} print dict1

dict2 = {}

for key in dict1.keys(): dict2.update({}.fromkeys(str(dict1[key]),key)) print dict2

7-8. 人力资源。创建一个简单的雇员姓名和编号的程序。让用户输入一组雇员姓名和编号。你的程序可以提供按照姓名排序输出的功能,雇员姓名显示在前面,后面是对应的雇员编号。附加题:添加一项功能,按照雇员编号的顺序输出数据。

#coding:utf-8

dict1 = {} dict2 = {}

while True: name = raw_input('name: ') if name == 'q': break number = int(raw_input('number: ')) dict1[name] = number dict2[number] = name

def name_output(): print '-'* 21 print ' name',' number' for key in sorted(dict1.keys()): print 's d' %(key,dict1[key]) print '-'* 21

def number_output(): print '-'* 21 print ' number',' name' for key in sorted(dict2.keys()): print 'd s' %(key,dict2[key]) print '-'* 21

def showmenu(): prompt = \--------------------- Menu:

(N)ame sort (S)ort number (Q)uit

--------------------- Enter choice: \ done = True while done: chosen = True while chosen: try: choice = raw_input(prompt).strip()[0].lower() except (EOFError,KeyboardInterrupt): choice = 'q' print '\\nYou picked: [%s]' % choice if choice not in 'nsq': print 'invalid option, try again' else: chosen = False if choice == 'q':break if choice == 'n':name_output() if choice == 's':number_output()

if __name__ == '__main__': showmenu()

7-9. 翻译

(a) 编写一个字符翻译程序(功能类似于Unix 中的tr 命令)。我们将这个函数叫做tr(),它有三个字符串做参数: 源字符串、目的字符串、基本字符串,语法定义如下: def tr(srcstr, dststr, string)

srcstr 的内容是你打算“翻译”的字符集合,dsrstr 是翻译后得到的字符集合,而string 是你打算进行翻译操作的字符串。举例来说,如果srcstr == 'abc', dststr == 'mno', string =='abcdef', 那么tr()的输出将是'mnodef'. 注意这里len(srcstr) == len(dststr). 在这个练习里,你可以使用内建函数chr() 和 ord(), 但它们并不一定是解决这个问题所必不可少的函数。

(b) 在这个函数里增加一个标志符参数,来处理不区分大小写的翻译问题。 (c)修改你的程序,使它能够处理删除字符的操作。字符串srcstr 中不能够映射到字符串dststr中字符的多余字符都将被过滤掉。换句话说,这些字符没有映射到dststr 字符串中的任何字符,因此就从函数返回的字符里被过滤掉了。举例来说:如果 srcstr == 'abcdef', dststr == 'mno',string == 'abcdefghi', 那么tr()将输出'mnoghi'. 注意这里len(srcstr) >= len(dststr). 答案:不会

7–10. 加密。

(a) 用上一个练习的思路编写一个\翻译器。\是一个古老而又简单的加密方法,


python核心编程第二版第7章习题答案.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:西南大学《建筑工程招投标与合同管理》网上作业及参考答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: