1. 1. 字典方法. 哪个字典方法可以用来把两个字典合并到一起? 
  2. update() 
  3.  
  4. 2. 字典的键. 我们知道字典的值可以是任意的 Python 对象,那字典的键又如何呢? 请试着 
  5.    将除数字和字符串以外的其他不同类型的对象作为字典的键,看一看哪些类型可以,哪些 
  6.    不行?对那些不能作字典的键的对象类型,你认为是什么原因呢? 
  7.  
  8.  
  9.  
  10. 3. 字典和列表的方法. 
  11.    a) 创建一个字典, 并把这个字典中的键按照字母顺序显示出来. 
  12.    b) 现在根据已按照字母顺序排序好的键, 显示出这个字典的键和值. 
  13.    c) 同 b),但这次是根据已按照字母顺序排序好的字典的值,显示出这个字典中的键和值 
  14.       (注意:对字典和哈希表来说,这样做一般没有什么实际意义,因为大多数访问和排序(如 
  15.       果需要)都是基于字典的键,这里只是把它作为一个练习) 
  16. a). sorted (aDist) 
  17. b). 
  18. for key in sorted (aDist): 
  19.     print "\033[1;31;32m%s\033[0m,and it's value:\033[1;31;32m%s\033[0m" % (key,aDist[key]) 
  20. c).  
  21.  
  22.  
  23. 4. 建立字典. 给定两个长度相同的,比如说, 列表[1,2,3,...]和['abc','def','ghi',...], 
  24.    用这两个列表里的所有数据组成一个字典,像这样:{1:'abc';2:'def',3:'ghi',...} 
  25. aList = [1,2,3,4,5
  26. bList = ['aa','bb','cc','dd','ee'
  27. dict(zip(aList,bList)) 
  28.  
  29.  
  30. 5. userpw2.py. 下面的问题和例题7.1中管理名字-密码的键值对数据的程序有关. 
  31.    a)修改那个脚本,使它能记录用户上次的登录日期和时间(用time模块),并与用户密码一起 
  32.      保存起来.程序的界面有要求用户输入用户名和密码的提示.无论用户名是否成功登录,都 
  33.      应有提示,在用户名登陆成功后,应更新相应用户的上次登录时间戳.如果本次登录与上次 
  34.      登录在时间上相差不超过4小时,则通知该用户:"You already logged in at:  
  35.      <last_login_timestamp>." 
  36.    b)添加一个"管理"菜单,其中有以下两项:1) 删除一个用户; 2) 显示系统中所有用户的名字 
  37.      和他们的密码的清单. 
  38.    c)口令目前没有加密. 请添加一段对口令加密的代码(请参考crypt,rotor,或其它加密模块) 
  39.    d)为程序添加图形界面,例如,用Tkinter写. 
  40.    e)要求用户名不区分大小写. 
  41.    f)加强对用户名的限制, 不允许符号和空白符. 
  42.    g)合并"新用户""老用户"两个选项.如果一个新用户试图用一个不存在的用户名登录,询问 
  43.      该用户是否是新用户,如果回答是肯定的,就创建该帐户.否则,按照老用户的方式登录. 
  44. #!/usr/bin/env python 
  45. ## -*- coding: utf-8 -*- 
  46. ## Author: 
  47.  
  48. import string,time,getpass,hashlib 
  49.  
  50. users = {} 
  51.  
  52. def newUser (userName): 
  53.     pAsswd = getpass.getpass("Please Enter something AS your password: "
  54.     timeNow = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) 
  55.     users[userName] = [hashlib.md5(pAsswd).hexdigest(),timeNow] 
  56.  
  57. def oldUser (userName): 
  58.     tryPass = 0 
  59.     while tryPass < 3
  60.         pAsswd = getpass.getpass("Please Enter your password: "
  61.         diffPass = users.get(userName)[0
  62.         if hashlib.md5(pAsswd).hexdigest() == diffPass: 
  63.             print "Welcome back,",userName 
  64.             timeNow = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) 
  65.             diffTime = float(time.time() - time.mktime(time.strptime(users[userName][1],'%Y-%m-%d %H:%M:%S'))) / 3600 
  66.             if diffTime <= 4
  67.                 print "You already logged in at: ",users[userName][1
  68.             users[userName][1] = timeNow 
  69.             break 
  70.         else
  71.             tryPass += 1 
  72.             print "Error password %d times ..." % tryPass 
  73.     else
  74.         print "Error password more than 3 times ..." 
  75.      
  76. def delUser(): 
  77.     dTittle = "Enter a userName for deleting ..." 
  78.     dUserName = raw_input(dTittle) 
  79.     sTittle = "Program will delete user:%s ... Are you Sure ?" % dUserName 
  80.     try
  81.         sChoice = raw_input(sTittle).strip()[0].lower() 
  82.     except (EOFError,KeyboardInterrupt): 
  83.         sChoice = 'n' 
  84.     if sChoice == 'y'
  85.         users.pop(dUserName) 
  86.     else
  87.         showMenu() 
  88.  
  89. def showMenu(): 
  90.     prompt = """ 
  91.     (L)ogin System 
  92.     (D)elete User 
  93.     (S)how All Users 
  94.     (Q)uit 
  95.     Enter your choice:""" 
  96.  
  97.     hDone = False 
  98.     while not hDone: 
  99.         mChoice = False 
  100.         while not mChoice: 
  101.             try
  102.                 choice = raw_input(prompt).strip()[0].lower() 
  103.             except (EOFError,KeyboardInterrupt): 
  104.                 choice = 'q' 
  105.             print "\nYou choosed: [%s]" % choice 
  106.             if choice not in 'sqdl':  
  107.                 print "Invalid option, please try again" 
  108.             else
  109.                 mChoice = True 
  110.         if choice == 'q'
  111.             hDone = True 
  112.         if choice == 'l'
  113.             tittle = "Please Enter something AS your userName: " 
  114.             userName = raw_input(tittle) 
  115.             if userName.lower() in [name.lower() for name in users.keys()]: 
  116.                 if userName.lower() == name.lower(): 
  117.                     userName = name 
  118.                     oldUser(userName) 
  119.             else
  120.                 letts = string.letters 
  121.                 nums = string.digits 
  122.                 for char in userName: 
  123.                     if char not in letts + nums: 
  124.                         print "Invalid: userName must be alphanumeric" 
  125.                         break 
  126.                 else
  127.                     cBanner = "userName %s is not exist,Do you want to create it ?" 
  128.                     try
  129.                         cSure = raw_input(cBanner).strip()[0].lower() 
  130.                     except (EOFError,KeyboardInterrupt): 
  131.                         cSure == 'n' 
  132.                     if cSure == 'n'
  133.                         showMenu() 
  134.                     if cSure == 'y'
  135.                         newUser(userName) 
  136.         if choice == 'd'
  137.             delUser() 
  138.         if choice == 's'
  139.             print users.items() 
  140.  
  141. if __name__ == "__main__"
  142.     showMenu() 
  143.  
  144.  
  145. 7. 颠倒字典中的键和值. 用一个字典做输入,输出另一个字典,用前者的键做值,前者的值做键. 
  146. #!/usr/bin/env python 
  147. ## -*- coding: utf-8 -*- 
  148. ## Author: 
  149.  
  150. d1 = {'a':11,'b':22,'cc':33
  151. d2 = {} 
  152. for k in d1: 
  153.      v = d1.get(k) 
  154.      d2[v] = k 
  155.  
  156.  
  157. 8. 人力资源. 创建一个简单的雇员姓名和编号的程序,让用户输入一组雇员姓名和编号. 你的程 
  158.    序可以提供按照姓名排序输出的功能,雇员姓名显示在前面,后面是对应的雇员编号.附加题:添 
  159.    加一项功能,按照雇员编号的顺序输出数据. 
  160. #!/usr/bin/env python 
  161. ## -*- coding: utf-8 -*- 
  162. ## Author: 
  163.  
  164. employee = {'yhj'1'dm'5'xzq'6'wcc'2'xq'4'hzy'3
  165. [(k,employee.get(k)) for k in sorted(employee)]    ## 按姓名排序 
  166. sorted(employee.items(),key=lambda v:v[1])         ## 按编号排序 
  167.  
  168. 9. 翻译. 
  169.    a)编写一个字符翻译程序(功能类似于Unix中的tr命令).我们将这个函数叫做tr(),它有三个字 
  170.      符串做参数:源字符串,目的字符串,基本字符串,语法定义如下: 
  171.        def tr(srcstr,dststr,string) 
  172.      srcstr的内容是你打算"翻译"的字符集合,dststr是翻译后的得到的字符集合,而string是你 
  173.      打算进行翻译操作的字符串.举例来说,如果srcstr == 'abc',dststr == 'mno'
  174.      string == 'abcdef',那么tr()的输出将是'mnodef'. 注意这里len(srcstr) == len(dststr) 
  175.    b)在这个函数里增加一个标志参数,来处理不区分大小写的翻译问题. 
  176.    c)修改你的程序,使它能够处理删除字符的操作.字符串srcstr中不能够映射到字符串dststr中 
  177.      字符的多余字符都将被过滤掉.换句话说:如果 srcstr == 'abcdef',dststr == 'mno'
  178.      string == 'abcdefghi',那么tr()将输出'mnoghi'.注意这里len(srcstr) >= len(dststr) 
  179. #!/usr/bin/env python 
  180. ## -*- coding: utf-8 -*- 
  181. ## Author: 
  182.  
  183. def tr(srcStr,dstStr,String,case=1): 
  184.     #if len(srcStr) == len(dstStr): 
  185.         if case == 1
  186.             print String.replace(srcStr,dstStr) 
  187.         else
  188.             srcStr = srcStr.lower() 
  189.             dstStr = dstStr.lower() 
  190.             print String.replace(srcStr,dstStr) 
  191.  
  192. if __name__ == "__main__"
  193.     tr('Strict','Simple','Strict HostKey Checking',0
  194.  
  195.  
  196. 10. 加密. 
  197.     a)用上一个练习的思路编写一个"rot13"翻译器."rot13"是一个古老而又简单的加密方法,它把 
  198.       字母表中的每一个字母用其后的第13个字母来代替. 字母表中前半部分字母将被映射到后半 
  199.       部分,而后半部分字母将被映像到前半部分,大小写保持不变.举例来说,'a'将被替换为'n'
  200.       'X'将被替换为'K';数字和符号不进行翻译. 
  201.     b)在你的解决方案的基础上加一个应用程序,让它提示用户输入准备加密的字符串(这个算法同 
  202.       时也可以对加密后的字符串进行解密),如下所示: 
  203. %rot13.py 
  204. Enter string to rot13: This is a short senterce. 
  205. Your string to en/decrypt was: [This is a short sentence.]. 
  206. The rot13 string is: [Guvf vf n fubeg fragrapr.]. 
  207. %rot13.py 
  208. Enter string to rot13: Guvf vf n fubeg fragrapr. 
  209. Your string to en/decrypt was: [Guvf vf n fubeg fragrapr.]. 
  210. The rot13 string is: [This is a short sentence.]. 
  211.  
  212. #!/usr/bin/env python 
  213. ## -*- coding: utf-8 -*- 
  214. ## Author:  
  215.  
  216. def myRot13(srcSent,offSet=13): 
  217.     def enCrypt(aChar): 
  218.         op = lambda x: chr((ord(aChar) -x + offSet) % 26 + x) 
  219.         return op(97if aChar.islower() else (op(65if aChar.isupper() else aChar) 
  220.     return ''.join(map(enCrypt,srcSent)) 
  221.  
  222. if __name__ == "__main__"
  223.     wTittle = "Enter string to rot13:\n" 
  224.     srcSent = raw_input(wTittle) 
  225.     print "Your string to en/decrypt was: %s" % srcSent 
  226.     print "The rot13 string is: %s" % myRot13(srcSent)