对于编程零基础,第一个语言是 Python 的人有什么建议

Python019

对于编程零基础,第一个语言是 Python 的人有什么建议,第1张

比较巧的是我的情况与你相当,因此我的经验应该对你有所帮助。

先说说我的情况。我是没有任何编程经验的,之前一直从事的是产品设计相关岗位,而且我英语水平实在一般,所以总的来说我比你底子还要低,另外,我27岁(年轻点应该学的更快,也更有精力)。

再说说我目前的情况。目前我已经能利用Python基于Flask框架写一个CMS网站(内容管理系统),这肯定包括MySQL、前端的一些工作了,而且可以去把网站部署到VPS上(基本的服务器操作、Python环境配置、Nginx相关配置)。

目前我正在利用闲暇时间编写自己一直想做的网站,之前是那个经典笑话:我有一个想法,就差一个程序员了。

我不打算告诉你具体该看什么,做什么,我觉得我没资格当你老师。但我可以把我的经历告诉你,你可以参考,拿走对你有用的部分。无论如何,希望帮到你,希望多一个热爱Python的人。

我的学习之路大致是这样的,供你参考:

我是15年4月份正式开始学习Python语言的,入门读物是一本书《父与子编程》。当中关于客户端(GUI)的操作,浅尝辄止。

关于第1点,我需要进一步强调:因为我目标非常明确,利用Python进行Web编程,通俗的讲,我要自己写个网站。所以凡事和写网站不相干的实践我通通跳过或稍微尝试做下。我到现在还认为这样的学习方式是正确的,因为Python能做的事情非常多,覆盖各种领域。在了解Python基本的语法之后,进行不同领域的实践又要学习很多不同的东西(不同的包的用法和相关知识),所以,我非常建议你在学习Python之前明确掉你学Python的最终目的是什么?然后集中精力去学习与目的相符的知识点。比如你学习Python和我一样是做网站,那么爬虫、数据统计、数学处理、客户端软件编程、设计游戏等这些事情一律先跳过不深入;如果你学习Python是为了做数据分析,那么像做网站的实践、Web框架这些应该先跳过。其实道理很简单,精力和时间有限,因此集中去攻克和目的相关的内容,不容易分散精力,学习也很快。我深以为那些建议新手做这做那,去Github去做那个很多小实践的项目是错误的,至少对你我这样的人不合适,我试过的。

之后,入门进阶读物还是一本书,就是《Learning Python》(俗称“老鼠书”)。这本书很厚,而且还有一部分高级操作是电子版的。这都不重要。你只要读好这本书「纸质版」包含的内容即可。这本书有中文版的,翻译质量上乘,这是我之前说反对@解灵运那个观点的原因。至少我英语这么渣的看起来不吃力,而且这本书有编程基础的看不上的,你去亚马逊看这本书的差评就知道了,不管人家怎么说,这本书很棒。

在看《Learning Python》的同时,我会随手根据书上学到的东西编写对应的实践看看代码的运行效果。这时我遇到一些问题:怎么让电脑可以写Python代码?用什么写Python代码好?

第一个问题我先想到Python的官网是否有安装包,结果当然是有。虽然英语渣,但软件下多了,还是知道跑到downloads页面去找的,安装包安装很方便,和装一般软件没什么两样。(现在觉得这是比Ruby做得好的地方)。

第二个问题,求助了万能的知乎(搜一下问题就好),看到多数人推荐Pycharm,自己就下载用了,开始没感觉特别(没用其他的所以没对比),之后觉得难用(英语渣导致),最后觉得超-级-爽(熟悉后)。然后问搞技术的同事后,了解到其实这家出的其他语言编辑器也非常棒。

解决了上述两个问题后,眼下就是巩固知识多学多看的事情了。

学习完部分《Learning Python》后(见备注),我对 Python基本的基础语法已经了解,但很容易忘,因此进阶学习是看网络教程,这里尤其推荐廖雪峰的教程。网络教程包含更多的基础实践,没书里那么细,因而「温故而知新」的效果很好。

