首页 > 编程知识 正文

python做法,python怎么做

时间:2023-12-24 21:58:46 阅读:322072 作者:OQNR

本文目录一览:

学完Python都可以做什么

学习python主要是自学或者报班学习的方式,但不建议自学。

如果想通过学习python改行,那就需要明确一下自己的方向。因为python编程有很多方向,有网络爬虫、数据分析、Web开发、测试开发、运维开发、机器学习、人工智能、量化交易等等,各个方向都有特定的技能要求。

想学的话,当然是可以学习的。python是一门语法优美的编程语言,不仅可以作为小工具使用提升我们日常工作效率,也可以单独作为一项高新就业技能!

python可以做的事情:

软件开发:用python做软件是很多人正在从事的工作,不管是B/S软件,还是C/S软件,都能做。并且需求量还是挺大的;

数据挖掘:python可以制作出色的爬虫工具来进行数据挖掘,而在很多的网络公司中数据挖掘的岗位也不少;

游戏开发:python扩展性很好,拥有游戏开发的库,而且游戏开发绝对是暴力职业;

大数据分析:如今是大数据的时代,用python做大数据也是可以的,大数据分析工程师也是炙手可热的职位;

全栈工程师:如今程序员都在向着全栈的方向发展,而学习python更具备这方面的优势;

系统运维:python在很多linux中都支持,而且语法特点很向shell脚本,学完python做个系统运维也是很不错的。

互联网行业目前还是最热门的行业之一,学习IT技能之后足够优秀是有机会进入腾讯、阿里、网易等互联网大厂高薪就业的,发展前景非常好,普通人也可以学习。

想要系统学习,你可以考察对比一下开设有相关专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能力,能够在校期间取得大专或本科学历,中博软件学院、南京课工场、南京北大青鸟等开设相关专业的学校都是不错的,建议实地考察对比一下。

祝你学有所成,望采纳。

请点击输入图片描述

如何用Python做爬虫

1)首先你要明白爬虫怎样工作。

想象你是一只蜘蛛,现在你被放到了互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫initial pages,用$表示吧。

在人民日报的首页,你看到那个页面引向的各种链接。于是你很开心地从爬到了“国内新闻”那个页面。太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个html放到了你身上。

突然你发现, 在国内新闻这个页面上,有一个链接链回“首页”。作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊。所以,你需要用你的脑子,存下你已经看过的页面地址。这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址。如果去过,那就别去了。

好的,理论上如果所有的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页。

那么在python里怎么实现呢?

很简单

import Queue

initial_page = "初始化页"

url_queue = Queue.Queue()

seen = set()

seen.insert(initial_page)

url_queue.put(initial_page)

while(True): #一直进行直到海枯石烂

if url_queue.size()0:

current_url = url_queue.get() #拿出队例中第一个的url

store(current_url) #把这个url代表的网页存储好

for next_url in extract_urls(current_url): #提取把这个url里链向的url

if next_url not in seen:

seen.put(next_url)

url_queue.put(next_url)

else:

break

写得已经很伪代码了。

所有的爬虫的backbone都在这里,下面分析一下为什么爬虫事实上是个非常复杂的东西——搜索引擎公司通常有一整个团队来维护和开发。

2)效率

如果你直接加工一下上面的代码直接运行的话,你需要一整年才能爬下整个豆瓣的内容。更别说Google这样的搜索引擎需要爬下全网的内容了。

问题出在哪呢?需要爬的网页实在太多太多了,而上面的代码太慢太慢了。设想全网有N个网站,那么分析一下判重的复杂度就是N*log(N),因为所有网页要遍历一次,而每次判重用set的话需要log(N)的复杂度。OK,OK,我知道python的set实现是hash——不过这样还是太慢了,至少内存使用效率不高。

通常的判重做法是怎样呢?Bloom Filter. 简单讲它仍然是一种hash的方法,但是它的特点是,它可以使用固定的内存(不随url的数量而增长)以O(1)的效率判定url是否已经在set中。可惜天下没有白吃的午餐,它的唯一问题在于,如果这个url不在set中,BF可以100%确定这个url没有看过。但是如果这个url在set中,它会告诉你:这个url应该已经出现过,不过我有2%的不确定性。注意这里的不确定性在你分配的内存足够大的时候,可以变得很小很少。一个简单的教程:Bloom Filters by Example

