整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

自学一个月pyhon找到工作,半年成为多个平台关注破

自学一个月pyhon找到工作,半年成为多个平台关注破万的小作者

货来了,浓缩了我学习python的所有学习经历,从中获取到的经验分享给你,如果你看了没用,那让我打你一拳。


大学

高中的我,考了三次高考才勉强考上一个二本大学一本数学专业,你没听错,三次;就像俞敏洪和马云一样,我也算和两位大佬有共同点了。

由于这段经历,在大学几年时间,都还时常梦见自己又回到高中,经历高六,然后直接半夜被吓醒大一的时候,学习过一个学期的c语言,我相信大部分人都学过,期末考试过后就基本没有再用过。大二参加过数学建模竞赛,得过一些小奖,但基本没什么卵用。参加过数学建模竞赛的小伙伴应该都知道,主流使用SPSS、lingo等傻瓜式软件,对编程基本没屌用,matlab好一点,但是由于matlab封装性很高,并且价格不菲,也就渐渐放弃了

到大三开始,基本就属于混的阶段,每天与床伴平行,经常旷课,没事就打游戏、泡妞、唱k、打望、反正没务过正业。

那段时间还沉迷于王者农药,超级喜欢玩李白,还贼菜那种。

我的英语四级连续考了7次,最高分403分。菜到这种程度,我自己都怀疑自己智商是不是有问题。这种英语水平做一个程序员都困难,很多资料、外国论坛事看不懂的。

虽然程序员不需要多高的英语水平,但是,好的英语阅读能力会真的会大大开阔你的眼界,提高你的职业上限,这也是我工作了一年后才渐渐明白的,悔啊!!!要是我能回到大一,一定会对那个无知的SB一巴掌,然后告诫他,"一定要好好学英语"。不过在这几年大学日子,我到还没有挂过科,唯一挂的就是入学考试,对,就是那个一进校门就要背的规章制度,我真的是哔了哈士奇了。

由于我喜欢数学,数学基础不差,很多数学课程随便学两下,就算一学期没上过几次课,考试都是高分通过。

哈哈,这也是我大学唯一值得自豪的事了,证明我还不是一无是处,完完全全混吃等死。这样浑浑噩噩过了一年多,到了大四上半年,班上成绩好的同学,保研的保研,考研的也考完了,就在等着好消息。

而我呢,其实也参加了考研,但是,最后一门考试快结束的时候,我的耳边响起了一首《凉凉》的钟声。直到毕业,我都没看一眼考研成绩。



实习

大概在毕业那一年的四月份初,我找到了一份实习工作,公司很小,一共就10个人左右,主要基于android做游戏开发。

那个老板人特别好,对我也是非常有耐心,手把手教我计算机的知识。尽管像他这么有耐心的老板,依然被我的蠢折服了,他给我说命令行,我一脸呆萌的问,命令行是啥东西;还有,我连windows的文件结构,文件目录都搞不太清楚。

实习期间,我并没有做有关游戏的工作,而是学习python、学习机器学习的有关理论。主要原因是老板要求我学这个,他也想蹭蹭AI的热度,想转行做人工智能相关的东西。尽管当他给我说深度学习的时候,我连这是个什么鬼都不知道。

在那里我待了一个半月的时间,完全自学了python基础、tensorflow、自学了机器学习的一些理论,手推了反向传播、支持向量机、决策树、卷积神经网络等算法。也在github上找了一些开源项目,学习一下别人的代码。

五月中旬我回到学校写毕业论文,也就那样,网上抄些东西修修改改,剩下的就是浪了。直到7月初毕业答辩结束,滚出了学校。

我是一直想到一线城市去的,没办法,由于学编程没多久,学得不精,也没能力、更没有勇气义无反顾的走出去。要知道,向我这种普通大学的数学本科毕业是很尴尬的,当老师吧,只能去农村,去企业吧,只会些理论知识,啥都干不了;去考公务员吧,我又不喜欢那种一眼能望到头的生活。没办法,只能回到我实习的公司。

在公司待了十多天时间,每天都在想着怎样去广州,去那边找一份工作,但是对未来的恐惧让我迟迟不敢行动。直到7月23号上午,我发小来了一个电话:

发小:问你个事,我室友要辞职了,没人跟我一起合租,你要不要来?

我:嗯。。。。。。 我考虑一下,明天给你答复

