Python编程文档怎么写问题:程序正常运行,但是文档测试通不过

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
《《Python编程实战:运用设计模式、冰法和程序库创建高质量程序》迷你书》.pdf文档全文免费阅读、在线看 72页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:200 &&
《《Python编程实战:运用设计模式、冰法和程序库创建高质量程序》迷你书》.pdf
你可能关注的文档:
··········
··········
华章程序员书库
Python 编程实战:运用设计模式、并
发和程序库创建高质量程序
Python in Practice: Create Better Programs Using
Concurrency, Libraries, and Patterns
(美) Mark Summerfield 著
爱飞翔 译
图书在版编目(CIP )数据
Python 编程实战:运用设计模式、并发和程序库创建高质量程序 / (美)萨默菲尔德
(Summerfield, M. )著;爱飞翔译. —北京:机械工业出版社,2014.7
(华章程序员书库)
书名原文:Python in Practice: Create Better Programs Using Concurrency, Libraries,
and Patterns
ISBN 978-7-111-47394-7
I. P… II. ①萨… ②爱… III. 软件工具-程序设计 IV. TP311.56
中国版本图书馆CIP 数据核字(2014 )第161735 号
本书版权登记号:图字:01-
Authorized translation from the English language edition, entitled
Programs Using Concurrency, Libraries, and Patterns , 5 by Mark Summerfield, published by
Pearson Education, Inc., Copyright (C) 2014 Qtrac Ltd.
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any
means, electronic or mechanical, including photocopying, recording or by any information storage
retrieval system, without permission from Pearson Education, Inc.
Chinese simplified language edition published by Pearson Education Asia Ltd., and China Machine
Press Copyright (C) 2014.
本书中文简体字版由Pearson Education (培生教育出版集团)授权机械工业出版社在中华人民共和国境内(不
包括中国台湾地区和中国香港、澳门特别行政区)独家出版发行。未经出版者书面许可,不得以任何方式抄袭、复制
或节录本书中的任何部分。
本书封底贴有Pearson Education (培生教育出版集团)激光防伪标签,无标签者不得销售。
Python 编程实战:
运用设计模式、并发和程序库创建高质量程序
[美 ] Mark Summerfield 著
出版发行:机械工业出版社(北京市西城区百万庄大街22 号 邮政编码:100037 )
责任编辑:关 敏
责任校对:殷 虹
印  刷:
版  次:2014 年8 月第 1 版第 1 次印刷
开  本:186mm ×240mm 1/16
印  张:16.75
书  号:ISBN 978-7-111-47394-7
定  价:69.00 元
凡购本书,如有缺页、倒页、脱页,由本社发行部调换
客服热线:(010 )361066
投稿热线:(010 )
购书热线:(010 )995259
读者信箱:hzjsj@
版权所有 侵权必究
封底无防伪标均为盗版
本书法律顾问:北京大成律师事
正在加载中,请稍后...【图片】【求助】py文件双击可运行,但加入计划任务后却打开失败,求大神【python吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:155,377贴子:
【求助】py文件双击可运行,但加入计划任务后却打开失败,求大神收藏
如题,已编好的PY程序,双击可运行,编写了一个bat文件调用它也可运行(无论是双击BAT,还是打开CMD一层一层进入BAT所在文件夹调用,都可正常实现py程序功能)但是,重点来了,一旦将BAT文件加入到windows计划任务后,便出现调用错误,错误类型提示为0x1,即 调用的函数不正确或调用了未知函数。不知错误何在,非常困惑。。。更让我想不通的是,另外一个PY程序——编写的时利用的语法和程序的功能几乎和刚才所说的程序如出一辙,但它就可以顺利用计划任务先调用bat从而实现程序功能。。。反复对比两个程序也没有发现问题所在,所以还想请大神帮忙解决,小弟不才先行跪拜。。。
python_总监级名师全程面授,项目实战案例式教学,企业需求无缝对接,助你无忧就业!python,0基础23周快速实现高薪就业,0元试听两周.名额有限,欲报从速.点击抢座
两张PY程序对应两个BAT文件,bat文件的作用是利用计划任务运行PY文件,第3张是BAT的具体内容,最后一张提示0x1为计划任务上次运行的结果,正常情况下应该是0x0
把日志重定向出来,帮助DEBUG。一般可能出现的问题无非以下几点:1,环境变量问题: 计划任务并非使用当前用户身份运行,所以环境变量不尽相同。此类解决方案应该是在脚本中尽量写绝对路径,杜绝因为path变量带来的负面影响。2,文件关联问题。脚本文件是通过解释器执行的。你的py脚本只有关联Python执行才可以直接执行,那万一关联的是文本编辑器呢?为了杜绝这种情况应该用python执行脚本。e.g: c:\python27\python driver:\path\to\script.py当然了,这些都是可能的情况,具体什么错误需要打印日志。把你执行的定时任务的信息重定向到文件,打开看看日志分析一下。
定时脚本中的路径都应该尽量使用绝对路径,这可是尝试,可以避免很多问题
所以bat脚本开头两个个cd ..就不对(话说你怎么不cd ..\..\micaps3 ?)定时任务的启动目录可不是你当前这个目录。你需要在脚本开头加上cd /d %~dp0才可以保证切换到当前目录下
⊂ヽ   \\ ∧_∧   \( ˘ω˘ )     & ⌒ヽ   /   へ\   /  / \\   レ ノ   ヽ_つ  / /  / /| ( (ヽ | |、\ | 丿 \ ⌒) | |  ) /`ノ )  Lノ(_/路过飘过′`)   ,•′ ¸,•′`)  (¸,•′  (¸*[NEVER SAY DIE]〃′`)      拿经验 ,•′ ¸,•′`)          (¸,•′ (¸闪人&什么叫小尾巴&&Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0. Safari/537.36
登录百度帐号推荐应用当前位置: >>
《Python程序设计》习题与答案
《Python 程序设计》习题与参考答案第 1 章 基础知识1.1 简单说明如何选择正确的 Python 版本。 答: 在选择 Python 的时候,一定要先考虑清楚自己学习 Python 的目的是什么,打算做哪方 面的开发,有哪些扩展库可用,这些扩展库最高支持哪个版本的 Python,是 Python 2.x 还是 Python 3.x,最高支持到 Python 2.7.6 还是 Python 2.7.9。这些问题都确定以后,再做出自己 的选择,这样才能事半功倍,而不至于把大量时间浪费在 Python 的反复安装和卸载上。同 时还应该注意,当更新的 Python 版本推出之后,不要急于更新,而是应该等确定自己所必 须使用的扩展库也推出了较新版本之后再进行更新。 尽管如此,Python 3 毕竟是大势所趋,如果您暂时还没想到要做什么行业领域的应用开 发,或者仅仅是为了尝试一种新的、好玩的语言,那么请毫不犹豫地选择 Python 3.x 系列的 最高版本(目前是 Python 3.4.3) 。 1.2 为什么说 Python 采用的是基于值的内存管理模式? 答: Python 采用的是基于值的内存管理方式,如果为不同变量赋值相同值,则在内存中只 有一份该值,多个变量指向同一块内存地址,例如下面的代码。 &&& x = 3 &&& id(x)
&&& y = 3 &&& id(y)
&&& y = 5 &&& id(y)
&&& id(x) .3 在 Python 中导入模块中的对象有哪几种方式? 答:常用的有三种方式,分别为 ? import 模块名 [as 别名] ? ?from 模块名 import 对象名[ as 别名] from math import *1.4 使用 pip 命令安装 numpy、scipy 模块。 答:在命令提示符环境下执行下面的命令: pip install numpy pip install scipy 1.5 编写程序,用户输入一个三位以上的整数,输出其百位以上的数字。例如用户输入 1234,则程序输出 12。 (提示:使用整除运算。 ) 答: 1)Python 3.4.2 代码: x = input('Please input an integer of more than 3 digits:') try: x = int(x) x = x//100 if x == 0: print('You must input an integer of more than 3 digits.') else: print(x) except BaseException: print('You must input an integer.') 2)Python 2.7.8 代码: import types x = input('Please input an integer of more than 3 digits:') if type(x) != types.IntType: print 'You must input an integer.' elif len(str(x)) != 4: print 'You must input an integer of more than 3 digits.' else: print x//100 第 2 章 Python 数据结构2.1 为什么应尽量从列表的尾部进行元素的增加与删除操作? 答: 当列表增加或删除元素时, 列表对象自动进行内存扩展或收缩, 从而保证元素之间没有 缝隙,但这涉及到列表元素的移动,效率较低,应尽量从列表尾部进行元素的增加与删除操 作以提高处理速度。 2.2 编写程序,生成包含 1000 个 0 到 100 之间的随机整数,并统计每个元素的出现次 数。 (提示:使用集合。 ) 答: 1)Python 3.4.2 代码 import random x = [random.randint(0,100) for i in range(1000)] d = set(x) for v in d: print(v, ':', x.count(v)) 2)Python 2.7.8 代码 import random x = [random.randint(0,100) for i in range(1000)] d = set(x) for v in d: print v, ':', x.count(v) 2.3 编写程序,用户输入一个列表和 2 个整数作为下标,然后输出列表中介于 2 个下标 之间的元素组成的子列表。例如用户输入[1,2,3,4,5,6]和 2,5,程序输出[3,4,5,6]。 答: 1)Python 3.4.2 代码 x = input('Please input a list:') x = eval(x) start, end = eval(input('Please input the start position and the end position:')) print(x[start:end]) 2)Python 2.7.8 代码 x = input('Please input a list:') start, end = input('Please input the start position and the end position:') print x[start:end] 2.4 设计一个字典,并编写程序,用户输入内容作为键,然后输出字典中对应的值,如 果用户输入的键不存在,则输出“您输入的键不存在! ” 答: 1)Python 3.4.2 代码 d = {1:'a', 2:'b', 3:'c', 4:'d'} v = input('Please input a key:') v = eval(v) print(d.get(v,'您输入的的键不存在')) 2)Python 2.7.8 代码 d = {1:'a', 2:'b', 3:'c', 4:'d'} v = input('Please input a key:') print(d.get(v,'您输入的的键不存在')) 2.5 编写程序,生成包含 20 个随机数的列表,然后将前 10 个元素升序排列,后 10 个 元素降序排列,并输出结果。 答: 1)Python 3.4.2 代码 import random x = [random.randint(0,100) for i in range(20)] print(x) y = x[0:10] y.sort() x[0:10] = y y = x[10:20] y.sort(reverse=True) x[10:20] = y print(x) 2)Python 2.7.8 代码 import random x = [random.randint(0,100) for i in range(20)] print x y = x[0:10] y.sort() x[0:10] = y y = x[10:20] y.sort(reverse=True) x[10:20] = y print x 2.6 在 Python 中,字典和集合都是用一对 有两部分组成,即 键 和 值 ,其中 大括号 键 作为定界符,字典的每个元素不允许重复。2.7 假设有列表 a = ['name','age','sex']和 b = ['Dong',38,'Male'],请使用一个语句将这两个 列表的内容转换为字典,并且以列表 a 中的元素为键,以列表 b 中的元素为值,这个语句可 以写为 c = dict(zip(a,b))。2.8 假设有一个列表 a,现要求从列表 a 中每 3 个元素取 1 个,并且将取到的元素组成 新的列表 b,可以使用语句 b = a[::3]。 [5 for i in range(10)]。2.9 使用列表推导式生成包含 10 个数字 5 的列表, 语句可以写为2.10 不可以 (可以、不可以)使用 del 命令来删除元组中的部分元素。 第 3 章 选择结构与循环结构3.1 分析逻辑运算符“or”的短路求值特性。 答: 假设有表达式“表达式 1 or 表达式 2” ,如果表达式 1 的值等价于 True,那么无论表达 式 2 的值是什么,整个表达式的值总是等价于 True。因此,不需要再计算表达式 2 的值。 3.2 编写程序,运行后用户输入 4 位整数作为年份,判断其是否为闰年。如果年份能被 400 整除,则为闰年;如果年份能被 4 整除但不能被 100 整除也为闰年。 答: 1)Python 3.4.2 代码 x = input('Please input an integer of 4 digits meaning the year:') x = eval(x) if x%400==0 or (x%4==0 and not x%100==0): print('Yes') else: print('No') 2)Python 2.7.8 代码 x = input('Please input an integer of 4 digits meaning the year:') if x%400==0 or (x%4==0 and not x%100==0): print 'Yes' else: print 'No' 3.3 编写程序,生成一个包含 50 个随机整数的列表,然后删除其中所有奇数。 (提示: 从后向前删。 ) 答: 1)Python 3.4.2 代码 import random x = [random.randint(0,100) for i in range(50)] print(x) i = len(x)-1 while i&=0: if x[i]%2==1: del x[i] i-=1 print(x) 2)Python 2.7.8 代码 把上面的代码中第三行和最后一行改为 print x 即可。 34 编写程序, 生成一个包含 20 个随机整数的列表, 然后对其中偶数下标的元素进行降 序排列,奇数下标的元素不变。 (提示:使用切片。 ) 答: 1)Python 3.4.2 代码 import random x = [random.randint(0,100) for i in range(20)] print(x) y = x[::2] y.sort(reverse=True) x[::2] = y print(x) 2)Python 2.7.8 代码 把上面的代码中第三行和最后一行改为 print x 即可。 35 编写程序,用户从键盘输入小于 1000 的整数,对其进行因式分解。例如,10=2×5, 60=2×2×3×5。 答: 1)Python 3.4.2 代码 x = input('Please input an integer less than 1000:') x = eval('x') t=x i=2 result = [] while True: if t==1: break if t%i==0: result.append(i) t = t/i else: i+=1 Print x,'=','*'.join(map(str,result)) 2)Python 2.7.8 代码 x = input('Please input an integer less than 1000:') t=x i=2 result = [] while True: if t==1: break if t%i==0: result.append(i) t = t/i else: i+=1 print x,'=','*'.join(map(str,result)) 3.6 编写程序,至少使用 2 种不同的方法计算 100 以内所有奇数的和。 答:Python 3.4.2 代码如下,如果使用 Python 2.7.8 只需要把其中的 print()函数改为 print 语句即可。 x = [i for i in range(1,100) if i%2==1] print(sum(x)) print(sum(range(1,100)[::2])) 3.7 编写程序,实现分段函数计算,如下表所示。 x x&0 0&=x&5 5&=x&10 10&=x&20 20&=x y 0 x 3x-5 0.5x-2 0答:Python 3.4.2 代码如下,如果使用 Python 2.7.8 只需要把其中的 print()函数改为 print 语句即可。 x = input('Please input x:') x = eval(x) if x&0 or x&=20: print(0) elif 0&=x&5: print(x) elif 5&=x&10: print(3*x-5) elif 10&=x&20: print(0.5*x-2) 第 4 章 字符串与正则表达式4.1 假设有一段英文,其中有单独的字母“I”误写为“i” ,请编写程序进行纠正。 答:这里给出 Python 3.4.2 代码,如果使用 Python 2.7.8 的话只需要修改其中的 print() 函数为 print 语句即可。 1)不使用正则表达式 x = &i am a teacher,i am man, and i am 38 years old.I am not a businessman.& x = x.replace('i ','I ') x = x.replace(' i ',' I ') print(x) 2)使用正则表达式 x = &i am a teacher,i am man, and i am 38 years old.I am not a businessman.& import re pattern = re.compile(r'(?:[^\w]|\b)i(?:[^\w])') while True: result = pattern.search(x) if result: if result.start(0) != 0: x = x[:result.start(0)+1]+'I'+x[result.end(0)-1:] else: x = x[:result.start(0)]+'I'+x[result.end(0)-1:] else: break print(x) 4.2 假设有一段英文,其中有单词中间的字母“i”误写为“I” ,请编写程序进行纠正。 答:这里给出 Python 3.4.2 代码,如果使用 Python 2.7.8 的话只需要修改其中的 print() 函数为 print 语句即可。 import re x = &I am a teacher,I am man, and I am 38 years old.I am not a busInessman.& print(x) pattern = re.compile(r'(?:[\w])I(?:[\w])') while True: result = pattern.search(x) if result: if result.start(0) != 0: x = x[:result.start(0)+1]+'i'+x[result.end(0)-1:] else: x = x[:result.start(0)]+'i'+x[result.end(0)-1:] else: break print(x) 4.3 有一段英文文本,其中有单词连续重复了 2 次,编写程序检查重复的单词并只保留 一个。例如文本内容为“This is is a desk.” ,程序输出为“This is a desk.” 答:这里给出 Python 3.4.2 代码,如果使用 Python 2.7.8 的话只需要修改其中的 print() 函数为 print 语句即可。 1)方法一 import re x = 'This is a a desk.' pattern = re.compile(r'\b(\w+)(\s+\1){1,}\b') matchResult = pattern.search(x) x = pattern.sub(matchResult.group(1),x) print(x) 2)方法二 x = 'This is a a desk.' pattern = re.compile(r'(?P&f&\b\w+\b)\s(?P=f)') matchResult = pattern.search(x) x = x.replace(matchResult.group(0),matchResult.group(1)) 4.4 简单解释 Python 的字符串驻留机制。 答: Python 支持字符串驻留机制,即:对于短字符串,将其赋值给多个不同的对象时,内 存中只有一个副本,多个对象共享该副本。这一点不适用于长字符串,即长字符串不遵守驻 留机制,下面的代码演示了短字符串和长字符串在这方面的区别。 &&& a = '1234' &&& b = '1234' &&& id(a) == id(b) True &&& a = ' &&& b = ' &&& id(a) == id(b) False 4.5 编写程序,用户输入一段英文,然后输出这段英文中所有长度为 3 个字母的单词。 答:这里给出 Python 3.4.2 代码,如果使用 Python 2.7.8 的话只需要修改其中的 print() 函数为 print 语句即可。 import re x = input('Please input a string:') pattern = re.compile(r'\b[a-zA-Z]{3}\b') print(pattern.findall(x)) 第 5 章 函数设计与使用5.1 运行 5.3.1 小节最后的示例代码,查看结果并分析原因。 答: 原因是对于函数的默认值参数只会被处理一次, 下次再调用函数并且不为默认值参 数赋值时会继续使用上一次的结果, 对于列表这样的结构, 如果调用函数时为默认值参数的 列表插入或删除了元素,将会得到保留,从而影响下一次调用。 5.2 编写函数,判断一个整数是否为素数,并编写主程序调用该函数。 答:这里给出 Python 3.4.2 代码,如果使用 Python 2.7.8 的话只需要修改其中的 print() 函数为 print 语句即可。 import math def IsPrime(v): n = int(math.sqrt(v)+1) for i in range(2,n): if v%i==0: return 'No' else: return 'Yes' print(IsPrime(37)) print(IsPrime(60)) print(IsPrime(113)) 5.3 编写函数,接收一个字符串,分别统计大写字母、小写字母、数字、其他字符的个 数,并以元组的形式返回结果。 答:这里给出 Python 3.4.2 代码,如果使用 Python 2.7.8 的话只需要修改其中的 print() 函数为 print 语句即可。 def demo(v): capital = little = digit = other =0 for i in v: if 'A'&=i&='Z': capital+=1 elif 'a'&=i&='z': little+=1 elif '0'&=i&='9': digit+=1 else: other+=1 return (capital,little,digit,other) x = 'capital = little = digit = other =0' print(demo(x)) 5.4 在 Python 程序中,局部变量会隐藏同名的全局变量吗?请编写代码进行验证。 答案:会。 &&& def demo(): a=3 print a&&& a=5 &&& demo() 3 &&& a 5 5.5 编写函数,可以接收任意多个整数并输出其中的最大值和所有整数之和。 答:这里给出 Python 3.4.2 代码,如果使用 Python 2.7.8 的话只需要修改其中的 print() 函数为 print 语句即可。 def demo(*v): print(v) print(max(v)) print(sum(v)) demo(1,2,3) demo(1,2,3,4) demo(1,2,3,4,5) 5.6 编写函数,模拟内置函数 sum()。 答:这里给出 Python 3.4.2 代码,如果使用 Python 2.7.8 的话只需要修改其中的 print() 函数为 print 语句即可。 def Sum(v): s=0 for i in v: s += i return s x = [1,2,3,4,5] print(Sum(x)) x = (1,2,3,4,5) print(Sum(x))5.7 编写函数,模拟内置函数 sorted()。 答:这里给出 Python 3.4.2 代码,如果使用 Python 2.7.8 的话只需要修改其中的 print() 函数为 print 语句即可。 def Sorted(v): t = v[::] r = [] while t: tt = min(t) r.append(tt) t.remove(tt) return r x = [1,3,5,2,1,0,9,7] print(x) print(Sorted(x)) 第 6 章 面向对象程序设计6.1 继承 6.5 节例 2 中的 Person 类生成 Student 类,填写新的函数用来设置学生专业, 然后生成该类对象并显示信息。 答:Python 3.4.2 代码为 import types class Person(object): #基类必须继承于 object,否则在派生类中将无法使用 super()函数 def __init__(self, name = '', age = 20, sex = 'man'): self.setName(name) self.setAge(age) self.setSex(sex) def setName(self, name): if not isinstance(name,str): print('name must be string.') return self.__name = name def setAge(self, age): if not isinstance(age,int): print('age must be integer.') return self.__age = age def setSex(self, sex): if sex != 'man' and sex != 'woman': print('sex must be &man& or &woman&') return self.__sex = sex def show(self): print(self.__name) print(self.__age) print(self.__sex) class Student(Person): def __init__(self, name='', age = 30, sex = 'man', major = 'Computer'): #调用基类构造方法初始化基类的私有数据成员 super(Student, self).__init__(name, age, sex) self.setMajor(major) #初始化派生类的数据成员 def setMajor(self, major): if not isinstance(major, str): print('major must be a string.') return self.__major = major def show(self): super(Student, self).show() print(self.__major) if __name__ =='__main__': zhangsan = Person('Zhang San', 19, 'man') zhangsan.show() lisi = Student('Li Si',32, 'man', 'Math') lisi.show() 6.2 设计一个三维向量类, 并实现向量的加法、 减法以及向量与标量的乘法和除法运算。 答:Python 3.4.2 代码如下 class Vecter3: def __init__(self, x=0, y=0, z=0): self.X = x self.Y = y self.Z = z def __add__(self, n): r = Vecter3() r.X = self.X + n.X r.Y = self.Y + n.Y r.Z = self.Z + n.Z return r def __sub__(self, n): r = Vecter3() r.X = self.X - n.X r.Y = self.Y - n.Y r.Z = self.Z - n.Z return r def __mul__(self, n): r = Vecter3() r.X = self.X * n r.Y = self.Y * n r.Z = self.Z * n return r def __truediv__(self, n): r = Vecter3() r.X = self.X / n r.Y = self.Y / n r.Z = self.Z / n return r def __floordiv__(self, n): r = Vecter3() r.X = self.X // n r.Y = self.Y // n r.Z = self.Z // n return r def show(self): print((self.X,self.Y,self.Z)) v1 = Vecter3(1,2,3) v2 = Vecter3(4,5,6) v3 = v1+v2 v3.show() v4 = v1-v2 v4.show() v5 = v1*3 v5.show() v6 = v1/2 v6.show() 6.3 面向对象程序设计的三要素分别为 封装 、 继承 和 多态 。6.4 简单解释 Python 中以下划线开头的变量名特点。 答: 在 Python 中,以下划线开头的变量名有特殊的含义,尤其是在类的定义中。用下划线 作为变量前缀和后缀来表示类的特殊成员: ? _xxx:这样的对象叫做保护变量,不能用'from module import *'导入,只有类对象 和子类对象能访问这些变量; ? __xxx__:系统定义的特殊成员名字; ? __xxx:类中的私有成员,只有类对象自己能访问,子类对象也不能访问到这个成 员,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。Python 中 没有纯粹的 C++意义上的私有成员。 6.5 与运算符“**”对应的特殊方法名为 方法名为 __floordiv__() 。 __pow__() ,与运算符“//”对应的特殊 第 7 章 文件操作7.1 假设有一个英文文本文件,编写程序读取其内容,并将其中的大写字母变为小写字 母,小写字母变为大写字母。 答: f = open(r'd:\1.txt','r') s = f.readlines() f.close() r = [i.swapcase() for i in s] f = open(r'd:\2.txt','w') f.writelines(r) f.close() 7.2 编写程序,将包含学生成绩的字典保存为二进制文件,然后再读取内容并显示。 答:Python 3.4.2 代码 import pickle d = {'张三':98,'李四':90,'王五':100} print(d) f = open('score.dat','wb') pickle.dump(1,f) pickle.dump(d,f) f.close f = open('score.dat','rb') pickle.load(f) d = pickle.load(f) f.close() print(d) 7.3 使用 shutil 模块中的 move()方法进行文件移动。 答: &&& import shutil &&& shutil.move(r'd:\1.txt', r'e:\1.txt') 'e:\\1.txt' 7.4 简单解释文本文件与二进制文件的区别。 答: (1)文本文件 文本文件存储的是常规字符串,由若干文本行组成,通常每行以换行符'\n'结尾。常规 字符串是指记事本或其他文本编辑器能正常显示、 编辑并且人类能够直接阅读和理解的字符 串,如英文字母、汉字、数字字符串。文本文件可以使用字处理软件如 gedit、记事本进行 编辑。 (2)二进制文件 二进制文件把对象内容以字节串(bytes)进行存储, 无法用记事本或其他普通字处理软件 直接进行编辑,通常也无法被人类直接阅读和理解,需要使用专门的软件进行解码后读取、 显示、修改或执行。常见的如图形图像文件、音视频文件、可执行文件、资源文件、各种数 据库文件、各类 office 文档等都属于二进制文件。 7.5 编写代码,将当前工作目录修改为“c:\” ,并验证,最后将当前工作目录恢复为原 来的目录。 答: &&& import os &&& os.getcwd() 'C:\\Python34' &&& os.chdir(r'c:\\') &&& os.getcwd() 'c:\\' &&& os.chdir(r'c:\Python34') &&& os.getcwd() 'c:\\Python34' 7.6 编写程序,用户输入一个目录和一个文件名,搜索该目录及其子目录中是否存在该 文件。 答: 1)Python 3.4.2 代码 import sys import os directory = sys.argv[1] filename = sys.argv[2] paths = os.walk(directory) for root,dirs,files in paths: if filename in files: print('Yes') break else: print('No') 2)Python 2.7.8 代码 import sys import os directory = sys.argv[1] filename = sys.argv[2] paths = os.walk(directory) for root,dirs,files in paths: if filename in files: print 'Yes' break else: print 'No' 第 8 章 异常处理结构与程序调试8.1 Python 异常处理结构有哪几种形式? 答: 比较常用的形式有: 1)标准异常处理结构 try: try 块 #被监控的语句,可能会引发异常 except Exception[, reason]: except 块 #处理异常的代码 如果需要捕获所有异常时,可以使用 BaseException,代码格式如下: try: ?? except BaseException, e: except 块 #处理所有错误 上面的结构可以捕获所有异常,尽管这样做很安全,但是一般并不建议这样做。对于异 常处理结构, 一般的建议是尽量显式捕捉可能会出现的异常并且有针对性地编写代码进行处 理,因为在实际应用开发中,很难使用同一段代码去处理所有类型的异常。当然,为了避免 遗漏没有得到处理的异常干扰程序的正常执行, 在捕捉了所有可能想到的异常之后, 您也可 以使用异常处理结构的最后一个 except 来捕捉 BaseException。 2)另外一种常用的异常处理结构是 try...except...else...语句。 3)在实际开发中,同一段代码可能会抛出多个异常,需要针对不同的异常类型进行相 应的处理。为了支持多个异常的捕捉和处理,Python 提供了带有多个 except 的异常处理结 构,这类似于多分支选择结构,一旦某个 except 捕获了异常,则后面剩余的 except 子句将 不会再执行。语法为: try: try 块 except Exception1: except 块 1 except Exception2: except 块 2 #被监控的语句 #处理异常 1 的语句 #处理异常 2 的语句4)将要捕获的异常写在一个元组中,可以使用一个 except 语句捕获多个异常,并且共 用同一段异常处理代码,当然,除非确定要捕获的多个异常可以使用同一段代码来处理,并 不建议这样做。 5)最后一种常用的异常处理结构是 try...except...finally...结构。在该结构中,finally 子 句中的内存无论是否发生异常都会执行,常用来做一些清理工作以释放 try 子句中申请的资 源。语法如下: try: ?? finally: ...... #无论如何都会执行的代码8.2 异常和错误有什么区别? 答: 异常是指因为程序执行过程中出错而在正常控制流以外采取的行为。 严格来说, 语法错 误和逻辑错误不属于异常, 但有些语法错误往往会导致异常, 例如由于大小写拼写错误而访 问不存在的对象,或者试图访问不存在的文件,等等。 8.3 使用 pdb 模块进行 Python 程序调试主要有哪几种用法? 答:主要有三种方式, 1)在交互模式下使用 pdb 模块提供的功能可以直接调试语句块、表达式、函数等多种 脚本。 2)在程序中嵌入断点来实现调试功能 在程序中首先导入 pdb 模块,然后使用 pdb.set_trace()在需要的位置设置断点。如果程 序中存在通过该方法调用显式插入的断点, 那么在命令提示符环境下执行该程序或双击执行 程序时将自动打开 pdb 调试环境,即使该程序当前不处于调试状态。 3)使用命令行调试程序 在命令行提示符下执行“python Cm pdb 脚本文件名” ,则直接进入调试环境;当调试 结束或程序正常结束以后,pdb 将重启该程序。 8.4 Python 内建异常类的基类是 8.5 断言语句的语法为 assert BaseException 。 with 。 。8.6 Python 上下文管理语句是 第 9 章 GUI 编程9.1 设计一个窗体,并放置一个按钮,单击按钮后弹出颜色对话框,关闭颜色对话框后 提示选中的颜色。 答:Python 2.7.8 代码如下, import wx class wxGUI(wx.App): def OnInit(self): frame = wx.Frame(parent=None, title='wxGUI', size=(160,140)) panel = wx.Panel(frame, -1) buttonOK = wx.Button(panel, -1, 'OK', pos=(0,0)) self.Bind(wx.EVT_BUTTON, self.OnButtonOK, buttonOK) frame.Show() return True def OnButtonOK(self, event): colorDlg = wx.ColourDialog(None) colorDlg.ShowModal() color = colorDlg.GetColourData().Colour wx.MessageBox(str(color)) app = wxGUI() app.MainLoop() 9.2 设计一个窗体,并放置一个按钮,按钮默认文本为“开始” ,单击按钮后文本变为 “结束” ,再次单击后变为“开始” ,循环切换。 答:Python 2.7.8 代码如下, import wx class wxGUI(wx.App): def OnInit(self): frame = wx.Frame(parent=None, title='wxGUI', size=(160,140)) panel = wx.Panel(frame, -1) self.buttonOK = wx.Button(panel, -1, 'Start', pos=(0,0)) self.Bind(wx.EVT_BUTTON, self.OnButtonOK, self.buttonOK) frame.Show() return True def OnButtonOK(self, event): text = self.buttonOK.GetLabelText() if text == 'Start': self.buttonOK.SetLabelText('End') elif text == 'End': self.buttonOK.SetLabelText('Start') app = wxGUI() app.MainLoop() 9.3 设计一个窗体,模拟 QQ 登录界面,当用户输入号码 123456 和密码 654321 时提示 正确,否则提示错误。 答:Python 2.7.8 代码如下, import wx class wxGUI(wx.App): def OnInit(self): frame = wx.Frame(parent=None, title='Login', size=(250,150), pos=(350,350)) panel = wx.Panel(frame, -1) label1 = wx.StaticText(panel, -1, 'UserName:', pos=(0,10), style=wx.ALIGN_RIGHT) label2 = wx.StaticText(panel, -1, 'Password:', pos=(0,30), style=wx.ALIGN_RIGHT) self.textName = wx.TextCtrl(panel, -1, pos=(70,10), size=(160,20)) self.textPwd = wx.TextCtrl(panel, -1, size=(160,20),style=wx.TE_PASSWORD) buttonOK = wx.Button(panel, -1, 'OK', pos=(30,60)) self.Bind(wx.EVT_BUTTON, self.OnButtonOK, buttonOK) buttonCancel = wx.Button(panel, -1, 'Cancel', pos=(120,60)) self.Bind(wx.EVT_BUTTON, self.OnButtonCancel, buttonCancel) buttonOK.SetDefault() frame.Show() return True def OnButtonOK(self, event): usrName = self.textName.GetValue() usrPwd = self.textPwd.GetValue() if usrName=='; and usrPwd==';: wx.MessageBox('Right') else: wx.MessageBox('Wrong') def OnButtonCancel(self, event): pass app = wxGUI() app.MainLoop()pos=(70,30), 第 10 章 网络程序设计10.1 简单解释 TCP 和 UDP 协议的区别。 答: TCP 协议是面向连接的、具有质量保证的可靠传输协议,但开销较大;UDP 协议是尽 最大能力传输的无连接协议,开销小,常用于视频在线点播(Video On Demand, VOD)之 类的应用。TCP 协议和 UDP 协议并没有优劣之分,仅仅是适用场合有所不同。 10.2 同学之间合作编写 UDP 通信程序,分别编写发送端和接收端代码,发送端发送一 个字符串“Hello world!” 。假设接收端在计算机的 5000 端口进行接收,并显示接收内容。 答:首先使用 ipconfig/all 命令查看本机 IP 地址,然后分别编写下面的代码,并将其中 的 IP 地址替换为相应的 IP 地址。 接收端代码: import socket s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind((&&, 5000)) #空字符串表示本机任何可用 IP 地址 data, addr=s.recvfrom(1024) # 缓冲区大小为 1024 字节 print ' received message:%s' % data #显示接收到的内容 s.close( ) 发送端代码: import socket s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.sendto(&Hello, world!& , (&10.20.52.248& ,5000)) #假设 10.20.52.248 是接收端主机的 IP 地址 s.close( ) 10.3 简单介绍 socket 模块中用于 TCP 编程的常用方法。 TCP 一般用于要求可靠数据传输的场合。编写 TCP 程序时经常需要用到的 socket 模块 方法主要有: ? ? ? ? ? ? connect(address):连接远程计算机 send(bytes[,flags]):发送数据 recv(bufsize[,flags]):接收数据 bind(address):绑定地址 listen(backlog):开始监听,等待客户端连接 accept():响应客户端的请求10.4 编写代码读取搜狐网页首页内容。 答: &&& import urllib.request &&& dir(urllib.request) &&& fp = urllib.request.urlopen('.cn') &&& dir(fp) &&& print(fp.read(100)) &&& fp.close() 10.5 在自己的机器上配置 IIS 以支持 Python 脚本的运行,然后使用 Python 编写脚本, 运行后在网页上显示“Hello world!” 。 答:核心代码为 print print 'Status: 200 OK' print 'Content-type: text/html' print print '&HTML&&HEAD&&TITLE&Python Sample CGI&/TITLE&&/HEAD&' print '&BODY&' print '&H1&This is a header&/H1&' print '&p&Hello world!' print '&br&' print '&/BODY&' 第 11 章 大数据处理11.1 简单介绍常见的大数据处理框架。 答:主要有三种, ? MapReduce:分布式计算框架,可以将单个大型计算作业分配给多台计算机执行,可以在短时间内完成大量工作, 尤其适合数值型和标称型数据, 但需要对行业领域具有 一定理解后重写算法来完成特定的业务处理要求。MapReduce 的名字由函数式编程中 常用的 map 和 reduce 两个单词组成。MapReduce 在大量节点组成的集群上运行,工作 流程是:单个作业被分成很多小份,输入数据也被切片并分发到每个节点,每个节点只 在本地数据上做运算, 对应的运算代码称为 mapper, 这个过程即 map 阶段; 每个 mapper 的输出通过某种方式组合, 根据需要可能再进行重新排序, 排序后的结果再被切分成小 份并分发到各个节点进行下一步处理,这个过程被称为 reduce 阶段,对应的代码称为 reducer。 不同类型的作业可能需要不同数量的 reducer, 并且, 在任何时候, 每个 mapper 或 reducer 之间都不进行通信,每个节点只负责处理自己的事务,并且只在分配到本地 的数据集上进行运算。 ? Hadoop:Hadoop 是 MapReduce 框架的一个免费开源实现,采用 Java 语言编写,支持在大量机器上分布式处理数据。除了分布式计算之外,Hadoop 还自带分布式文件 系统,可以在上面运行多种不同语言编写的分布式程序。Hadoop 在可伸缩性、健壮性、 计算性能和成本上具有无可替代的优势, 事实上已成为当前互联网企业主流的大数据分 析平台。 ? Spark : Spark 是 一 个 针 对 超 大 数 据 集 合 的 低 延 迟 集 群 分 布 式 计 算 系 统 , 比MapReduce 快 40 倍左右。Spark 是 Hadoop 的升级版本,兼容 Hadoop 的 API,能够读 写 Hadoop 的 HDFS HBASE 顺序文件等, 与之不同的是将结果保存在内存中。 Hadoop 作为第一代产品使用了 HDFS,第二代加入了 Cache 来保存中间计算结果,第三代则是 Spark 倡导的流技术 Streaming。 11.2 运行本章中代码并理解 MapReduce 编程思路。 答:略 第 12 章 Windows 系统编程12.1 查阅相关资料,解释注册表几大根键的用途。 答:略 12.2 选择一个编写好的 Python 程序,将其转换为 exe 可执行文件。 答:略,请参考书中相关介绍。 12.3 编写代码,使用至少 3 中不同的方法启动 Windows 自带的计算器程序。 答: 第一种方法: &&& import os &&& os.system('calc.exe') 第二种方法: &&& import os &&& os.popen('calc.exe') 第三种方法: &&& import os &&& os.startfile('calc.exe') 第四种方法: &&& import win32api &&& win32api.ShellExecute(0, 'open', 'calc.exe', '', '', 1) 第五种方法: &&& import win32process &&& handle=win32process.CreateProcess(r'c:\windows\system32\calc.exe','', None,None,0, win32process.CREATE_NO_WINDOW, None, None,win32process.STARTUPINFO()) 12.4 编写代码,检测您所使用的操作系统版本。 答:略,请参考 12.5 节。 第 13 章 多线程编程13.1 简单叙述创建线程的方法。 答: Thread 类支持使用两种方法来创建线程,一种是为构造函数传递一个可调用对象,另 一种是继承 Thread 类并在派生类中重写__init__()和 run()方法。创建了线程对象以后,可以 调用其 start()方法来启动,该方法自动调用该类对象的 run()方法,此时该线程处于 alive 状 态,直至线程的 run()方法运行结束。 13.2 简单叙述 Thread 对象的方法。 答: (1)join([timeout]:阻塞当前线程,等待被调线程结束或超时后再继续执行当前线程 的后续代码,参数 timeout 用来指定最长等待时间,单位为秒。 (2)isAlive():测试线程是否处于运行状态 (3)start():自动调用 run()方法,启动线程,执行线程代码。 (4)run():线程代码,用来实现线程的功能与业务逻辑,可以在子类中重写该方法来 自定义线程的行为。 13.3 简单叙述线程对象的 daemon 属性的作用和影响。 答: 在脚本运行过程中有一个主线程, 若在主线程中创建了子线程, 当主线程结束时根据子 线程 daemon 属性值的不同可能会发生下面的两种情况之一:1)当某子线程的 daemon 属性 为 False 时,主线程结束时会检测该子线程是否结束,如果该子线程尚未完成,则主线程会 等待它完成后再退出;2)当某子线程的 daemon 属性为 True 时,主线程运行结束时不对该 子线程进行检查而直接退出, 同时所有 daemon 值为 True 的子线程将随主线程一起结束, 而 不论是否运行完成。daemon 属性的值默认为 False,如果需要修改,则必须在调用 start()方 法启动线程之前进行修改。 13.4 解释至少 3 种线程同步方法。 答: (1)使用 Condition 对象可以在某些事件触发后才处理数据, 可以用于不同线程之间的 通信或通知, 以实现更高级别的同步。 Condition 对象除了具有 acquire()和 release()方法之外, 还有 wait()、notify()、notify_all()等方法。下面通过经典生产者/消费者问题来演示 Condition 对象的用法。 (2)Queue 模块(在 Python 3 中为 queue 模块)实现了多生产者/多消费者队列,尤其 适合需要在多个线程之间进行信息交换的场合,该模块的 Queue 对象实现了多线程编程所 需要的所有锁语义。 (3)Event 对象是一种简单的线程通信技术,一个线程设置 Event 对象,另一个线程等 待 Event 对象。Event 对象的 set()方法可以设置 Event 对象内部的信号标志为真;clear()方法 可以清除 Event 对象内部的信号标志,将其设置为假;isSet()方法用来判断其内部信号标志 的状态;wait()方法只有在其内部信号状态为真时将很快地执行并返回,若 Event 对象的内 部信号标志为假,wait()方法将一直等待至超时或内部信号状态为真。 第 14 章 数据库编程14.1 简单介绍 SQLite 数据库。 答: SQLite 是内嵌在 Python 中的轻量级、基于磁盘文件的数据库管理系统,不需要服务器 进程,支持使用 SQL 语句来访问数据库。该数据库使用 C 语言开发,支持大多数 SQL91 标准,支持原子的、一致的、独立的和持久的事务,不支持外键限制;通过数据库级的独占 性和共享锁定来实现独立事务, 当多个线程同时访问同一个数据库并试图写入数据时, 每一 时刻只有一个线程可以写入数据。SQLite 支持 2TB 大小的单个数据库,每个数据库完全存 储在单个磁盘文件中,以 B+树数据结构的形式存储,一个数据库就是一个文件,通过简单 复制即可实现数据库的备份。 14.2 使用 Python 内置函数 dir()查看 Cursor 对象中的方法,并使用内置函数 help()查看 其用法。 答:略。 14.3 叙述使用 Python 操作 Access 数据库的步骤。 答: (1)建立数据库连接 import win32com.client conn = win32com.client.Dispatch(r'ADODB.Connection') DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:/MyDB.' conn.Open(DSN) (2)打开记录集 rs = win32com.client.Dispatch(r'ADODB.Recordset') rs_name = 'MyRecordset' #表名 rs.Open('[' + rs_name + ']', conn, 1, 3) (3)操作记录集 rs.AddNew() rs.Fields.Item(1).Value = 'data' rs.Update() (4)操作数据 conn = win32com.client.Dispatch(r'ADODB.Connection') DSN = 'PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=C:/MyDB.' sql_statement = &Insert INTO [Table_Name] ([Field_1], [Field_2]) VALUES ('data1', 'data2')& conn.Open(DSN) conn.Execute(sql_statement) conn.Close() (5)遍历记录 rs.MoveFirst() count = 0 while 1: if rs.EOF: break else: count = count + 1 rs.MoveNext() 14.4 叙述使用 Python 操作 MS SQL Server 数据库的步骤。 答: 可以使用 pywin32 和 pymssql 两种不同的方式来访问 MS SQL Server 数据库。 先来了解一下 pywin32 模块访问 MS SQL Server 数据库的步骤。 (1)添加引用: import adodbapi adodbapi.adodbapi.verbose = False # adds details to the sample printout import adodbapi.ado_consts as adc (2)创建连接: Cfg = {'server':'192.168.29.86\\eclexpress','password':'xxxx','db':'pscitemp'} constr = r&Provider=SQLOLEDB.1; Initial Catalog=%s; Data Source=%s; user ID=%s; Password=%s; &% (Cfg['db'], Cfg['server'], 'sa', Cfg['password']) conn = adodbapi.connect(constr) (3)执行 sql 语句: cur = conn.cursor() sql = '''select * from softextBook where title='{0}' and remark3!='{1}''''.format(bookName,flag) cur.execute(sql) data = cur.fetchall() cur.close() (4)执行存储过程: #假设 proName 有三个参数,最后一个参数传了 null ret = cur.callproc('procName',(parm1,parm2,None)) mit() (5)关闭连接 conn.close() 接下来再通过一个示例来简单了解一下使用 pymssql 模块访问 MS SQL Server 数据库的 方法。 import pymssql conn = pymssql.connect(host='SQL01', user='user', password='password', database='mydatabase') cur = conn.cursor() cur.execute('CREATE TABLE persons(id INT, name VARCHAR(100))') cur.executemany(&INSERT INTO persons VALUES(%d, xinos.king)&, [ (1, 'John Doe'), (2, 'Jane Doe') ]) mit() cur.execute('SELECT * FROM persons WHERE salesrep=xinos.king', 'John Doe') row = cur.fetchone() while row: print &ID=%d, Name=xinos.king& % (row[0], row[1]) row = cur.fetchone() cur.execute(&SELECT * FROM persons WHERE salesrep LIKE 'J%'&) conn.close() 14.5 叙述 MySQLDb 模块提供的数据库访问方法。 答: Python 访问 MySQL 数据库可以使用 MySQLDb 模块,该模块主要方法有: ? ? ? commit() :提交事务。 rollback() :回滚事务。 callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数。 ? execute(self, query, args):执行单条 sql 语句,接收的参数为 sql 语句本身和使用的参数列表,返回值为受影响的行数。 ? executemany(self, query, args): 执行单条 sql 语句, 但是重复执行参数列表里的参数,返回值为受影响的行数。 ? ? ? nextset(self):移动到下一个结果集。 fetchall(self):接收全部的返回结果行。 fetchmany(self, size=None):接收 size 条返回结果行,如果 size 的值大于返回的结果行的数量,则会返回 cursor.arraysize 条数据。 ? ?fetchone(self):返回一条结果行。 scroll(self, value, mode='relative'):移动指针到某一行,如果 mode='relative',则表示从当前所在行移动 value 条; 如果 mode='absolute', 则表示从结果集的第一行移动 value 条。 第 15 章 多媒体编程15.1 编程程序,在窗口上绘制一个三角形,设置三个顶点为不同的颜色,并对内部进 行光滑着色。 答: from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * import sys class MyPyOpenGLTest: def __init__(self, width = 640, height = 480, title = 'MyPyOpenGLTest'): glutInit(sys.argv) glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(width, height) self.window = glutCreateWindow(title) glutDisplayFunc(self.Draw) glutIdleFunc(self.Draw) self.InitGL(width, height) #default drawing function def Draw(self): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() glTranslatef(-2.0, 0.0, -8.0) #draw 2D graphic, leaving z to be 0 glBegin(GL_POLYGON) glColor3f(1.0, 0.0, 0.0) glVertex3f(0.0, 1.0, 0.0) glColor3f(0.0, 1.0, 0.0) glVertex3f(1.0, -1.0, 0.0) glColor3f(0.0, 0.0, 1.0) glVertex3f(-1.0, -1.0, 0.0) glEnd() glTranslatef(2.5, 0.0, 0.0) glutSwapBuffers() def InitGL(self, width, height): glClearColor(0.0, 0.0, 0.0, 0.0) glClearDepth(1.0) glDepthFunc(GL_LESS) glShadeModel(GL_SMOOTH) glEnable(GL_POINT_SMOOTH) glEnable(GL_LINE_SMOOTH) glEnable(GL_POLYGON_SMOOTH) glMatrixMode(GL_PROJECTION) glHint(GL_POINT_SMOOTH_HINT,GL_NICEST) glHint(GL_LINE_SMOOTH_HINT,GL_NICEST) glHint(GL_POLYGON_SMOOTH_HINT,GL_FASTEST) glLoadIdentity() gluPerspective(45.0, float(width)/float(height), 0.1, 100.0) glMatrixMode(GL_MODELVIEW) def MainLoop(self): glutMainLoop() if __name__ == '__main__': w = MyPyOpenGLTest() w.MainLoop() 15.2 编写程序,读取两幅大小一样的图片,然后将两幅图像的内容叠加到一幅图像, 结果图像中每个像素值为原两幅图像对应位置像素值的平均值。 答: from PIL import Image im1 = Image.open('d:\\pic1.bmp') im2 = Image.open('d:\\pic2.bmp') size = im1.size for i in range(size[0]): for j in range(size[1]): color1 = im1.getpixel((i,j)) color2 = im2.getpixel((i,j)) r = (color1[0]+color2[0])//2 g = (color1[1]+color2[1])//2 b = (color1[2]+color2[2])//2 im1.putpixel((i,j),(r,g,b)) im1.save('d:\\pic3.bmp') im1.close() im2.close() 15.3 编写程序,读取一幅图像的内容,将其按象限分为 4 等份,然后 1、3 象限内容交 换,2、4 象限内容交换,生成一幅新图像。 答: from PIL import Image im = Image.open('d:\\pic1.bmp') im2 = Image.open('d:\\pic1.bmp') size = im.size box1 = (0, size[1]/2, size[0]/2, size[1]) region1 = im.crop(box1) box2 = (0, 0, size[0]/2, size[1]/2) region2 = im.crop(box2) box3 = (size[0]/2, 0, size[0], size[1]/2) region3 = im.crop(box3) box4 = (size[0]/2, size[1]/2, size[0], size[1]) region4 = im.crop(box4) im2.paste(region1, box3) im2.paste(region3, box1) im2.paste(region2, box4) im2.paste(region4, box2) im2.save('d:\\pic4.bmp') im.close() im2.close() 15.4 结合 GUI 编程知识,编写一个程序,创建一个窗口并在上面放置两个按钮,分别 为“开始播放”和“暂停播放” ,将本章 15.3 节中的音乐播放程序进行封装。 答: import wx import os import pygame import random import time import threading class wxGUI(wx.App): def OnInit(self): frame = wx.Frame(parent=None, title='MP3Player', size=(250,150), pos=(350,350)) panel = wx.Panel(frame, -1) self.buttonOK = wx.Button(panel, -1, 'Play', pos=(30,60)) self.Bind(wx.EVT_BUTTON, self.OnButtonOK, self.buttonOK) self.buttonOK.Enabled = True self.buttonCancel = wx.Button(panel, -1, 'Stop', pos=(120,60)) self.Bind(wx.EVT_BUTTON, self.OnButtonCancel, self.buttonCancel) self.buttonCancel.Enabled = False frame.Show() return True def OnExit(self): try: self.playing = False pygame.mixer.music.stop() finally: pass def play(self): folder = r'h:\music' musics = [folder+'\\'+music for music in os.listdir(folder) if music.endswith('.mp3')] total = len(musics) pygame.mixer.init() while self.playing: if not pygame.mixer.music.get_busy(): nextMusic = random.choice(musics) pygame.mixer.music.load(nextMusic) pygame.mixer.music.play(1) print 'playing....',nextMusic else: time.sleep(1) def OnButtonOK(self, event): self.playing = True # create a new thread to play music t = threading.Thread(target=self.play) t.start() self.buttonOK.Enabled = False self.buttonCancel.Enabled = True def OnButtonCancel(self, event): self.playing = False pygame.mixer.music.stop() self.buttonOK.Enabled = True self.buttonCancel.Enabled = False app = wxGUI() app.MainLoop()15.5 运行本章 15.4 中的代码并查看运行结果。 答:略。 第 16 章 逆向工程与软件分析16.1 下载 PE 文件规范 8.3 版本,并尝试了解 PE 文件基本结构。 答:略。 16.2 下载并安装 IDA Pro 与 Immunity Debugger,并简单了解 PE 文件反汇编和调试步 骤。 答:略。 16.3 安装并配置 IDAPython 插件,然后运行本章 16.2.1 小节的 Python 代码。 答:略。 16.4 在 Immunity Debugger 调试器中运行本章 16.2.2 小节中的代码。 答:略。 16.5 叙述软件调试断点的概念、作用及其分类。 答: 断点是最常用的软件调试技术之一,其基本思想是在某一个位置设置一个“陷阱” ,当 CPU 执行到这个位置的时候停止被调试的程序并中断到调试器中,让调试者进行分析和调 试,调试者分析结束后,可以让被调试程序恢复执行。通过设置断点可以暂停程序执行,并 可以观察和记录指令信息、变量值、堆栈参数和内存数据,还可以深入了解和把握程序执行 的内部原理和详细过程,断点对于软件调试具有重要的意义和作用。 断点可以分为软件断点、硬件断点和内存断点三大类。 1)软件断点 软件断点是一个单字节指令(INT 3,字节码为 0xCC) ,可以在程序中设置多个软件断 点,使得程序执行到该处时能够暂停执行,并将控制权转移给调试器的断点处理函数。 当调试器被告知在目标地址设置一个断点,它首先读取目标地址的第一个字节的操作 码,然后保存起来,同时把地址存储在内部的中断列表中。接着,调试器把一个字节操作码 “0xCC” 写入刚才的地址。当 CPU 执行到“0xCC”操作码的时候就会触发一个 “INT 3” 中断事件,此时调试器就能捕捉到这个事件。调试器继续判断这个发生中断事件的地址(通 过指令指针寄存器 EIP)是不是自己先前设置断点的地址。如果在调试器内部的断点列表中 找到了这个地址, 就将设置断点前存储起来的操作码写回到目标地址, 这样进程被调试器恢 复后就能正常的执行。 2)硬件断点 硬件断点通过调试寄存器实现,设置在 CPU 级别上,当需要调试某个指定区域而又无 法修改该区域时,硬件断点非常有用。 一个 CPU 一般会有 8 个调试寄存器(DR0 寄存器到 DR7 寄存器) ,用于管理硬件断 点。其中调试寄存器 DR0 到调试寄存器 DR3 存储硬件断点地址,同一时间内最多只能设置 4 个硬件断点;DR4 和 DR5 保留,DR6 是状态寄存器,说明被断点触发的调试事件的类型; DR7 本质上是一个硬件断点的开关寄存器,同时也存储了断点的不同类型。通过在 DR7 寄 存器里设置不同标志,能够创建以下几种断点:当特定的地址上有指令执行的时候中断、当 特定的地址上有数据写入的时候、当特定的地址上有数据读或者写但不执行的时候。 硬件断点使用“INT 1”实现,该中断负责硬件中断和步进事件。步进是指根据预定的 流程一条一条地执行指令, 每执行完一条指令后暂停下来, 从而可以精确地观察关键代码并 监视寄存器和内存数据的变化。在 CPU 每次执行代码之前,都会先确认当前将要执行代码 的地址是否是硬件断点的地址, 同时也要确认是否有代码要访问被设置了硬件断点的内存区 域。如果任何储存在 DR0-DR3 中的地址所指向的区域被访问了,就会触发 “INT 1”中断, 同时暂停 CPU;如果不是中断地址则 CPU 执行该行代码,到下一行代码时,CPU 继续重复 上面的过程。 3)内存断点 内存断点是通过修改内存中指定块或页的访问权限来实现的。 通过将指定内存块或页的 访问权限属性设置为受保护的,则任何不符合访问权限约束的操作都将失败,并抛出异常, 导致 CPU 暂停执行,使得调试器可以查看当前执行状态。 一般来说,每个内存块或页的访问权限都由三种不同的访问权限组成:是否可执行、是 否可读、是否可写。每个操作系统都提供了用来查询和修改内存页访问权限的函数,在 Windows 操作系统中可以使用 VirtualProtect()函数来修改主调进程虚拟地址空间中已提交页 面的保护属性, 使用 VirtualProtectEx()函数可以修改其他进程虚拟地址空间页面的保护属性。 16.6 运行本章 16.4 节中的代码并查看运行结果。 答:略。 第 17 章 科学计算与可视化17.1 运行本章所有代码并查看运行结果。 答:略。 17.2 使用 Python 内置函数 dir()查看 scipy 模块中的对象与方法,并使用 Python 内置函 数 help()查看其使用说明。 答:略。
请设计程序和相应的数据结构, 使小王能记录新学的英文单词和其中文翻译,并能很...python类 15页 免费 可爱的python习题答案 42页 免费 python 快速入门 8页 免费...Python100经典练习题 #!/usr/bin/env python #coding: utf-8 ''' 【程序 ...程序分析:谭浩强的书中答案有问题。 2.程序源代码: ''' def inp(numbers):...Python语言程序设计(美-梁勇)第5章习题解答_计算机软件及应用_IT/计算机_专业资料。Python语言程序设计第5章 循环 第5章 循环 5.1 分析下面的代码。 在 A、 ...Python语言程序设计(美-梁勇)第4章选择习题解答_计算机软件及应用_IT/计算机_专业资料。第4章 选择 第4章 选择 4.1 列举六种比较运算符。 答:&,&,==,!=,...python核心编程第二版第2章习题答案_教育学_高等教育_教育专区。python核心编程第二版第2章习题答案 2-1.变量,print 和字符串格式化操作符。启动交互式解释器,给...Python语言程序设计(美-梁勇)第7章习题解答_计算机软件及应用_IT/计算机_专业资料。Python语言程序设计 第7章 对象和类 7.1 描述对象和它的类定义之间的关系。 ...程序设计基础习题及答案_IT认证_资格考试/认证_教育专区。《程序设计基础》习题参考答案【习题 1 基本概念】一、简答题(在课本中寻找答案,略) 1.1 C 程序的...Python语言程序设计(美-梁勇)第4章习题解答(英文)_计算机软件及应用_IT/计算机_专业资料。Python语言程序设计第4章 选择 Chapter 4 Selections 1. 2. 3. 4. ...Python语言程序设计(美-梁勇)第6章习题解答(英文)_计算机软件及应用_IT/计算机_专业资料。Python语言程序设计( 第6章 函数 6.1 使用函数的好处是什么? 答:至少...Python语言程序设计(美-梁勇)第6章习题解答(英文)_计算机软件及应用_IT/计算机_专业资料。Python语言程序设计,第6章,函数, Chapter 6 Functions 1. 2. 3. 4....
All rights reserved Powered by
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 文本文档编程 的文章

 

随机推荐