注意到这个特点,url如果被看过,那么可能以小概率重复看一看(没关系,多看看不会累死)。但是如果没被看过,一定会被看一下(这个很重要,不然我们就要漏掉一些网页了!)。 [IMPORTANT: 此段有问题,请暂时略过]

好,现在已经接近处理判重最快的方法了。另外一个瓶颈——你只有一台机器。不管你的带宽有多大,只要你的机器下载网页的速度是瓶颈的话,那么你只有加快这个速度。用一台机子不够的话——用很多台吧!当然,我们假设每台机子都已经进了最大的效率——使用多线程(python的话,多进程吧)。

3)集群化抓取

爬取豆瓣的时候,我总共用了100多台机器昼夜不停地运行了一个月。想象如果只用一台机子你就得运行100个月了...

那么,假设你现在有100台机器可以用,怎么用python实现一个分布式的爬取算法呢?

我们把这100台中的99台运算能力较小的机器叫作slave,另外一台较大的机器叫作master,那么回顾上面代码中的url_queue,如果我们能把这个queue放到这台master机器上,所有的slave都可以通过网络跟master联通,每当一个slave完成下载一个网页,就向master请求一个新的网页来抓取。而每次slave新抓到一个网页,就把这个网页上所有的链接送到master的queue里去。同样,bloom filter也放到master上,但是现在master只发送确定没有被访问过的url给slave。Bloom Filter放到master的内存里,而被访问过的url放到运行在master上的Redis里,这样保证所有操作都是O(1)。(至少平摊是O(1),Redis的访问效率见:LINSERT – Redis)

考虑如何用python实现:

在各台slave上装好scrapy,那么各台机子就变成了一台有抓取能力的slave,在master上装好Redis和rq用作分布式队列。

代码于是写成

#slave.py

current_url = request_from_master()

to_send = []

for next_url in extract_urls(current_url):

to_send.append(next_url)

store(current_url);

send_to_master(to_send)

#master.py

distributed_queue = DistributedQueue()

bf = BloomFilter()

initial_pages = ""

while(True):

if request == 'GET':

if distributed_queue.size()0:

send(distributed_queue.get())

else:

break

elif request == 'POST':

bf.put(request.url)

好的,其实你能想到,有人已经给你写好了你需要的:darkrho/scrapy-redis · GitHub

4)展望及后处理

虽然上面用很多“简单”,但是真正要实现一个商业规模可用的爬虫并不是一件容易的事。上面的代码用来爬一个整体的网站几乎没有太大的问题。

但是如果附加上你需要这些后续处理,比如

有效地存储(数据库应该怎样安排)

有效地判重(这里指网页判重,咱可不想把人民日报和抄袭它的大民日报都爬一遍)

有效地信息抽取(比如怎么样抽取出网页上所有的地址抽取出来,“朝阳区奋进路中华道”),搜索引擎通常不需要存储所有的信息,比如图片我存来干嘛...

及时更新(预测这个网页多久会更新一次)

如你所想,这里每一个点都可以供很多研究者十数年的研究。虽然如此,

“路漫漫其修远兮,吾将上下而求索”。

所以,不要问怎么入门,直接上路就好了:)

Python有哪些技术上的优点?比其他语言好在哪儿?

Python有哪些技术上的优点

1. 面向对象和函数式

从根本上讲,Python是一种面向对象的语言。它的类模型支持多态、运算符重载和多重继承等高级概念,并且以Python特有的简洁的语法和类型为背景,OOP十分易于使用。事实上,即使你不懂这些术语,仍会发现学习Python比学习其他OOP语言要容易得多。

除了作为一种强大的代码组织和重用手段以外,Python的OOP本质使它成为其他面向对象系统语言的理想脚本工具。例如,通过适当的粘接代码,Python程序可以对C++、Java和C#的类进行子类的定制。

OOP只是Python的一个选择而已,这一点非常重要。即使不能立马成为一个面向对象高手,但你同样可以继续深入学习。就像C++一样,Python既支持面向对象编程也支持面向过程编程的模式。如果条件允许,其面向对象的工具可以立即派上用场。这对策略开发模式十分有用,该模式常用于软件开发的设计阶段。