发小:要得,你想好了给我说

当天,我的心情异常激动,但又极度担忧。但我知道,这样拖下去,我就永远待在这里了。

下午我编了一份简历,对,就是编的,然后就在前程无忧上投了大概有一百多份,反正广撒网嘛。没想到,陆陆续续就有好几家公司给我打电话,叫我去广州面试。这一下,我有了底气,心里想着,好几个面试,也许会有一个中吧。第二天上午就给我发小打电话说我马上来广州,下午就给老板辞职了。辞职后,回家待了一天,然后就坐飞机飞到了广州。


求职

到广州,我面试了大约有8家公司,没有人要,我记得有一个hr语重心长的给我说了这样一句话:“你的基础不太好,但是你还年轻,还有很多时间去学习,报个培训班、考个在职研究生也可以,加油,小伙子”

当时心都凉了大半截,不过,这个hr给我的鼓励让我至今都记得这句话,不过,我没接受他的建议去报一个培训班,依然不停的投简历,面试。终于,找到了一家公司。面试过程大致是这样的:

刚到公司,hr给我了一套面试题,我记得一共有20多道题,而我,只做了两道选择题,还是那种逻辑稍微复杂点的if判断题。时间到了,hr看了我的试卷,没说啥,就开始问我的经历我讲了数学建模的经历,实习的经历,虽然我的编程能力不高,但数学基础还算不错,和hr聊的还比较愉快。然后,hr最后给我说了这样一句话:

“你这个试卷不能给人事看到,看到肯定就没戏了”

他把我试卷大卸八块后扔进了垃圾桶。就这样,我进了现在的公司,做有关机器学习的项目,比如人脸识别、智能客服、语音识别等。至今已经一年多了。


现在

目前我依然在这个公司,可能今年就会辞职了。从去年九月份开始,我经营自己的公众号,不到半年时间公号关注量破万破万,知乎关注量破万,头条关注刚刚入驻,一天时间关注量破千,成为了一个自媒体小作者,写写文章,偶尔接点小广告赚点零花钱,虽然不多,但已经非常开心了。




总结:

上面说了一大堆,看似和问题无关,其实是有很大的关系:

1、如果你是非科班毕业想要转行编程,看了我的经历你一定很有信心与动力,高考三次、常年逃课、混吃等死的我都能,你一样能。

2、如果你完全零基础,又不想去培训,怕被割韭菜,那你可以参考一下我的经历。

3、如果你本身有一些数据结构、数学理论、或编程语言的基础,你想学好编程,那你更应该有自信,因为你已经和那些非科班的人不在一个起跑线了,你只需要不断地努力,坚持坚持再坚持,就行了。

4、面试的时候,技术不一定需要非常非常好,特别是刚毕业的大学生,你只要有闪光点,能让hr感受到,那还是很有希望的。


怎么自学python

现在是真正的干货开始了我实习的时候,python完全零基础,我看的第一个入门资料是一个视频教程,我觉得非常不错,分享给大家

Python教程_600集Python从入门到精通教程

网址:https://www.bilibili.com/video/av14184325from=search&seid=12319528533837151178


我开始学python的时候,看过很多入门书籍,比如《菜鸟教程》、《本办法学python》、《python编程从入门到实践》,但是没有一本是真正看完了的,基本都只看了五分之一不到。为什么呢,主要有两点

1、里面的有些东西讲的并不基础,比如我从来没学过类,看到类那一章完全处于懵逼状态,于是放弃了

2、一本书太多了,如果哪个时候你忙其他事忘了,回头来学发现,前面的忘得差不多了

所以,看这类型python编程书对新手不太友好,尽管它说是入门书籍。

这个视频一共六百集,别看这么多,其实花不了多少时间,每一集也就5、6分钟,很容易坚持看下去,就算你吃饭、排队付钱、等公交、甚至拉个屎都能看一集。这样一集一集,不断形成正向反馈,你学的越来越有自信,越有自信越想学,你想想这是多么快乐的事情。并且这个老师讲课风格很幽默,听着会很轻松、也很基础。

一次性别看太多,一次看两三集,每天多看几次,定期上机练手就行了。相信我,我是这样从零做到的,你也一定行。还有一点必须说明,这个视频的前两百集是linux基础,你有兴趣可以学,也可以不学,如果是完全的新手,建议你别看,并不影响后面的学习。