看完廖雪峰的教程后,我基本语法已经没问题。但类似@装饰器这样的高阶应用我无法理解,更不知道具体用场,虽然教程讲的因果我理解,而且感觉是这么用,但例子终究是个例子,没具体用上还是不明白「究竟的用场?」。很多高阶应用知识的问题在这个阶段产生,我都似懂非懂。我最后的处理办法是:将这些问题先放在了一边。

之前讲过,我目的非常明确:做网站。所以基本语法掌握后,我跃跃欲试,又是万能的知乎,给我了下一步的方向,但也带给了我更多的困扰。

在学习完廖雪峰的教程后,我知道我下一步是了解Python的更多周边信息,了解如何利用Python去写网站的,了解编程学习的进一步应该学些什么。

在知乎关注Python和一些编程话题后,知道知乎有「三大软狗:温、赵、轮」,还有一个「萧井陌」,这四个人是程序界在知乎的有名人物,这其中我感觉萧井陌接触Python多一些,其次是轮子哥。按照萧井陌在某一问题下的答复(他说把他答案全看一遍再说),我就老老实实的把萧井陌的答案全看了一个遍,之后又同样的做法看了轮子哥的。

完成第12点后,如果说具体的收货,我讲不出很多,但是看完他们的答案后,感觉认识层次有提升,而且不小,关于这点真的「只可意会不可言传」,你试试就知道了。

在学习第二本书的时候,我就知道Python有版本之争,但在知乎搜索有关问题看更多后,我发现这个争论还不小。我倒没那么纠结,果断的上Python3.x,可能我是搞产品的,不喜欢陈而不新的东西。这之后我所有的实践,包括现在编写网站,全部基于3.x。当然这绝对不是说2.x就不应该去了解,只是3.x是主要的。

悲剧的事情来了。因为在知乎看得太多,我陷入了「Python还是Ruby」的深深纠结当中。这和我目的是WEB方向有关。如果题主学习Python不是做网站,不会遇到这个问题。

为了解决第15点的问题,我的做法是买了Ruby的经典入门书,结果看到30多页的时候,突然充满恶心和厌恶,直接甩书。

这之后进一步了解到WEB框架,知道Python的几个主力WEB框架。知道Flask,了解这些框架的设计理念之后,我选择了Flask,就跟我学习Python一样,我认同他们的设计理念。

进一步,我进阶学习还是一本书《Flask Web开发》,通过这本书,我开始尝试编写网站。然而我发现书上的知识是远远不够的。并且,书开始涉及一些高阶语法应用,比如@装饰器,这时,在第9点放下的东西我开始重拾。

在学习《Flask Web开发》的过程中,我几乎是边回头看廖雪峰的教程,边GG(谷歌搜索)过日子。这之中几乎每天都会被一个问题挡住,然后每天又解决一个问题。这种感觉很棒,感觉每天都有成就感的活着。

在《Flask Web开发》看到一大半的时候,我发现光有Python相关的知识已经不够用,我不知道MySQL怎么用,不知道ORM为何物,不知道HTTP协议的具体细节。总而言之,深感知识的荒芜。

我暂时放下《Flask Web开发》,开始学习上面谈到的这些东西的相关知识。方式以GG为主,后来知道程序员有专门的问答网站,在国内这个网站是segmentfault,通过这个网站也学习到上述的不少相关知识。关于MySQL看了一本书,这本是现在买不到了,这里我就不提了,应该有更好的,你自己搜一下(MySQL的书是我2年前买的,当时是因为要考试,看了一点点就放在那,之后全忘记了)。

在补充了相关知识后,《Flask Web开发》绝大部分都看得懂了。我开始动手编写我想做的网站,一直到现在。

一直都会遇到问题,但都是零碎的知识点,我哪里不懂GG哪里,目前没遇到GG之后还学不会的。

《Flask Web开发》看完后,开始看《Python核心编程(第2版)》,这本书有些问题(后面会谈到),不过很受用,因为本身是教科书的形式,知识脉络比较规矩和全面。

目前《Python核心编程(第2版)》看到P417,然后边看边写网站。偶尔还会参考《Flask Web开发》,多数情况下看各种官方文档了,比如Flask的。哦,忘记说了,我很早就知道各种程序总有作者编写的文档的,国内会有一些人热心翻译。我总能通过GG找到这些资料。这些资料是非常一手的好东西,但是没前面的基础工作一样看不懂。

