Python新语言新平台-经典入门教程课件_第1页
Python新语言新平台-经典入门教程课件_第2页
Python新语言新平台-经典入门教程课件_第3页
Python新语言新平台-经典入门教程课件_第4页
Python新语言新平台-经典入门教程课件_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

Python——新语言,新平台Python——新语言,新平台1大纲起源特性用途不足如何学习大纲起源2起源作者:GuidoVanRossum(GvR)/~guido/名字的读法“仁慈的终身独裁者”

BenevolentDictatorForLife

他持续关注Python的开发进程,指导支持 Python开源社区的活动,并在必要的时刻做出决定。

目前在

Google

工作起源作者:GuidoVanRossum(GvR)3得名“1989年12月,我在寻找一门“课余”编程项目来打发圣诞节前后的时间。我的办公室会关门,但我有一台家用电脑,而且没有太多其它东西。我决定为当时我正构思的一个新的脚本语言写一个解释器,它是ABC语言的后代,对UNIX/C程序员会有吸引力。作为一个略微有些无关想法的人,和一个蒙提·派森(MontyPython)的飞行马戏团的狂热爱好者,我选择了Python作为项目的标题。”得名“1989年12月,我在寻找一门“课余”编程项目来打发圣4每个人都会ComputerProgrammingforEverybody1999年,Guido向DARPA

阐述Python语言的特性:

简单、直观、强大

开源,以便任何人都可以为它做贡献

代码像纯英语那样容易理解

适用于短期开发的日常任务这些想法中的一些已经成为现实。Python已经成为一门流行的编程语言,尤其是在互联网环境下。每个人都会ComputerProgrammingfor5大纲起源特性用途不足如何学习大纲起源6特性交互式命令行(Interactiveconsole)不只是脚本强大易用的标准库胶水语言(gluelanguage)收放自如(scalability)不要括号vsPerlvsRuby特性交互式命令行(Interactiveconsole)7交互式命令行(Interactiveconsole)Python可以单步直译运行。运行Python解释器进入交互式命令行的环境,你可以在提示符号>>>旁输入代码,按Enter键输出结果:>>>print("Hello,Python!")Hello,Python!有点像Shell脚本的执行方式。交互式命令行(Interactiveconsole)Pyt8不只是脚本原因是“脚本语言”泛指仅作简单编程任务的语言,如Linuxshellscript、JavaScript等,它们只能处理简单的任务而Python是面向对象编程(OOP)的,支持异常处理和类型检查Python的支持者较喜欢称它为一种高阶动态编程语言不只是脚本原因是“脚本语言”泛指仅作简单编程任务的语言,9强大易用的标准库核心库不超过10MbHtml、Xml解析:BeautifulSoup,Expat字符串处理:字典、数组切片、正则表达式re单元测试:PyUnit代码版本控制:PySVN网络访问:urllib2图形模块:Tkinter、PyTCL、WxPython串行化、多线程等扩展标准库十分容易强大易用的标准库核心库不超过10Mb10胶水语言(gluelanguage)Python经常用作将不同语言编写的程序“粘”在一起的胶水语言。Google内部的很多项目使用C++编写性能要求极高的部分,然后用Python调用相应的模块。C/C++: Boost.Python使得Python和C++的类库能互相调用(.pyc)Java: Jython是用Java实现的Python,可同时使用二者的类库.NET: IronPython是Python在.NET平台上的版本。胶水语言(gluelanguage)Python经常用作将11收放自如(scalability)Python内建的数据结构(variable,list和dict)以及对多线程分布式操作的支持,使得程序可以用相同的代码处理不同规模的数据,以及并发的用户需求。GoogleAppEngine/intl/zh-CN/appengine/收放自如(scalability)Python内建的数据结构12不要括号Python使用缩进而不是括号来进行代码段标识,减少了视觉上的混乱,并且使程序变短,从而提高了程序的可读性。不要括号Python使用缩进而不是括号来进行代码段标识,减少13vs.PerlPerl是另一种广泛使用(滥用)的动态高级语言,经常被用来与Python比较。