关于搜索引擎

真的,放弃百度吧,赶快用google,我遇到过太多次百度上找出一堆无关紧要的废话答案,而在google第一个答案就是我想要的情况。好的搜索引擎,会大大提升你学习的效率,尤其是作为一个程序员。

百度这种东西,只适合拿来搜索八卦新闻,不适合搜索学术、知识。

当然拉,知乎也是一个找优质资源的途径,比如你现在看到我的回答。

这里我再推荐一下其他的视频资料,也是非常好的,可以搭配看

1、[小甲鱼]零基础入门学习Python

网址:https://www.bilibili.com/video/av4050443?from=search&seid=3592529169870904984

2、【python教程】数据分析——numpy、pandas、matplotlib

网址:https://www.bilibili.com/video/av57023791?from=search&seid=3592529169870904984


还要着重提醒一下大家,学到一定阶段过后,一定要注意看官方文档,百度搜到的很多知识真的很垃圾,这种时候在百度上花费太多时间简直是暴殄天物,贴上官方文档地址:

https://www.python.org/

官方文档永远是你最坚实的后盾,这上面包含了python的一切


如果你不喜欢看视频,这里有一些高质量的文档分享给你:

Vamei老师:【python快速教程】 https://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html

廖雪峰老师:【python教程】https://www.liaoxuefeng.com/wiki/897692888725344

《笨办法学 Python》:这本书绝对是最简单的学习 Python 的方法,本书的 HTML 在线版是完全免费的。http://learnpythonthehardway.org/book/

Python Weekly:每周更新,包括Python相关的文章、教程、演讲、书籍、项目、工作等。http://www.pythonweekly.com/

Python challenge:用Python编程技能解决33个谜题,闯关。http://www.pythonchallenge.com/

编程零基础应当如何开始学习 Python ? - 知乎 https://www.zhihu.com/question/20039623

Python 初学者的最佳学习资源 - Python - 伯乐在线 http://python.jobbole.com/82399/


如果你已经学完了基础,需要在特定的方向上有所提高,比如web、爬虫,那我有一些资源给你:

web项目练习

web机器人:

Python搭建的web接口聊天机器人-CSDN下载?download.csdn.net

https://download.csdn.net/download/tobacco5648/9417643

web实战:

https://github.com/michaelliao/awesome-python-webapp

博客BBS论坛系统:

Python之路【第十八篇】Django小项目简单BBS论坛部分内容知识点 - Mr.心弦 - 博客园?https://www.cnblogs.com/luotianshuai/p/5331982.html

成绩管理系统:

一个使用django开发的综合成绩管理系统 - 开源中国社区

https://link.zhihu.com/?target=https%3A//www.oschina.net/code/snippet_209440_19482

新闻系统:

python项目练习四:新闻聚合 | the5fire的技术博客?

https://www.the5fire.com/python-pro4-newsagent.html


爬虫项目练习

爬取知乎:

http://zhihu-py3.readthedocs.io/zh_CN/latest/


爬取豆瓣:

https://github.com/fanpei91/doubanspiders

爬取京东:

https://github.com/Adyzng/jd-autobuy

爬取新浪微博:

https://github.com/dataabc/weiboSpider

爬取微信:

https://github.com/CoolWell/wechat_spider


如果你在特定方向学习的过程中,发现你的python基础不牢固,需要进一步学习python,我推荐你看这本书:

https://python3-cookbook.readthedocs.io/zh_CN/latest/c01/p13_sort_list_of_dicts_by_key.html


毫不夸张的说,这是我看到的有关python进阶最好的书了,名字叫python-cookbook,简直良心作品。没有之一。上面的所有代码复制就能运行,非常方便调试。

如果你看了我的推荐还是不满足,那我这里我推荐一些其他好的博主:

Python 有哪些好的学习资料或者博客?? https://www.zhihu.com/question/34907211


你可以去看看这个答案,有比较详细的介绍。

我这里再推荐一个我非常喜欢的一个博主,文章都非常精辟:

http://blog.konghy.cn/2016/06/23/python3-new-feature/


最后


python其实真的很好学习,入门也很简单,刻苦一点,花一周时间,就算你完全是编程小白,入门也是完全没问题的。你看看我,非科班,没有经过任何培训,高考考三次才勉强上一本的人,都能学会,你也一定能。