除了最初的过程式(语句为基础)和面向对象(类为基础)的编程范式,Python在最近几年内置了对函数式编程的支持——一个多数情况下包括生成器、推导、闭包、映射、装饰器、匿名lambda函数和第一类函数对象的集合。这是对其本身OOP工具的补充和替代。

2. 免费

Python的使用和分发是完全免费的。就像其他的开源软件一样,例如,Tcl、Perl、Linux和Apache。你可以从Internet上免费获得Python的源代码。你可以不受限制地复制Python,或将其嵌入你的系统或者随产品一起发布。实际上,如果你愿意的话,甚至可以销售它的源代码。

但请别误会:“免费”并不代表“没有支持”。恰恰相反,Python的在线社区对用户需求的响应和商业软件一样快。而且,由于Python完全开放源代码,提高了开发者的实力,并产生了一个很大的专家团队。

尽管研究或改变一种程序语言的实现并不是对每一个人来说都那么有趣,但是当你知道如果需要的话可以做到这些,该是多么的令人欣慰。你不需要去依赖商业厂商的智慧,因为最终的文档和终极的净土(源码)任凭你的使用。

Python的开发是由社区驱动的,是Internet大范围的协同合作努力的结果。Python语言的改变必须遵循一套规范而有约束力的程序(称作PEP流程),并需要经过规范的测试系统进行彻底检查。正是这样才使得Python相对于其他语言和系统可以保守地持续改进。

尽管Python 2.X和Python 3.X版本之间的分裂有力并蓄意地破坏了这项传统,但通常它仍然体现在Python的这两个系列内部。

3. 可移植

Python的标准实现是由可移植的ANSI C编写的,可以在目前所有主流平台上编译和运行。例如,如今从掌上电脑(PDA)到超级计算机,随处可见 Python的运行。Python可以在下列平台上运行(这里只是部分列表):

Linux和UNIX系统

微软Windows(所有现代版本)

Mac OS(包括OS X 和经典版)

BeOS、OS/2、VMS和QNX

实时操作系统,例如VxWorks

Cray超级计算机和IBM大型机

运行Palm OS、PocketPC和Linux的PDA

运行 Symbian OS和Windows Mobile 的移动电话

游戏终端和iPod

运行谷歌安卓系统和苹果iOS系统的平板和智能手机

以及更多

除了语言解释器本身以外,Python发行时自带的标准库和模块在实现上也都尽可能地考虑到了跨平台的移植性。此外,Python程序自动编译成可移植的字节码,这些字节码在已安装兼容版本Python的平台上运行的结果都是相同的。

这些意味着Python程序的核心语言和标准库可以在Linux、Windows和其他带有Python解释器的平台上无差别地运行。大多数Python外围接口都有平台相关的扩展(例如COM支持Windows),但是核心语言和库在任何平台都一样。

就像之前我们提到的那样,Python还包含了一个叫作tkinter(Tkinter的2.X版本)的Tk GUI工具包,它可以使Python程序实现功能完整的,无须做任何修改即可在所有主流GUI桌面平台运行的用户图形界面。

4. 功能强大

从语言特性的角度来看,Python是一个混合体。它丰富的工具集使它介于传统的脚本语言(如Tcl、Scheme和Perl)和系统语言(如C、C++和Java)之间。Python提供了所有脚本语言的简单和易用性,并且具有那些在编译语言中才能找到的高级软件工程工具。

不像其他脚本语言不同,这种结合使Python在长期大型的开发项目中十分有用。下面是一些Python工具箱中的工具简介:

动态类型

Python在程序运行过程中跟踪对象的类型,不需要代码中进行关于复杂的类型和大小的声明。事实上,Python中没有类型或变量声明这种做法。因为Python代码不约束数据的类型,它往往自动地应用了一种广义上的对象。

自动内存管理

Python自动为对象分配空间,并且当对象不再使用时将自动撤销空间(“垃圾回收”),当需要时自动扩展或收缩。正如你将学到的,Python能够帮你完成底层的内存管理。

大型程序支持

为了能建立更大规模的系统,Python包含了模块、类和异常等工具。这些工具允许你把系统组织为组件,使用OOP重用并定制代码,并以一种优雅的方式处理事件和错误。前面提到的Python函数式编程工具,提供了实现相同目标的其他方法。

内置对象类型