正则表达式的典范

催生了CGI、PHP

黑客最喜爱的语言LarryWall

Perl语言之父,语言学家/~larry/两届国际C语言混乱代码大赛(IOCCC)的冠军第一届自由软件奖得主vs.PerlPerl是另一种广泛使用(滥用)的动态高级语14程序员的三大美德懒惰:能让人尽量减少总能量支出的美德。它使你写出节省脑力、可以重用的代码;也督促你为程序写注释和文档,那样你就不用回答各种问题。所以它是程序员的第一大美德。所以有了这本书。参见下两条。不耐烦:当电脑想偷懒时你爆发的怒气.它使你写的代码能主动预测、而非被动满足用户需求,至少装作是这样。所以它是程序员的第二大美德。

参见懒惰和傲慢。傲慢:自傲到人神共愤的程度,也是一种品质,能使你编写(维护)的程序让人无可指摘。所以它是程序员的第三大美德.参见前两条。

程序员的三大美德懒惰:能让人尽量减少总能量支出的美德。它使你15观点Perl之父LarryWall:

“做一件事有很多种方法”Python资深开发者TimPeters:

“做一件事,应该有一种最直观的方法,而且最好只有一种。”Python之父GuidoVanRossum:

“做一件事情只有一种方法”观点Perl之父LarryWall:16vs.RubyRuby:比Python更年轻的动态语言完全面向对象支持正则表达式整合了多种语言的优势RubyonRails网站快速开发工具

松本行弘(“Matz”)“不要重复自己”vs.RubyRuby:比Python更年轻的动态语言17国籍?语言作者作者国籍编程风格PerlLarryWall美国随性自由PythonGuidovanRossum荷兰优雅统一Ruby松本行弘(“Matz”)日本兼容并包国籍?语言作者作者国籍编程风格PerlLarryWall美18大纲起源特性用途不足如何学习大纲起源19用途脚本程序大型程序的原型开发科学计算网络应用计算机图形编程用途脚本程序20知名的Python应用Zope:

一个应用程序服务器,具有内容管理、团队开发、XML、面向对象、SOAP接口等一系先进特性,开源。Gadfly:/gadfly.html

一个用Python写的面向对象关系型数据库,具有小巧、快速、可移植性好的

特点,具有大部分SQL语言特性。开源。Wallbase: Python编写的图片站点。uTorrent

: BitTorrent下载软件,主程序仅2Mb,支持ipv6地址解析。开源。Torchlight: Python编写的大型3D游戏,原Blizzard公司人员制作发行,开源。知名的Python应用Zope:21GoogleAppsEngine“GoogleAppEngine可让您在Google的基础架构上运行您的网络

应用程序。AppEngine应用程序易于构建和维护,并可根据您的访

问量和数据存储需要的增长轻松扩展。使用GoogleAppEngine,

将不再需要维护服务器:您只需上传您的应用程序,它便可立即为您的用户提供服务。” Python为GAE的数据存储区、Google帐户、网址抓取和电子邮件服务提供了丰富的PythonAPI。GAE还提供了一个称为

webapp

的简单Python网络应用程序框架,从而可以轻松开始构建应用程序。GoogleAppsEngine“GoogleApp22GAE的主要服务动态网络服务,提供对常用网络技术的完全支持持久存储空间,支持查询、分类和事务自动扩展和负载平衡用户身份验证和使用Google帐户发送电子邮件的API一套在本地模拟GAE的开发环境用于在指定时间和定期触发事件的计划任务GAE的主要服务动态网络服务,提供对常用网络技术的完全支持23两个例子“集体智慧编程”根据品味相似度进行电影推荐(第2章)家族旅行问题的最优化算法(第5章)两个例子“集体智慧编程”24根据品味相似度进行电影推荐基本思路:

从一大群人中找出与我们品味相近的一小群人,对这些人所喜爱的其他内容进行考查,并把它们组合起来创建一个经过排名的推荐列表。(协作过滤CollaborativeFiltering)步骤: 1.搜集偏好 2.寻找相似的用户 3.推荐电影