但是,python想要学好真的不容易,需要你花大量的时间,刻苦专研,才能游刃有余


“苦心人,天不负,卧薪尝胆,三千越甲可吞吴”

与诸君共勉

程目录

当前网上优秀的Python入门类教程、网课数不胜数。我并不擅长写入门教程,凑个热闹,仅以我个人入门Python的学习过程为线索,为大家推荐各个阶段、知识点的优秀教程。

首先推荐几份优秀的入门教程:

https://www.liaoxuefeng.com/wiki/1016959663602400 廖雪峰的教程

https://docs.python.org/zh-cn/3/tutorial/ Python官方文档提供的教程(虽然不太适合入门,但是非常适合当百科全书用)

https://www.runoob.com/python3/python3-tutorial.html 菜鸟教程的Python3教程

http://c.biancheng.net/python/base/ C语言中文网的教程

下面是我个人学Python的过程总结及推荐教程。其中学习目标为该过程推荐理解、实现的内容;扩展知识为该学习阶段涉及的更复杂应用,不需要在当前阶段理解、实现。


1.Python是什么?

在学习一门编程语言之前,我们首先要了解它是什么,我们为什么要学它而不是学习其他的编程语言。虽然这个在短期内对学习没什么影响,但是长期来看对学习还是挺有指导意义的,另外遇到程序猿也可以多点话题。

廖雪峰Python教程:Python简介

https://www.liaoxuefeng.com/wiki/1016959663602400/1016959735620448

Python官方文档:课前甜点

https://docs.python.org/zh-cn/3/tutorial/appetite.html

根据我之前的“教学”体验,编程语言的环境搭建大多都对初学者并不友好,出现一些特殊异常有可能直接劝退。所以个人推荐在学习最初先不必搭建环境,可以先用线上编辑器学习(在学习第三方模块前都可以先用线上编辑器)。

Python在线编辑器:好用的Python在线编辑器推荐

Python环境搭建:Python+Pip开发环境安装

2.Python基础语法

首先,我们理解一些最基本的东西,包括如下内容:输入和输出、变量、数据类型、运算符。如果有其他编程语言的基础,其实只需要了解一下输入和输出的函数即可。

在学习的过程中,您可以尝试实现以下练习:

  • 控制台接收用户输入的两个数,并将两个数求和输出

(1)输入和输出

学习目标:实现在控制台输出“Hello World”

廖雪峰Python教程:输入和输出

https://www.liaoxuefeng.com/wiki/1016959663602400/1017032074151456

扩展知识:

print()函数的详细用法

CSDN-TCatTime的博客:Python print()函数

https://blog.csdn.net/TCatTime/article/details/83450692

菜鸟教程:输入和输出(输出格式美化)

https://www.runoob.com/python3/python3-inputoutput.html

(2)交互模式/命令行模式

学习目标:理解Python的命令行模式和交互模式之间的区别,了解两个模式的启动方法

博客园大鱼biubiu博客:命令行模式和python交互模式

https://www.cnblogs.com/zhanym/p/9984571.html

(3)变量及数据类型

学习目标:

  • 理解变量及变量的指向关系,了解变量的赋值和调用方法
  • 理解字符串、整数、浮点数、布尔值以及空值的含义

廖雪峰Python教程:数据类型和变量

https://www.liaoxuefeng.com/wiki/1016959663602400/1017063826246112

扩展知识:

①字符串变量的详细用法(建议在学习运算符后学习)

菜鸟教程:字符串

https://www.runoob.com/python3/python3-string.html

②数字变量的详细用法(建议在学习运算符后学习)

菜鸟教程:数字(Number)

https://www.runoob.com/python3/python3-number.html

(4)运算符

学习目标:理解算术运算符、比较运算符、赋值运算符、逻辑运算符、成员运算符、身份运算符以及运算符优先级顺序

菜鸟教程:运算符

https://www.runoob.com/python3/python3-basic-operators.html#ysf6

各个运算符的详细用法可以参见以下教程(逻辑运算符建议在学习条件判断之后学习):

C语言中文网:Python算术运算符

http://c.biancheng.net/view/2183.html

C语言中文网:Python赋值运算符

http://c.biancheng.net/view/2182.html

C语言中文网:Python比较运算符

http://c.biancheng.net/view/4258.html

C语言中文网:Python逻辑运算符

http://c.biancheng.net/view/2186.html