Python提供了常用的数据结构作为语言的基本组成部分。例如,列表(list)、字典(dictionary)、字符串(string)。我们将会看到,它们灵活并易于使用。例如,内置对象可以根据需求扩展或收缩,可以任意地组织复杂的信息等。

内置工具

为了对以上对象类型进行处理,Python自带了许多强大的标准操作,包括拼接(concatenation)、分片(slice)、排序(sort)和映射(mapping)等。

库工具

为了完成更多特定的任务,Python预置了许多预编码的库工具,从正则表达式匹配到网络都支持。当你掌握了语言本身,就能在应用级的操作中使用Python的库工具。

第三方工具

由于Python是开源的,它鼓励开发者提供Python内置工具之外的预编码工具。你可以在网上找到COM、图像处理、数值编程、XML、数据库访问等许多免费的支持工具。

除了这一系列的Python工具外,Python保持了相当简洁的语法和设计。综合这一切得到的就是一个具有脚本语言所有可用性的强大编程工具。

请点击输入图片描述

5. 可混合

Python程序可以以多种方式轻易地与其他语言编写的组件“粘接”在一起。例如,Python的C语言API可以帮助Python程序灵活地调用C程序。这意味着可以根据需要给Python程序添加功能,或者在其他环境系统中使用Python。

例如,将Python与C或者C++写成的库文件混合起来,使Python成为一个前端语言和定制工具。就像之前我们所提到过的那样,这使Python成为一个很好的快速原型工具;系统可以在开发初期出于速度考虑使用Python实现,然后转移至C,根据不同时期性能的需要逐步实现系统。

6. 相对简单易用