根据品味相似度进行电影推荐基本思路:25搜集偏好首先找到一种表示不同人及其偏好的电影的方法。可以使用人对几部电影的评分来刻画他们的偏好,评分从1到5,分数越高,表示某人对该电影越喜欢。如何建立这种从人到电影的对应关系?Python中有一个很简单的方法来表示这种数据结构:使用嵌套的字典。搜集偏好首先找到一种表示不同人及其偏好的电影的方法。26搜集偏好创建名为recommandations.py的数据文件:critics={'LisaRose':{'LadyintheWater':2.5,'SnakesonaPlane':3.5,'JustMyLuck':3.0,'SupermanReturns':3.5,'You,MeandDupree':2.5,'TheNightListener':3.0},'GeneSeymour':{'LadyintheWater':3.0,'SnakesonaPlane':3.5,'JustMyLuck':1.5,'SupermanReturns':5.0,'TheNightListener':3.0,'You,MeandDupree':3.5}'Toby':{'SnakesonaPlane':4.5,'You,MeandDupree':1.0,'SupermanReturns':4.0}}}搜集偏好创建名为recommandations.py的数据27搜集偏好我们可以使用交互控制台对字典的数据进行查询和修改:>>fromrecommendationsimportcritics>>critics['LisaRose']['LadyintheWater']2.5>>critics['Toby']['SnakesonaPlane']=4.5>>critics['Toby']{'SnakesonaPlane':4.5,'You,MeandDupree':1.0}搜集偏好我们可以使用交互控制台对字典的数据进行查询和修改:28寻找相似的用户收集了人们的偏好数据后,我们需要方法来计算某两个人电影品味的相似度。有两种基本的方法可以实现这个目的:欧几里得距离皮尔逊相关度寻找相似的用户收集了人们的偏好数据后,我们需要方法来计算某两29欧几里得距离评价以二维空间中的情形为例:设坐标轴为人们都评价过的两部电影,然后将参与评价的人根据他们对这两部电影的评分绘制到图上,并考察他们彼此间的距离,如图:图中的点距离越近,表明两个人的偏好越接近。推广到多维向量空间,欧几里得法可表示为:计算每一轴上两点的差值求平方,再将各轴相加,最后取平方根。欧几里得距离评价以二维空间中的情形为例:设坐标轴30欧几里得距离评价如计算Toby和LaSalle的距离:>>frommathimportsqrt>>sqrt(pow(5-4,2)+pow(4-1,2))3.1622776601683795为了给偏好接近的情况给出较大的值,可取该值的倒数,并+1避免除数为0:>>1/(1+sqrt(pow(5-4,2)+pow(4-1,2)))0.2402530733520421欧几里得距离评价如计算Toby和LaSalle的距离:31欧几里得距离评价使用这种方法构造出如下相似度函数:defsim_distance(prefs,person1,person2):#得到共同的电影si={}foriteminprefs[person1]:ifiteminprefs[person2]:si[item]=1#如果没有共同的电影则返回0iflen(si)==0:return0#计算欧几里得距离,返回相似度

Sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)foriteminprefs[person1]ifiteminprefs[person2]])return1/(1+sum_of_squares)欧几里得距离评价使用这种方法构造出如下相似度函数:32皮尔逊相关度皮尔逊相关系数是一种更复杂的方法,它通过计算两组数据与某一直线拟合的程度来判断它们的相似程度。该方法有助于克服所谓的“夸大评价”现象对结果的影响。右图中,虽然Jack对电影的评价比Lisa更为极端(更容易给出高分和低分),但这个坐标系中的点都相当靠近拟合曲线(图中虚线),可以说两人的品味较为相近。皮尔逊相关度皮尔逊相关系数是一种更复杂的方法,它通过计算两组33皮尔逊相关度使用如下函数计算皮尔逊相关度,该函数返回一个-1到1的值:defsim_pearson(prefs,p1,p2):#得到共同评价的电影si={}foriteminprefs[p1]:ifiteminprefs[p2]:si[item]=1#如果没有共同评价的电影,返回0iflen(si)==0:return0#将两人的偏好相加sum1=sum([prefs[p1][it]foritinsi])sum2=sum([prefs[p2][it]foritinsi])皮尔逊相关度使用如下函数计算皮尔逊相关度,该函数返回一个-134皮尔逊相关度#计算平方和sum1Sq=sum([pow(prefs[p1][it],2)foritinsi])sum2Sq=sum([pow(prefs[p2][it],2)foritinsi])#计算对应项的乘积和pSum=sum([prefs[p1][it]*prefs[p2][it]foritinsi])#计算皮尔逊相关度num=pSum-(sum1*sum2/n)den=sqrt((sum1Sq-pow(sum1,2)/n)*(sum2Sq-pow(sum2,2)/n))ifden==0:return0r=num/denreturnr皮尔逊相关度#计算平方和35皮尔逊相关度在交互式控制台中使用上述两种计算方法:>>>reload(recommendations)>>>recommendations.sim_distance(recommendations.critics,...'LisaRose','GeneSeymour')0.148148148148>>>recommendations.sim_pearson(recommendations.critics,...'LisaRose','GeneSeymour')0.396059017191皮尔逊相关度在交互式控制台中使用上述两种计算方法:36给评论者打分有了对两个人进行比较的函数,下面就可以找出与某人品味最接近的人了,进而,可以根据这些人的喜好来推荐电影。deftopMatches(prefs,person,n=5,similarity=sim_pearson): scores=[(similarity(prefs,person,other),other) forotherinprefsifother!=person] #对list排序,相似度最高的人排在最前 scores.sort() scores.reverse() returnscores[0:n]在交互控制台中使用该函数:>>recommendations.topMatches(recommendations.critics,'Toby',n=3)[(0.99124070716192991,'LisaRose'),(0.92447345164190486,'MickLaSalle'),(0.89340514744156474,'ClaudiaPuig')]给评论者打分有了对两个人进行比较的函数,下面就可以找出与某人37推荐电影我们固然可以选择只看那些和我们品味相近的人推荐的电影,但这样做太武断,也许某部电影大家普遍都觉得不错,而恰好与我们最相近的那个人没有看过。所以,我们需要一种对推荐人进行加权的推荐,如下表:给Toby的电影推荐表推荐电影我们固然可以选择只看那些和我们品味相近的人推荐的电影38推荐电影S.X打头的列是经过加权的电影评分。下面的代码给出了上述过程的具体实现:defgetRecommendations(prefs,person,similarity=sim_pearson): totals={} simSums={} forotherinprefs: #不和自己比 ifother==person:continue sim=similarity(prefs,person,other) #忽略小于等于0的评分 ifsim<=0:continue foriteminprefs[other]:推荐电影S.X打头的列是经过加权的电影评分。39推荐电影 #只计算我没看过的电影 ifitemnotinprefs[person]orprefs[person][item]==0: #相似度乘以得分 totals.setdefault(item,0) totals[item]+=prefs[other][item]*sim #相似度求和 simSums.setdefault(item,0) simSums[item]+=sim #对结果进行归一化 rankings=[(total/simSums[item],item)foritem,totalintotals.items()] #排序并返回结果 rankings.sort() rankings.reverse() returnrankings推荐电影 #只计算我没看过的电影40推荐电影然后就可以看结果了:>>>reload(recommendations)>>>recommendations.getRecommendations(recommendations.critics,'Toby')[(3.3477895267131013,'TheNightListener'),(2.8325499182641614,'LadyintheWater'),(2.5309807037655645,'JustMyLuck')]>>>recommendations.getRecommendations(recommendations.critics,'Toby',...similarity=recommendations.sim_distance)[(3.5002478401415877,'TheNightListener'),(2.7561242939959363,'LadyintheWater'),(2.4619884860743739,'JustMyLuck')]结果显示,人们为Toby推荐了三部电影,而且用两种相似度地算方法得到的列表是一样的。推荐电影然后就可以看结果了:41总结到此为止,我们建立了一个完整的推荐系统,它适用于任何的商品推荐以及基于相似度的数据关系挖掘。。而这一切在Python中,仅仅是建立一个涉及人、商品以及评价值的字典,然后根据某些相似度算法得出的人与人的相似度,就可以进行推荐了。总结到此为止,我们建立了一个完整的推荐系统,它适用于任何的42家族旅行问题的最优化算法问题描述: Glass一家住在美国不同的地方。他们希望在纽约相聚,在同一天从各地坐飞机到纽约,几天后再一起离开。每天有许多往返的航班,起飞时间、价格以及飞行时间都不相同。