(5)列表 list / 元组 tuple / 集合 set / 字典 dict

学习目标:列表、元组、集合、字典的定义、访问、修改、删除方法以及运算符;了解其函数和方法(建议在学习函数之后学习);了解其截取和拼接(建议在学习切片器之后学习)

菜鸟教程:列表

https://www.runoob.com/python3/python3-list.html

菜鸟教程:元组

https://www.runoob.com/python3/python3-tuple.html

菜鸟教程:集合

https://www.runoob.com/python3/python3-set.html

菜鸟教程:字典

https://www.runoob.com/python3/python3-dictionary.html

3.基本程序流程

接下来,我们需要了解控制程序基本运行流程的方法(就是把高中学的程序框图在Python中实现出来),主要包括条件判断和循环。

在学习的过程中,您可以尝试实现以下两个练习:

  • 计算100以内所有质数
  • 计算第20位的斐波那契数列

首先推荐完整讲述程序流程的教程:

Python官方文档:其他流程控制工具(4.1-4.5)

https://docs.python.org/zh-cn/3/tutorial/controlflow.html

(1)条件判断

学习目标:掌握条件判断语句写法,建议实现推荐教程中BMI计算的练习

廖雪峰Python教程:条件判断

https://www.liaoxuefeng.com/wiki/1016959663602400/1017099478626848

(2)循环

学习目标:掌握if和while的使用方法,了解break、continue和else子句

菜鸟教程:循环语句

https://www.runoob.com/python3/python3-loop.html

练习的实现代码

菜鸟教程:获取 100 以内的质数(方法一)

https://www.runoob.com/python/python-get-prime-number.html

CSDN-chenlunju的博客:python求斐波那契数列中第n个数的值(方法一)

https://blog.csdn.net/chenlunju/article/details/85603662

4.函数

在掌握了基本语法和基本程序流程后,其实已经基本上可以实现出大部分想要实现的内容了,但是此时的程序会包含很多重复;而函数就是用来精简程序,提高程序可读性的有效方法。在这个阶段,我们需要掌握定义函数、调用函数、函数参数,并对递归函数的使用方法略作了解。

在学习的过程中,您可以尝试实现以下练习:

  • 定义一个计算第n位斐波那契数列的函数并调用它

(1)什么是函数?

首先,我们需要理解什么是函数,函数是用来干什么的。在理解计算机函数时,可以借助数学函数和Excel的函数来辅助理解。

百度知道:什么是计算机函数?(第二个回答)

https://zhidao.baidu.com/question/168286141.html

廖雪峰Python教程:函数

https://www.liaoxuefeng.com/wiki/1016959663602400/1017105145133280

(2)定义、调用函数

学习目标:熟练掌握调用Python内置函数、定义函数并调用定义的函数的方法

①调用Python内置的函数

廖雪峰Python教程:调用函数

https://www.liaoxuefeng.com/wiki/1016959663602400/1017105451316128

②定义并调用定义的函数

廖雪峰Python教程:定义函数

https://www.liaoxuefeng.com/wiki/1016959663602400/1017106984190464

Python官方文档:定义函数(4.6)

https://docs.python.org/zh-cn/3/tutorial/controlflow.html#defining-functions

(3)函数的参数

学习目标:掌握函数的普通参数(位置参数)、默认参数(a=None)、可变参数(*)、关键词参数(**)的用法,了解强制位置参数(/)的用法

廖雪峰Python教程:函数的参数

https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888

(4)递归函数

学习目标:简单了解递归函数的用法

廖雪峰Python教程:递归函数

https://www.liaoxuefeng.com/wiki/1016959663602400/1017268131039072

5.高级特性

以下高级特性除切片器以外,在现阶段只需要大致了解即可,只要在用的时候能够想起可能有一种更优解即可。这里我选择了几个我在刚入门时比较常用的特性(可以和我应用场景相关),推荐了相关教程。建议大家学习一下廖雪峰的Python教程中对于高级特性的讲解,包括高级特性和函数式编程(函数高级特性)两个部分。

(1)切片器

廖雪峰Python教程:切片器

https://www.liaoxuefeng.com/wiki/1016959663602400/1017269965565856

(2)装饰器

博客园-菩提树下的杨过的博客:python:函数的高级特性(三、装饰器)

https://www.cnblogs.com/yjmyzz/p/advanced-feature-of-python-function.html

