[可爱的Python].一书习题答案.pdf_第1页
[可爱的Python].一书习题答案.pdf_第2页
[可爱的Python].一书习题答案.pdf_第3页
[可爱的Python].一书习题答案.pdf_第4页
[可爱的Python].一书习题答案.pdf_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CDays-51.计算今年是闰年嘛判断闰年条件满足年份模400为0或者模4为0但模100不为0.源代码1#coding:utf-82cdays-5-rcise-1.py判断今年是否是闰年3note:使用了importtime模块逻辑分支字串格式化等456importtime#导入time模块7thisyear=time.localtime()0#获取当前年份8ifthisyear%400=0orthisyear%4=0andthisyear%1000:#判断闰年条件满足模400为0或者模4为0但模100不为09printthisyear%sisaleapyear%thisyear10else:11printthisyear%sisnotaleapyear%thisyear运行截屏2.利用python作为科学计算器。熟悉Python中的常用运算符,并分别求出表达式1234+78-1326、(12(34+78)-132)6、(8640)5的值。并利用math模块进行数学计算,分别求出14523的余数,0.5的sin和cos值(注意sin和cos中参数是弧度制表示)提醒:可通过importmathhelp(math)查看math帮助.源代码1#coding:utf-82cdays-5-rcise-2.py求表达式的值3note:基本表达式运算格式化输出math模块4see:math模块使用可参考http:libmodule-math.html567x=1234+78-1326#表达式计算8y=(12(34+78)-132)69z=(8640)51011print1234+78-1326=%d%x12print(12(34+78)-132)6=%d%y13print(8640)5=%f%z1415importmath#导入数学计算模块1617a=math.fmod(14523)#求余函式18b=math.sin(0.5)#正弦函式19c=math.cos(0.5)#余弦函式2021print14523的余数=%d%a22printsin(0.5)=%f%b23printcos(0.5)=%f%c运行截屏status校对lizzie完成度100%Contents页码,118(W)w20113203.找出0100之间的所有素数。源代码1#coding:utf-82cdays-5-rcise-3.py求0100之间的所有素数3note:for循环列表类型4see:math模块使用可参考http:libmodule-math.html567frommathimportsqrt89N=10010#基本的方法11result1=12fornuminrange(2N):13f=True14forsnuinrange(2int(sqrt(num)+1):15ifnum%snu=0:16f=False17break18iff:19result1.append(num)20printresult12122#更好的方法23result2=pforpinrange(2N)if0notinp%dfordinrange(2int(sqrt(p)+1)24printresult2运行截屏页码,218(W)w2011320CDays-41.os模块中还有哪些功能可以使用-提示使用dir()和help()os模块中还有很多功能,主要的有以下些:os.erroros.pathos.popenos.stat_resultos.sysos.system等等等详细可参见dir(os)和Python帮助文档help(os)2.open()还有哪些模式可以使用open()有以下几种模式:r:以只读方式打开已存在文件,若文件不存在则抛出异常。此方式是默认方式U或者rU:Python惯例构造了通用换行支持提供U模式以文本方式打开一个文件但是行可能随时结束:Unix的结束符规定为n苹果系统则为r还有Windows规定为rn所有这些规定在Python程序中统一为n.w:以可写方式打开存在或者不存在的文件,若文件不存在则先新建该文件,若文件存在则覆盖该文件a:用于追加,对unix系统而言所有的内容都将追加到文件末尾而不管指针的当前位置如何b:以二进制方式打开。打开一个二进制文件必须用该模式。增加b模式是用来兼容系统对当二进制和文本文件的处理不同r+w+和a+以更新方式打开文件(注意w+覆盖文件)3.尝试for.in.循环可以对哪些数据类型进行操作for.in循环对于任何序列(列表,元组,字符串)都适用。但从广义说来可以使用任何种类的由任何对象组成的序列4.格式化声明还有哪些格式可以进行约定格式化申明详细:http:libtypesseq-strings.html(精巧地址:http:bit.ly2TH7cF)dSignedintegerdecimal.iSignedintegerdecimal.oUnsignedoctal.uUnsigneddecimal.xUnsignedhexadecimal(lowercase).XUnsignedhexadecimal(uppercase).eFloatingpointexponentialat(lowercase).EFloatingpointexponentialat(uppercase).fFloatingpointdecimalat.FFloatingpointdecimalat.gFloatingpointat.Usesexponentialatifexponentisgreaterthan-4orlessthanprecisiondecimalatotherwise.GFloatingpointat.Usesexponentialatifexponentisgreaterthan-4orlessthanprecisiondecimalatotherwise.cSinglecharacter(acceptsintegerorsinglecharacterstring).rString(convertsanypythonobjectusingrepr().sString(convertsanypythonobjectusingstr().%Noargumentisconvertedresultsina%characterintheresult.5.现在的写入文件模式好嘛有改进的余地CDay-4-5.py好在哪里1#coding:utf-823importos45export=6forrootdirsfilesinos.walk(mediacdrom0):7export+=n%s%s%s%(rootdirsfiles)8open(mycd2.cdcw).write(export)页码,318(W)w2011320CDay-4-6.py又更加好在哪里1#coding:utf-823importos45export=6forrootdirsfilesinos.walk(mediacdrom0):7export.append(n%s%s%s%(rootdirsfiles)8open(mycd2.cdcw).write(.join(export)CDay-4-5.py中使用了字符串的+连接,而CDay-4-6.py中是利用join。字符串的join要比+操作效率高。因为对象的反复+,比一次性内建处理,要浪费更多的资源。6.读取文件cdays-4-test.txt内容,去除空行和注释行后,以行为单位进行排序,并将结果输出为cdays-4-result.txt。cdays-4-test.txt#somewordsSometimesinlifeYoufindaspecialfriendSomeonewhochangesyourlifejustbybeingpartofit.SomeonewhomakesyoulaughuntilyoucantstopSomeonewhomakesyoubelievethattherereallyisgoodintheworld.Someonewhoconvincesyouthattherereallyisanunlockeddoorjustwaitingforyoutoopenit.ThisisForeverFriendship.whenyouredownandtheworldseemsdarkandemptyYourforeverfriendliftsyouupinspiritsandmakesthatdarkandemptyworldsuddenlyseembrightandfull.Yourforeverfriendgetsyouthroughthehardtimesthesadtimesandtheconfusedtimes.IfyouturnandwalkawayYourforeverfriendfollowsIfyouloseyouwayYourforeverfriendguidesyouandcheersyouon.Yourforeverfriendholdsyourhandandtellsyouthateverythingisgoingtobeokay.源代码1#coding:utf-82cdays-4-rcise-6.py文件基本操作3note:文件读取写入列表排序字符串操作4see:字符串各方法可参考hekp(str)或Python在线文档http:libstring-s.html567f=open(cdays-4-test.txtr)#以读方式打开文件8result=list()9forlineinf.readlines():#依次读取每行10line=line.strip()#去掉每行头尾空白11ifnotlen(line)orline.startswith(#):#判断是否是空行或注释行12continue#是的话,跳过不处理13result.append(line)#保存14result.sort()#排序结果15printresult16open(cdays-4-result.txtw).write(%s%n.join(result)#保存入结果文件运行截屏页码,418(W)w2011320CDays-31.根据DiPy10.6.处理命令行参数(18resultright.append(left)#若有,直接添加到resultright的值列表19else:20resultright=left#没有,则新建resultright的值列表21returnresult2223if_name_=_main_:24iflen(sys.argv)=1:#判断参数个数25printusage:ntpythoncdays-3-rcise-2.pycdays-3-test.txt26else:27result=collect(open(sys.argv1r)#调用collect函式,返回结果28for(rightlefts)inresult.items():#输出结果29print%d%st=t%s%(len(lefts)rightlefts)运行截屏3.八皇后问题。在88的棋盘上,放置8个皇后,使得任两个皇后不在同行同列同正负对角线上。源代码1#coding:utf-82cdays-3-rcise-3.py3note:使用全局变量和函式的递归调用456globalcol#定义一些全局变量7globalrow8globalpos_diag9globalnag_diag10globalcount1112defoutput():13输出一种有效结果1415globalcount16printrow17count+=11819defdo_queen(i):20生成所有正确解21parami:皇后的数目2223forjinrange(08):#依次尝试07位置24ifcolj=1andpos_diagi-j+7=1andnag_diagi+j=1:#若该行,正对角线,负对角线上都没有皇后,则放入i皇后25rowi=j26colj=0#调整各个列表状态27pos_diagi-j+7=028nag_diagi+j=029ro=PyCDC0.5使用说明:15dir目录名#指定保存和搜索目录,默认是cdc16walk文件名#指定光盘信息文件名,使用.cdc17find关键词#遍历搜索目录中所有.cdc文件,输出含有关键词的行18#查询19EOF#退出系统,也可以使用Crtl+D(Unix)|Ctrl+Z(DosWindows)202122defhelp_EOF(self):23print退出程序Quitstheprogram24defdo_EOF(selfline):页码,718(W)w201132025sys.exit()2627defhelp_walk(self):28print扫描光盘内容walkcdandexportinto.cdc29defdo_walk(selffilename):30iffilename=:filename=raw_(输入cdc文件名:)31print扫描光盘内容保存到:%s%filename32cdWalker(self.CDROMself.CDDIR+filename)3334defhelp_dir(self):35print指定保存搜索目录36defdo_dir(selfpathname):37ifpathname=:pathname=raw_(输入指定保存搜索目录:)38self.CDDIR=pathname39print指定保存搜索目录:%s默认是:%s%(pathnameself.CDDIR)4041defhelp_find(self):42print搜索关键词43defdo_find(selfkeyword):44ifkeyword=:keyword=raw_(输入搜索关键字:)45print搜索关键词:%s%keyword46cdcGrep(self.CDDIRkeyword)4748if_name_=_main_:#thiswaythemodulecanbe49cdc=PyCDC()#importedbyotherprogramsaswell50cdc.loop()2.编写一个类,实现简单的栈。数据的操作按照先进后出(FILO)的顺序。主要成员函式为put(item),实现数据item插入栈中;get(),实现从栈中取一个数据。源代码1#coding:utf-82cdays-2-rcise-2.py自定义栈3note:类和对象的使用456classMyStack(object):7MyStack8自定义栈,主要操作有put()get()andisEmpty()910def_init_(selfmax):1112初始栈头指针和清空栈13parammax:指定栈的最大长度1415self.head=-116self.stack=list()17self.max=max18foriinrange(self.max):19self.stack.append(0)2021defput(selfitem):2223将item压入栈中24paramitem:所要入栈的项2526ifself.head=self.max:#判断当前栈是否满了27returnPutError:TheStackisOverflow!#提示栈溢出28else:29self.head+=1#不满,则将item入栈,调整栈顶指针30self.stackself.head=item31printPut%sSuccess%item3233defget(self):3435获得当前栈顶item36return:栈顶item3738ifself.headt%s%(fs)运行截屏2.利用ConfigParser,将上述题目中产生的结果按照cdays+1-my.ini格式存储到文件cdays+1-result.txt中。cdays+1-my.ini内容为:Numberfilesize=somefilesizefilename=somefilename源代码1#coding:utf-82cdays+1-rcise-2.py3note:利用ConfigParser解析ini格式4see:文档参见http:2.4.1ConfigParser.html其他例子http:librarybookconfigparser-example-1.py5author:Ushengyan6version:$Id$78importos9importsys10fromConfigParserimportRawConfigParser1112definiTT(size_file):13按照.ini的格式,存储size_file1415cfg=RawConfigParser()页码,1218(W)w201132016printsize_file17index=118for(sf)insize_file:19cfg.add_section(%d%index)#增加一个section20cfg.set(%d%indexFilenamef)#在该section设置Filename及其值21cfg.set(%d%indexFileSizes)#在该section设置FileSize及其值22index+=12324cfg.write(open(cdays+1-result.txtw)2526defgtt(path):27获取给定路径中文件大小最大的三个28parampath:指定路径29return返回一个list,每项为(sizefilename)3031all_file=32forrootdirsfilesinos.walk(path):#遍历path33foronefileinfiles:34fname=os.path.join(rootonefile)#获得当前处理文件的完整名字35fsize=os.stat(fname).st_size#获得当前处理文件大小36ifall_file.has_key(fsize):#按照文件大小存储37all_filefsize.append(fname)38else:39all_filefsize=fname40fsize_key=all_file.keys()#得到所有的文件大小41fsize_key.sort()#排序,从小到大42result=43foriin-1-2-3:#依次取最大的三个44forjinall_filefsize_keyi:#保存45result.append(fsize_keyij)46returnresult:3#返回前三个4748if_name_=_main_:49iflen(sys.argv)=1:50printusage:ntpythoncdays+1-rcise-2.pypath51else:52abs_path=os.path.abspath(sys.argv1)53ifnotos.path.isdir(abs_path):54print%sisnotexist%abs_path55else:56#fromcdays+1-rcise-1importget_top_threeasgtt57iniTT(gtt(abs_path)运行结果CDays21.如果在Karrigell实例中,不复制cdctools.py到webapps目录中,也可以令index.ks引用到?页码,1318(W)w2011320不复制cdctools.py到webapp目录中,也可以令index.ks引用到,可以通过以下方式:修改Python的环境变量PYTHONPATH,把cdctools.py的所在目录路径加入在程序里动态的修改sys.path1#-coding:utf-8-23importsys45#cdctools.py的路径添加到sys.path6sys.path.append(homeshengyanworkspaceobpCDayscdays2)7fromcdctoolsimport8.2.经过本章Karrigell的初步学习,实现一个简易的web留言系统。主要利用Karrigell_Quick实现提交留言并显示出来。步骤:1.下载karrigell,解压后,根据默认设置直接就可以运行了,但一般修改conf下Karrigell.ini中的port=8081,表示使用端口8081,保存2.将msg拷贝至webapps,并在index.pih中增加链接Message3.编辑msg中的index.ks,完成所需功能1#-coding:utf-8-23importossys4importpickle#神奇的序列化模块5fromHTMLTagsimport#Karrigell提供页面输出支持模块6fromKarrigell_QuickimportKarrigell_QuickasKQF78def_htmhead(title):9默认页面头声明10note:为了复用,特别的组织成独立函式根据Karrigell非页面访问约定,函式名称前加_11paramtitle:页面标题信息12return:标准的HTML代码1314htm=1516%s17%title18returnhtm19#默认页面尾声明20htmfoot=21designby:lizzie22poweredby:Python+23KARRIGELL2.4.024252627defindex(args):28默认主29note:使用简单的表单链接操作来完成原有功能的界面化30paramargs:数组化的不定参数31return:标准的HTML页面3233print_htmhead(LeaveMessages)34p=KQF(fm_messagePOSTindexMessage)35p.addHtmNode(textynameNamesize:20maxlength:20)36p.addTextArea(Words1090)37p.addGroup(btn_btn)38p.display()3940if0=len(QUERY):41pass42else:43ifinQUERYbtn_:44yname=QUERYyname45ywords=QUERYWords46if0=len(ywords):47printH3(pleasesaysomething!)48else:49if0=len(yname):50yname=somebody51try:52msg=pickle.load(open(message.dump)53except:54msg=55msg.append(ynameywords)56index=len(msg)-157whileindex=0:58printH5(msgindex0+says:)59printP(-+msgindex1)60index-=161pickle.dump(msgopen(message.dumpw)62else:63pass64printhtmfoot4.cd至karrigell所在目录,输入pythonKarrigell.py运行后,在浏览器地址栏中输入localhost:8081就可以看到页面,点击Message链接即可到达。运行截屏页码,1418(W)w20113203.思考,本日提出的,搜索结果积累想法,如何实现?如何在搜索时可以快速确认以前曾经搜索过相同的关键词,直接输出原先的搜索成果,不用真正打开CD信息文件来匹配?步骤:可以把之前搜索历史记录下来,这样就可以在下次查询某个关键词时,先查找这里的信息,若能够找到则直接可以返回结果,没有的话,再按照以前的方法遍历搜索,同时更新这个新关键词的信息。1、修改cdctools.py中的cdcGrep函式,增加查找,更新历史记录文件,具体可参见代码。2、命令行中测试。第一次搜索关键词EVA时,出现结果为:z.MCollection.29.cdc:mfj-00.cdc:MCollec.39.cdc:z.Animation.00.cdc:L:mAnimiGainaxEVAalbumESPrnz.MFC.pop.02.cdc:这里的有效搜索信息就会增加到history_search.dump文件中。当再次搜索该词时,出现:z.Animation.00.cdc:L:mAnimiGainaxEVAalbumESPrn,因为导出格式一致,所以页面上无须修改。源码:1#-coding:utf-8-23HISTORY_SEARCH=.history_search.dump4defcdcGrep(cdcpathkeyword):5光盘信息文本关键词搜索函式6note:使用最简单的内置字串匹配处理来判定是否有关键词包含7paramcdcpath:包含.cdc文件的目录运行前得在_main_中修订成你当前的cdc数据存放点8paramkeyword:搜索的关键词9return:组织匹配好的信息到字典中导出成searched.dump文件10todo:可结合搜索引擎进行模糊搜索!1112expDict=13printcdcpath14try:15h_search=pickle.load(open(HISTORY_SEARCH)1617ifh_search.has_key(keyword):#如果已有该关键字,则直接使用历史记录中的,导出格式不变。18for(cl)inh_searchkeyword:19ifexpDict.has_key(c):20expDictc.append(l)21else:22expDictc=l23pickle.dump(expDictopen(searched.dumpw)24return25except:26h_search=2728filelist=os.listdir(cdcpath)#搜索目录中的文件29forcdcinfilelist:#循环文件列表30if.cdcincdc:31cdcfile=open(cdcpath+cdc)#拼合文件路径,并打开文件32expDictcdc=33forlineincdcfile.readlines():#读取文件每一行,并循环34ifkeywordinline:#判定是否有关键词在行中35#printline#打印输出36expDictcdc.append(line)37ifh_search.has_key(keyword):#保存keyword对应的结果,格式为keyword:(cdcline)38h_searchkeyword.append(cdcline)39else:40h_searchkeyword=(cdcline)41#printexpDict42pickle.dump(expDictopen(searched.dumpw)页码,1518(W)w201132043pickle.dump(h_searchopen(HISTORY_SEARCHw)CDays31.熟悉线程相关知识后,利用Lock和RLock实现线程间的简单同步,使得10个线程对同一共享变量进行递增操作,使用加锁机制保证变量结果的正确。源代码1#coding:utf-82cdays+3-rcise-1.py使用Thread和RLock实现简单线程同步3note:ThreadRLock(http:librlock-objects.html)4see:可参考2cdays+3-rcise-2.py使用Thread和Queue保持多线程间同步3see:Queue(http:Queue.html)4author:Ushengyan5version:$Id$67fromthreadingimportThread8importQueue9importtime1011class(Thread):12输入线程:从标准输入中读一个string,然后把该string加入到queue1314def_init_(selfthreadname):15Thread._init_(selfname=threadname)16defrun(self):17some_string=raw_(pleasesomethingforthread%s:%self.getName()#输入一个字符串18globalqueue19queue.put(self.getName()some_string)#加入到队列20#time.sleep(5)#延时一段时间2122classOutput(Thread):23输出线程:从queue中得到一个string,并将它输出到屏幕2425def_init_(selfthreadname):26Thread._init_(selfname=threadname)27defrun(self):28globalqueue29(iThreadsomething)=queue.get()#从queue中读取30printThr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论