貨來了,濃縮了我學習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教程_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的過程總結及推薦教程。其中學習目標為該過程推薦理解、實現的內容;擴展知識為該學習階段涉及的更復雜應用,不需要在當前階段理解、實現。
在學習一門編程語言之前,我們首先要了解它是什么,我們為什么要學它而不是學習其他的編程語言。雖然這個在短期內對學習沒什么影響,但是長期來看對學習還是挺有指導意義的,另外遇到程序猿也可以多點話題。
廖雪峰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開發環境安裝
首先,我們理解一些最基本的東西,包括如下內容:輸入和輸出、變量、數據類型、運算符。如果有其他編程語言的基礎,其實只需要了解一下輸入和輸出的函數即可。
在學習的過程中,您可以嘗試實現以下練習:
(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
接下來,我們需要了解控制程序基本運行流程的方法(就是把高中學的程序框圖在Python中實現出來),主要包括條件判斷和循環。
在學習的過程中,您可以嘗試實現以下兩個練習:
首先推薦完整講述程序流程的教程:
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
在掌握了基本語法和基本程序流程后,其實已經基本上可以實現出大部分想要實現的內容了,但是此時的程序會包含很多重復;而函數就是用來精簡程序,提高程序可讀性的有效方法。在這個階段,我們需要掌握定義函數、調用函數、函數參數,并對遞歸函數的使用方法略作了解。
在學習的過程中,您可以嘗試實現以下練習:
(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)定義及調用模塊
菜鳥教程:模塊(“深入模塊”之前的部分)
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
以下常用模塊不需要了解它們所有的具體功能,但需要知道一些常用功能可以通過什么模塊實現,在使用時再具體學習對應模塊的用法。
7.面對對象
因為我個人在學Python前主要是用Java,而Java是完全面對對象的語言,所以我在學Python的過程中沒有理解對象的過程。我只能推薦幾份教程,但是否適合于初學者理解對象并不能確定。
廖雪峰Python教程:面對對象編程
https://www.liaoxuefeng.com/wiki/1016959663602400/1017495723838528
菜鳥教程:面對對象
https://www.runoob.com/python3/python3-class.html
作者:長行 (Python系列教程:A001)
- 最近因工作需要學習python
- 學習資料:
- 菜鳥Python3教程https://www.runoob.com/python3/python3-tutorial.html
- 廖雪峰Python博客https://www.liaoxuefeng.com/wiki/1016959663602400/
- 以菜鳥為主,廖雪峰補充
- 學習耗時:先花3天左右將菜鳥教程從頭到尾過一遍
- 了解基本環境、語法、庫
- 了解教程的目錄章節結構,知道需要的知識去哪一章查詢
- 動手實踐:
- 對于有編程經驗來說python上手還是非常簡單的
- 但技術細節是過眼煙云
- 最好的辦法是使用他寫一個小系統,持續迭代,后續只需查閱之前用法即可
- 本文的后面部分就是使用Flask框架來搭建、部署一個簡單web應用
- 官方文檔https://dormousehole.readthedocs.io/en/latest/index.html
- Flask為python語言的輕量級web框架
- Flask vs Django
- Django大而全
- Flask更偏向提供輕量級api服務
# 切換python虛擬環境為pyspark
conda activate pyspark
# 安裝Flask
pip install Flask
# 檢查Flask版本
>>> import flask
>>> flask.__version__
'2.1.2'
# 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運行
# 切換到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官方文檔: 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
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:
*請認真填寫需求信息,我們會在24小時內與您取得聯系。