(3)迭代

廖雪峰Python教程:迭代

https://www.liaoxuefeng.com/wiki/1016959663602400/1017316949097888

(4)列表生成式

博客园-上海悠游的博客:列表生成式

https://www.cnblogs.com/yoyoketang/p/9274362.html

(5)偏函数

廖雪峰Python教程:偏函数

https://www.liaoxuefeng.com/wiki/1016959663602400/1017454145929440

博客园-菩提树下的杨过的博客:python:函数的高级特性(四、偏函数)

https://www.cnblogs.com/yjmyzz/p/advanced-feature-of-python-function.html

6.模块

熟悉了函数和高级特性之后,基本上就已经掌握了语言的基础,可以实现一些小功能了。但是,很多功能我们仍然无法实现,或者实现起来非常麻烦,例如读写文件、读取系统时间等等,这时候我们就需要引入Python的内置模块和一些第三方模块了。同样,当我们的程序代码越写越多的时候,我们也需要将我们的代码整理到不同的.py文件中,使用模块维护。

在学习的过程中,您可以尝试实现以下练习:

  • 生成并输出一个1-100之间的随机数 / 读取并输出当前系统时间
  • 定义一个模块并调用它

(1)定义及调用模块

菜鸟教程:模块(“深入模块”之前的部分)

https://www.runoob.com/python3/python3-module.html

(2)安装第三方模块

Python官方模块下载地址

https://pypi.python.org/pypi

阿里云镜像Python模块下载地址(在里面直接Crtl+F搜索模块名即可)

http://mirrors.aliyun.com/pypi/simple/

安装第三方模块大概分为如下过程:尝试直接用pip安装import导入的模块名;如果安装失败,百度模块名,看看是不是模块名错误或者存在其他错误;如果仍然安装失败,自行下载适合自己的安装包版本,本地安装。如果本地有多个Python环境,注意模块包安装在了哪个Python环境下。

①pip安装

博客园-miaoning的博客:python如何安装第三方模块(方法一)

https://www.cnblogs.com/miaoning/p/10910972.html

②自行下载模块包安装

博客园-枫子的博客:安装Python第三方模块

https://www.cnblogs.com/fengzzi/p/10040669.html

(3)常用模块

Python标准库

https://docs.python.org/zh-cn/3/library/index.html

Python官方文档模块文档地址

https://docs.python.org/zh-cn/3/library/{模块名}.html

以下常用模块不需要了解它们所有的具体功能,但需要知道一些常用功能可以通过什么模块实现,在使用时再具体学习对应模块的用法。

  • sys —— Python系统相关的参数和函数(Python安装路径、Python系统设置……)
  • os —— 操作系统接口(读取文件列表、读取环境变量、读取进程、读取系统换行符……)
  • random —— 伪随机数生成器(生成随机数)
  • time —— 时间相关函数(读取当前时间、读取当前时区、暂停程序……)
  • json —— Json编码器和解码器(解析Json字符串)
  • re —— 正则表达式操作(利用正则表达式匹配、替换字符串……)

7.面对对象

因为我个人在学Python前主要是用Java,而Java是完全面对对象的语言,所以我在学Python的过程中没有理解对象的过程。我只能推荐几份教程,但是否适合于初学者理解对象并不能确定。

廖雪峰Python教程:面对对象编程

https://www.liaoxuefeng.com/wiki/1016959663602400/1017495723838528

菜鸟教程:面对对象

https://www.runoob.com/python3/python3-class.html


作者:长行 (Python系列教程:A001)

ython学习思路

- 最近因工作需要学习python
- 学习资料:
  - 菜鸟Python3教程https://www.runoob.com/python3/python3-tutorial.html
  - 廖雪峰Python博客https://www.liaoxuefeng.com/wiki/1016959663602400/
  - 以菜鸟为主,廖雪峰补充
- 学习耗时:先花3天左右将菜鸟教程从头到尾过一遍
  - 了解基本环境、语法、库
  - 了解教程的目录章节结构,知道需要的知识去哪一章查询
- 动手实践:
  - 对于有编程经验来说python上手还是非常简单的
  - 但技术细节是过眼烟云
  - 最好的办法是使用他写一个小系统,持续迭代,后续只需查阅之前用法即可
  - 本文的后面部分就是使用Flask框架来搭建、部署一个简单web应用