现在需要找到一种好的日程安排,使得大家的旅行花费尽可能少、等待亲友的时间尽可能短、乘坐飞机的时间尽可能短。建立文件optimization.py,加入如下代码:people=[('Seymour','BOS'),('Franny','DAL'),('Zooey','CAK'),('Walt','MIA'),…('Buddy','ORD'),('Les','OMA')]#目的地:纽约LaGuardia机场destination='LGA'家族旅行问题的最优化算法问题描述:43问题分析首先要找到一种通用的表示日程安排方案的方法。然后,为了描述某种方案的好坏,需要定义某种函数。在优化问题中,这个函数叫做代价函数(costfunciton)。一个方案越好,它的代价函数值越小。这样找最优方案的问题转化为找代价函数值最小的方案的问题。最后设法找出具有最小代价函数值的方案,完成优化过程。问题分析首先要找到一种通用的表示日程安排方案的方法。44导入数据从网址/optimize/schedule.txt可以下载到航班数据,格式如下:LGA,MIA,20:27,23:42,169MIA,LGA,19:53,22:21,173LGA,BOS,6:39,8:09,86分别是起点、终点、起飞时间、到达时间和机票价格。将数据载入到以起止点为键、以航班详情为值的字典中:flights={}forlineinfile('schedule.txt'): origin,dest,depart,arrive,price=line.strip().split(',') flights.setdefault((origin,dest),[]) #将航班详情加入到航班字典的值中 flights[(origin,dest)].append((depart,arrive,int(price)))导入数据从网址/op45描述方案如何描述各种方案呢?一个通用的方法是使用数字列表,它使得之后描述的优化算法并不依赖于具体的问题。本例中,用数字表示某人乘坐当天的第几趟航班,0代表第一趟,1代表第二趟,以此类推。由于每个人都要选择往和返两趟班机,所以列表的总长是人数的两倍。例如:[1,4,3,2,7,3,6,3,2,4,5,3]该方案表示Seymour坐第2趟航班去纽约,坐第5趟航班回波士顿Franny坐第4趟航班去纽约,坐第3趟回达拉斯。描述方案如何描述各种方案呢?一个通用的方法是使用数字列表,46代价函数代价函数的选取是优化算法的重要环节。本例中,可以综合考虑如下因素来构造代价函数:价格:所有航班的总票价旅行时间:所有人在飞机上度过的总时间等待时间:在机场等待其他成员到达的总时间出发时间:早晨太早起飞的航班有额外的代价,因为旅行者睡眠不足汽车租用时间:如果集体租车,那么他们最好在某个时间前将车归还,否则会多付租金。代价函数代价函数的选取是优化算法的重要环节。47代价函数限于篇幅,就不给出代价函数的全部代码了,使用方法如下:>>>reload(optimization)>>>optimization.schedulecost(s)5285有了代价函数,下面就是找到具有最小函数值的方案了。在这个例子中有16个航班、每个航班都有9种可能,所有的可能数为916,约3000亿,所以穷举是不现实的。下面使用两种方法实现优化:

随机优化