同其他语言(如C++、Java和C#)相比,Python编程对大多数用户来讲出奇得简单。要运行Python程序,你只需简单地键入Python程序并运行就可以了。不需要其他语言(如C或C++)所必需的编译和链接等中间步骤。

Python可立即执行程序,这形成了一种交互式编程体验和不同情况下快速调整的能力,往往在修改代码后几乎能立即看到程序改变后的效果。

当然,开发周期短仅仅是Python易用性的一方面的体现。Python提供了简洁的语法和强大的内置工具。实际上,Python曾被称为“可执行的伪代码”。由于它减少了其他工具常见的复杂性,在实现相同的功能时,Python程序比采用其他流行语言编写的程序更为简单、小巧,也更灵活。

请点击输入图片描述

7. 相对简单易学

这一部分引出了本书的重点:尤其同其他广泛使用的编程语言比较时,Python语言的核心相当简单易学。实际上,如果你是一位有经验的程序员,你可以期望在几天内写出小规模的Python代码,你也许能在几个小时之内习得Python的一招一式,但是你并不能指望在如此短的时间内成为专家(忘掉市面上的那些宣传广告吧)。

当然,掌握任何像今天Python这样的充实主题都不是一件轻松事,我们将在本书的剩余部分致力于此项任务。但是为了掌握Python而进行的真正投资是非常值得的——最终你会获取几乎在每个计算机应用程序领域都适用的编程技能。此外,很多人还发现Python的学习曲线比其他的编程语言更加平缓。

这对于那些想学习语言以在工作中应用的专业人员来说是一个好消息,同样对于那些使用Python层进行定制和控制的系统的终端用户来说,也是一个好消息。如今,许多系统都依赖于这一事实:用户可以在没有或者得到很少支持的情况下就学到足够的Python知识以便当场增删他们的Python定制化代码。

此外,Python还孕育出一群不以编程为生而以编程为乐的用户,他们并不需要掌握全面的软件开发技巧。尽管Python还是有很多高级编程工具,但不论对初学者还是行家来说,Python的核心语言精髓仍是相当简单的。

8. 以Monty Python命名

好的,在讲完这么多技术方面的优势后,我想再揭露一个Python世界里面令人惊奇而保守良好的小秘密。

尽管Python的书和图标中有很多爬行动物,真相却是Python以英国喜剧组“Monty Python”命名——这是BBC 在20世纪70年代喜剧《Monty Python's Flying Circus》的制片方,也是至今仍在流行的少量包括《Monty Python and the Holy Grai》在内的大电影的制片方。Python的最初创作者是Monty Python的粉丝,这同其他许多的软件开发者一样(事实上,这两个领域存在某种对称性……)。

请点击输入图片描述

▲《Python学习手册》书封上的爬行动物

这段有趣的历史无疑增加了Python代码例子的幽默属性。例如,作为一般变量名命名传统的“foo”和“bar”在Python世界中变成了“spam”和“eggs”。而在Python中偶尔出现的“Brian”,“ni”和“shrubbery”表现得也同此类似。它甚至影响了Python的整个社区。

当然了,如果你对这部喜剧非常熟悉,就能体会这其中的笑点,但如果不熟悉则相反。你不必非得熟悉Monty Python这部剧来了解从剧中获得灵感的例子(包括你将在本书中看到的许多例子),但至少你现在知道它们的起源了。(嗨——我已经告诉你啦。)

02

Python和其他语言比较起来怎么样

最后,你也许已经知道了,人们往往将Python与Perl、Tcl和Javat等语言相比较。这部分总结这方面的一些普遍共识。

我想预先表明我个人并不喜欢通过诋毁竞争者来获胜——这在长期是行不通的,而且也不是这里的目的。此外,这并不是一场零和游戏——绝大多数的程序员在他们的职业生涯中都会使用许多语言。尽管如此,编程工具也展示出值得考虑的选择和权衡。毕竟,如果Python没有比它的竞争者提供更多的东西,那么它一开始就不会被人们使用了。

请点击输入图片描述

我们之前已经介绍过性能上的权衡,那么这里重点谈一下功能。尽管下面列举的这些语言也是值得学习和使用的有力工具,但人们通常认为Python:

比Tcl强大。Python强有力地支持“大规模编程”,使其适用于开发大型系统,它的应用程序库也更加丰富。

比Perl更具可读性。Python有着简洁的语法和简单连贯的设计,这反过来使得Python更具可读性和更易于维护,同时有助于减少程序bug。

比Java和C#更简单、更易于使用。Python是一门脚本语言,但Java和C#两者从像C++这样更加大型的OOP系统语言中继承了许多语法和复杂性。

比C++更简单、更易于使用。Python代码比等效的C++代码更加简单,长度只有其五分之一到三分之一。尽管作为脚本语言,Python有时能扮演许多不同的角色。

比C更加简单和高级。Python远离底层硬件架构从而降低了代码复杂性,拥有更好的组织结构,并比C(C++的祖先)更加友善。

比Visual Basic更强大,用途广泛,也更具备跨平台特性。Python是更加广泛使用的更丰富的语言,它的开源本质意味着它不可能被某一个公司所掌控。

比PHP更易懂并且用途更广。Python也用来构建Web站点,但是,它也应用于几乎每个计算机领域,从机器人到电影动画和游戏。

比JavaScript更强大和用途广泛。Python有一个更大的工具集,也并不是牢牢地束缚于Web开发。它也用于科学建模、仪器调试等。

比Ruby更具可读性,并更为人们所接受。Python的语法混乱更少,尤其在较复杂代码中,同时它的OOP对用户和和不太使用OOP的工程中是完全可选的。

比Lua更成熟和受到更广泛关注。Python更加庞大的特性集合和更加扩展的库支持给予其比Lua(一门和Tcl一样的嵌入式“胶水”语言)更加宽广的视野。

比SmallTalk、Lisp和Prolog更不晦涩。Python拥有这类函数式语言的动态品味,但是也拥有开发者和定制系统终端用户都可接受的传统语法。

特别是对不仅仅用于个人扫描文本文件,未来会被人们(包括你在内)读到的程序而言,很多人会发现Python比目前任何可用的脚本或编程语言都划得来。不仅如此,除非你的应用要求最尖端的性能,Python往往是C、C++和Java等系统开发语言的一个不错的替代品:Python代码能够常常实现相同的目标,却会减少很多编写、调试和维护的麻烦。

当然,本文作者从1992年就已经是Python的正式布道者了,所以尽可能接受这些意见吧(其他语言的拥护者的利益可能会受到些损失)。然而,所有这些观点的确代表了投入时间和精力来探索Python的众多开发者的一致看法。

关于作者:Mark Lutz是一位世界级的Python培训讲师。他是Python畅销书籍的作者,同时从1992年起就成为Python社区的引领者,有着30余年的软件开发经验。

本文摘编自《Python学习手册》(原书第5版),经出版方授权发布。

请点击输入图片描述

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。