Flask简介

- 官方文档https://dormousehole.readthedocs.io/en/latest/index.html
- Flask为python语言的轻量级web框架
- Flask vs Django
  - Django大而全
  - Flask更偏向提供轻量级api服务

Flask安装

# 切换python虚拟环境为pyspark
conda activate pyspark

# 安装Flask
pip install Flask

# 检查Flask版本
>>> import flask
>>> flask.__version__
'2.1.2'

Flask应用app.py编写

  • 创建项目目录pytools
  • pytools/app.py:
# coding:utf8

'''
本演示代码参考官方文档quickstart:
https://dormousehole.readthedocs.io/en/latest/quickstart.html
'''
from flask import make_response, redirect, session, url_for
from flask import Flask
from flask import render_template
from flask import request
from werkzeug.utils import secure_filename
from flask import abort
import os

app=Flask(__name__)

# 秘钥设置
app.secret_key=os.urandom(16)

@app.route("/")
def index():
    # 已登录的返回登陆信息
    if 'username' in session:
        # return f'Logged in as {session["username"]}'
        return f'''
        <p>Logged in as {session["username"]}</p>
        <form action="logout">
            <input type="submit" value="Logout" />
        </form>
        '''
    
    # 未登录的重定向到登录页
    return redirect(url_for('login'))

@app.route("/login", methods=['GET', 'POST'])
def login():
    if request.method=='POST':
        # 模拟登陆成功设置session
        # 然后重定向到index
        session['username']=request.form['username']
        return redirect(url_for('index'))
    else:
        # 返回登陆页
        return '''
        <form method='post'>
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
        '''

@app.route('/logout')
def logout():
    # remove the username from the session if it's there
    session.pop('username', None)
    return redirect(url_for('index'))

# 接口路径参数、查询参数、cookies使用演示
@app.route("/hello/")
@app.route("/hello/<name>")
def hello(name=None):
    print('request=', request)
    searchWord=request.args.get('key', '')
    print('searchWord=', searchWord)
    token=request.cookies.get('token', '')
    print(f'token={token}')

    # return render_template('hello.html', name=name)

    rt=render_template('hello.html', name=name)
    resp=make_response(rt)
    resp.set_cookie('token', 'the_token')
    return resp

# 文件上传演示
@app.route("/upload", methods=['GET', 'POST'])
def upload():
    file=request.files['file']
    # 获取上传文件的源文件名
    file.save(f'/home/dev/test/upload/{secure_filename(file.filename)}')
    return "success"

# 404页面演示
@app.route("/404", methods=['GET', 'POST'])
def error():
    abort(404)

# 404页面设置
@app.errorhandler(404)
def not_found(error):
    resp=make_response(render_template('404.html'), 404)
    resp.headers['X-Something']='A value'
    return resp

# Restful API演示: 返回JSON
@app.route("/me")
def me_api():
    return {
        "username": "M",
        "theme": "theme",
        "image": url_for("static", filename="style.css"),
    }

if __name__=='__main__':
    print('app.run()...')
    app.run(port=5000)

pytools/templates/hello.html:

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello, World!</h1>
{% endif %}

pytools/templates/404.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Not Found</title>
</head>
<body>
    Page Not Found !
</body>
</html>

pytools/static/style.css

 /* 无内容 */

开发环境运行Flask应用

方式一:使用flask运行

# 切换到app.py目录
cd pytools 

#设置环境变量FLASK_APP
export FLASK_APP=app #不设置默认为app

#运行
flask run

运行结果:
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000 (Press CTRL+C to quit)

注意: 此种方式不会执行__name__=='__main__'的内容

方式二:使用python运行

# 通过python -m app 或 python app.py 

# 切换到app.py目录
cd pytools

#python -m app
python app.py

运行结果:
app.run()...
 * Serving Flask app 'app' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8080 (Press CTRL+C to quit)

通过运行输出日志可见LISTEN PORT为8080

注意: 此种方式会执行__name__=='__main__'的内容

uWSGI服务器安装

uwsgi官方文档: https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html

# 切换到使用的python虚拟环境(我这里是pyspark)
conda activate pyspark

# 通过pip安装uwsgi
pip install uwsgi
# 报错找不到libpython3.9.a
#=> 是因为python觉得python.xx.a文件大家日常使用较少,所以在新版本中默认不生成python.xx.a文件