越来越喜欢Python,喜爱编程,看见程序员就想和他们交朋友,觉得他们是一群很棒的人!

mac 网页抓取工具:celery,腾讯码农,伪全栈工程师。

以celery为例来说明:

Celery介绍

celery(芹菜)是一个异步任务队列/基于分布式消息传递的作业队列。

它侧重于实时操作,但对调度支持也很好。

celery用于生产系统每天处理数以百万计的任务。

celery是用Python编写的,但该协议可以在任何语言实现。它也可以用其他语言通过webhooks实现。

目前已知有php/ruby/nodejs的实现

安装Celery

#安装celery $ pip install celery #安装时区的模块,不然会有时间慢8小时的问题 $ pip install pytz

创建一个简单“任务”(Task)

在这个教程里,我们将创建一个简单的“任务”(Task) —— 把两个数加起来。通常,我们在 Python 的模块中定义“任务”。

按照惯例,我们将调用模块 file:tasks.py,看起来会像这个样子:

file:tasks.py

from celery.task import task @task def add(x, y): return x + y

此时, @task 装饰器实际上创建了一个继承自 :class:~celery.task.base.Task 的“类”(class)。除非需要修改“任务类”的缺省行为,否则我们推荐只通过装饰器定义“任务”(这是我们推崇的最佳实践)。

seealso: 关于创建任务和任务类的完整文档可以在 ../userguide/tasks 中找到。

配置

Celery 使用一个配置模块来进行配置。这个模块缺省北命名为 :file:celeryconfig.py。

为了能被 import,这个配置模块要么存在于当前目录,要么包含在 Python 路径中。

同时,你可以通过使用环境变量 CELERY_CONFIG_MODULE 来随意修改这个配置文件的名字。

现在来让我们创建配置文件 celeryconfig.py.

配置如何连接 broker(例子中我们使用 RabbitMQ): BROKER_URL = "amqp:''guest:guest@localhost :5672''"

定义用于存储元数据(metadata)和返回值(return values)的后端: CELERY_RESULT_BACKEND = "amqp"

AMQP 后端缺省是非持久化的,你只能取一次结果(一条消息)。

可以阅读 :ref:conf-result-backend 了解可以使用的后端清单和相关参数。

最后,我们列出 worker 需要 import 的模块,包括你的任务。

我们只有一个刚开始添加的任务模块 :file:tasks.py::

CELERY_IMPORTS = ("tasks", )

这就行了。

你还有更多的选项可以使用,例如:你期望使用多少个进程来并行处理(:setting:CELERY_CONCURRENCY 设置),或者使用持久化的结果保存后端。可以阅读 :ref:configuration 查看更多的选项。

note:

你可以也使用 $ celery -A tasks worker --loglevel=info

运行 worker 服务器

为了方便测试,我们将在前台运行 worker 服务器,这样我们就能在终端上看到 celery 上发生的事情:

$ celeryd --loglevel=INFO

在生产环境中,也许你希望将 worker 在后台以守护进程的方式运行。如果你希望这么做,你可以利用平台或者类似于 supervisord_ (查阅 :ref:daemonizing 以获得更多信息) 的工具来实现。

可以通过下列命令行获得完整的命令参数清单:

$ celeryd --help

supervisord: [[http://supervisord.org]]

执行任务(task)

我们通过调用 class 类的 ~celery.task.base.Task.delay 方法执行任务。

~celery.task.base.Task.apply_async 方法一个非常方便的方法,通过这个方法我们可以充分控制控制任务执行的参数(参见 :ref:guide-executing)。

>>>from tasks import add >>>add.delay(4, 4) <AsyncResult: 889143a6-39a2-4e52-837b-d80d33efb22d>

此时,任务已经被发送到了消息 broker。直到有 worker 服务器取走并执行了这个任务,否则 Broker 将一直保存这个消息。

现在就可以使用任务返回类 ~celery.result.AsyncResult 来查看 worker 的日志,看看到底发生了什么。如果配置了一个结果存储类 ~celery.result.AsyncResult 来保存任务状态,任务执行完毕可获得返回值;任务执行失败则可获得异常/回调等信息。