爬山法代价函数限于篇幅,就不给出代价函数的全部代码了,使用方法如下48随机优化随机生成一些方案,找出其中最好的方案。defrandomoptimize(domain,costf): best=999999999 bestr=None foriinrange(1000): #随机生成一个方案 r=[random.randint(domain[i][0],domain[i][1]) foriinrange(len(domain))] #计算代价 cost=costf(r) #与当前最优方案的代价比较 ifcost<best: best=cost bestr=r returnr随机优化随机生成一些方案,找出其中最好的方案。49爬山法随机优化的不足在于,没有充分利用已有的优解。爬山法则以一个随机解开始,然后在邻近的解集中寻找更好的解,这类似于从斜坡上往下走,如图。下面的代码片段描述了如何获取已有解的邻近解:neighbors=[]forjinrange(len(domain)): #两个方向 ifsol[j]>domain[j][0]: neighbors.append(sol[0:j]+[sol[j]+1]+sol[j+1:]) ifsol[j]<domain[j][1]: neighbors.append(sol[0:j]+[sol[j]-1]+sol[j+1:])爬山法随机优化的不足在于,没有充分利用已有的优解。50爬山法爬山法虽然利用了已经找到的优解,但它很容易陷入所谓的局部最优解,而找不到全局最优解。一种改进是随机重复爬山法,即从多个随机点开始运行爬山法若干次,以此希望有一个解能逼近全局最小。此外,模拟退火算法和遗传算法也能避免陷入局部最小值。爬山法爬山法虽然利用了已经找到的51查看结果在交互控制台中输入如下代码,查看优化结果:>>>reload(optimization)>>>domain=[(0,8)]*(len(optimization.people)*2)>>>s=optimization.randomoptimize(domain,optimization.schedulecost)>>>optimization.schedulecost(s)3328>>>optimization.printschedule(s)SeymourBoston12:34-15:02$10912:08-14:05$142FrannyDallas12:19-15:25$3429:49-13:51$229ZooeyAkron9:15-12:14$24715:50-18:45$243WaltMiami15:34-18:11$32614:08-16:09$232BuddyChicago14:22-16:32$12615:04-17:23$189LesOmaha15:03-16:42$1356:19-8:13$239查看结果在交互控制台中输入如下代码,查看优化结果:52查看结果>>>s=optimization.hillclimb(domain,optimization.schedulecost)>>>optimization.schedulecost(s)3063>>>optimization.printschedule(s)SeymourBOS12:34-15:02$10910:33-12:03$74FrannyDAL10:30-14:57$29010:51-14:16$256ZooeyCAK10:53-13:36$18910:32-13:16$139WaltMIA11:28-14:40$24812:37-15:05$170BuddyORD12:44-14:17$13410:33-13:11$132LesOMA11:08-13:07$17518:25-20:34$205查看结果>>>s=optimization.hillcli53总结

在本例中,首先使用Python的列表对不同的方案进行了数学建模,然后根据一些指标建立了代价函数,最后使用两种方法实现了优化过程。在整个过程中,Python的简单易用让我们能够集中精力解决实际的问题。而无需过多关注编程本身。此外,Python的交互控制台使得编程与调试过程变得自然顺畅。总结 在本例中,首先使用Python的列表对不同的方案进行了54硬币的另一面限制Python发展的因素

缺乏预包装的解决方案

数据库访问层的局限性

文档差距

缺乏GUI和团队协作工具硬币的另一面限制Python发展的因素55限制Python发展的因素缺乏预包装的解决方案

PHP在企业软件领域赢得了辉煌的成功,主要原因就在于其广泛实用的产品门类,比如讨论板、聊天服务器和分组日历以及即时消息系统等。相比之下,Python提供的解决方案就少多了。Python语言的分发版中确实包含了一些扩展的类库,越来越多的程序员也在致力于开发等价PHP的Python工具,但是考虑到市场的时间紧迫性,而且你所面临的问题已经有现成的PHP解决方案可以对付,那么PHP自然会成为你的首选。限制Python发展的因素缺乏预包装的解决方案

温馨提示

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

评论

0/150

提交评论