# 因此需要编译python源代码来生成libpython3.9.a文件
# 下载python3.9.12版本源代码(我本地anaconda3 python版本为3.9.12)
wget https://www.python.org/ftp/python/3.9.12/Python-3.9.12.tgz

#解压
tar xzvf Python-3.9.12.tgz  

#进入源码目录
cd Python-3.9.12 

#编译器配置安装目录
./configure --prefix=/tmp/python3.9.12 

#注意不要带上--enable-optimizations参数,会导致gcc版本问题
#./configure --prefix=/tmp/python3.9.12 --enable-optimizations

#编译
make 

#安装,会安装在之前设置的/tmp/python3.9.12目录
make install 

#进入安装目录
cd /tmp/python3.9.12 

# 复制libpython3.9.a到指定的目录(pip install uwsgi报错会提示在config-3.9-x86_64-linux-gnu目录找不到libpython3.9.a文件)
cp libpython3.9.a /export/server/anaconda3/envs/pyspark/lib/python3.9/config-3.9-x86_64-linux-gnu/

# 重新执行uwsgi安装
pip install uwsgi
#继续报错: collect2: error: ld returned 1 exit status
#类似问题是gcc或依赖库版本不兼容导致
#查询资料后给出解决办法是使用conda来安装uwsgi
conda install uwsgi
#使用conda安装还是失败,查询资料后还是依赖的库或版本不兼容导致
#给出解决办法是设置conda的channel(类似maven仓库源)
#然后更新conda
#然后重新安装
#conda channel具体可参考https://www.jianshu.com/p/eba58694537b

#设置channel为conda-forge
conda config --add channels conda-forge

#查看当前channels
conda config --get channels

# 安装conda
conda install conda

# 更新conda
conda update conda

# 重新安装uwsgi
conda install uwsgi
安装成功

#查看uwsgi版本
uwsgi --version
2.0.20

#查看uwsgi对应python版本
uwsgi --python-version
3.9.12

创建uwsgi应用配置文件config.ini

pytools/config.ini

#在项目根目录(pytools)创建配置文件config.ini

[uwsgi]
master=true

#python代码热更新
py-autoreload=1

#uwsgi启动时,所使用的地址和端口(这个是http协议的)
http=0.0.0.0:8000

#指向网站目录
chdir=/home/dev/test/pyspark/pytools

#python 启动程序文件
wsgi-file=app.py

#python 程序内用以启动的application 变量名
callable=app

#处理器数
processes=4

#线程数
threads=2

uid=dev
gid=dev

# uwsgi的进程名称前缀
procname-prefix-spaced=etd 

# 退出uwsgi是否清理中间文件,包含pid、sock和status文件
vacuum=true 

# socket文件,配置nginx时候使用
# socket=%(chdir)/uwsgi/uwsgi.sock
# status文件,可以查看uwsgi的运行状态
#stats=%(chdir)/uwsgi/uwsgi.status 
# pid文件,通过该文件可以控制uwsgi的重启和停止
pidfile=%(chdir)/uwsgi/uwsgi.pid 
# 日志文件,通过该文件查看uwsgi的日志
daemonize=%(chdir)/uwsgi/uwsgi.log 

生产运行

#进入项目根目录
cd pytools

#创建uwsgi目录
mkdir uwsgi

#启动
uwsgi config.ini 
[uWSGI] getting INI configuration from config.ini

#查看进程
ps -ef|grep etd
dev       9388 27859  0 21:05 ?        00:00:02 etd uWSGI worker 1
dev       9389 27859  0 21:05 ?        00:00:02 etd uWSGI worker 2
dev       9392 27859  0 21:05 ?        00:00:02 etd uWSGI worker 3
dev       9393 27859  0 21:05 ?        00:00:02 etd uWSGI worker 4
dev       9394 27859  0 21:05 ?        00:00:00 etd uWSGI http 1
root     20149 11597  0 21:47 pts/5    00:00:00 grep --color=auto etd
dev      27859     1  0 20:14 ?        00:00:11 etd uWSGI master

uwsgi --ini uwsgi.ini # 启动
uwsgi --reload uwsgi.pid # 重启
uwsgi --stop uwsgi.pid # 关闭

访问

#### 访问
浏览器访问 http://ip:8000/返回登录页面



后续就可以在此基础上继续试验python了...

上一张Flask: