了解Python
了解Python
一、Python簡介
作用
Python具有豐富和強大的庫。它常被昵稱為膠水語言,能夠把用其他語言制作的各種模塊(尤其是C/C++)很輕松地聯結在一起。常見的一種應用情形是,使用Python快速生成程序的原型(有時甚至是程序的最終界面),然后對其中[3]??有特別要求的部分,用更合適的語言改寫,比如3D游戲中的圖形渲染模塊,性能要求特別高,就可以用C/C++重寫,而后封裝為Python可以調用的擴展類庫。需要注意的是在您使用擴展類庫時可能需要考慮平臺問題,某些可能不提供跨平臺的實現。
?
由于Python語言的簡潔性、易讀性以及可擴展性,在國外用Python做科學計算的研究機構日益增多,一些知名大學已經采用Python來教授程序設計課程。例如卡耐基梅隆大學的編程基礎、麻省理工學院的計算機科學及編程導論就使用Python語言講授。眾多開源的科學計算軟件包都提供了Python的調用接口,例如著名的計算機視覺庫OpenCV、三維可視化庫VTK、醫學圖像處理庫ITK。而Python專用的科學計算擴展庫就更多了,例如如下3個十分經典的科學計算擴展庫:NumPy、SciPy和matplotlib,它們分別為Python提供了快速數組處理、數值運算以及繪圖功能。因此Python語言及其眾多的擴展庫所構成的開發環境十分適合工程技術、科研人員處理實驗數據、制作圖表,甚至開發科學計算應用程序。
說起科學計算,首先會被提到的可能是MATLAB。然而除了MATLAB的一些專業性很強的工具箱還無法替代之外,MATLAB的大部分常用功能都可以在Python世界中找到相應的擴展庫。和MATLAB相比,用Python做科學計算有如下優點:
● 首先,MATLAB是一款商用軟件,并且價格不菲。而Python完全免費,眾多開源的科學計算庫都提供了Python的調用接口。用戶可以在任何計算機上免費安裝Python及其絕大多數擴展庫。
● 其次,與MATLAB相比,Python是一門更易學、更嚴謹的程序設計語言。它能讓用戶編寫出更易讀、易維護的代碼。
● 最后,MATLAB主要專注于工程和科學計算。然而即使在計算領域,也經常會遇到文件管理、界面設計、網絡通信等各種需求。而Python有著豐富的擴展庫,可以輕易完成各種高級任務,開發者可以用Python實現完整應用程序所需的各種功能。
?
Python的作者有意的設計限制性很強的語法,使得不好的編程習慣(例如if語句的下一行不向右縮進)都不能通過編譯。其中很重要的一項就是Python的縮進規則。
一個和其他大多數語言(如C)的區別就是,一個模塊的界限,完全是由每行的首字符在這一行的位置來決定的(而C語言是用一對花括號{}來明確的定出模塊的邊界的,與字符的位置毫無關系)。這一點曾經引起過爭議。因為自從C這類的語言誕生后,語言的語法含義與字符的排列方式分離開來,曾經被認為是一種程序語言的進步。不過不可否認的是,通過強制程序員們縮進(包括if,for和函數定義等所有需要使用模塊的地方),Python確實使得程序更加清晰和美觀。
?
Python的設計哲學是“優雅”、“明確”、“簡單”。
?
Python是完全面向對象的語言。函數、模塊、數字、字符串都是對象。并且完全支持繼承、重載、派生、多繼承,有益于增強源代碼的復用性。Python支持重載運算符和動態類型。相對于Lisp這種傳統的函數式編程語言,Python對函數式設計只提供了有限的支持。有兩個標準庫(functools, itertools)提供了Haskell和Standard ML中久經考驗的函數式程序設計工具。
?
執行
編輯
Python在執行時,首先會將.py文件中的源代碼編譯成Python的byte code(字節碼),然后再由Python Virtual Machine(Python虛擬機)來執行這些編譯好的byte code。這種機制的基本思想跟Java,.NET是一致的。然而,Python Virtual Machine與Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一種更高級的Virtual Machine。這里的高級并不是通常意義上的高級,不是說Python的Virtual Machine比Java或.NET的功能更強大,而是說和Java 或.NET相比,Python的Virtual Machine距離真實機器的距離更遠。或者可以這么說,Python的Virtual Machine是一種抽象層次更高的Virtual Machine。
基于C的Python編譯出的字節碼文件,通常是.pyc格式。
除此之外,Python還可以以交互模式運行,比如主流操作系統Unix/Linux、Mac、Windows都可以直接在命令模式下直接運行Python交互環境。直接下達操作指令即可實現交互操作。
?
解釋器
編輯
Python是一門跨平臺的腳本語言,Python規定了一個Python語法規則,實現了Python語法的解釋程序就成為了Python的解釋器。
?
基本語法
編輯
Python的設計目標之一是讓代碼具備高度的可閱讀性。它設計時盡量使用其它語言經常使用的標點符號和英文單字,讓代碼看起來整潔美觀。它不像其他的靜態語言如C、Pascal那樣需要重復書寫聲明語句,也不像它們的語法那樣經常有特殊情況和意外。
縮進
Python開發者有意讓違反了縮進規則的程序不能通過編譯,以此來強制程序員養成良好的編程習慣。并且Python語言利用縮進表示語句塊的開始和退出(Off-side規則),而非使用花括號或者某種關鍵字。增加縮進表示語句塊的開始,而減少縮進則表示語句塊的退出。縮進成為了語法的一部分。例如if語句:
python3
| 1 2 3 4 | if?age<21: ????print("你不能買酒。") ????print("不過你能買口香糖。") print("這句話在if語句塊的外面。") |
根據PEP的規定,必須使用4個空格來表示每級縮進(不清楚4個空格的規定如何,在實際編寫中可以自定義空格數,但是要滿足每級縮進間空格數相等)。使用Tab字符和其它數目的空格雖然都可以編譯通過,但不符合編碼規范。支持Tab字符和其它數目的空格僅僅是為兼容很舊的的Python程序和某些有問題的編輯程序。
?
Python使用and, or, not表示邏輯運算。
is, is not用于比較兩個變量是否是同一個對象。in, not in用于判斷一個對象是否屬于另外一個對象。
?
函數
Python的函數支持遞歸、默認參數值、可變參數,但不支持函數重載。為了增強代碼的可讀性,可以在函數后書寫“文檔字符串”(Documentation Strings,或者簡稱docstrings),用于解釋函數的作用、參數的類型與意義、返回值類型與取值范圍等。可以使用內置函數help()打印出函數的使用幫助。比如:
>>> def randint(a, b):
... "Return random integer in range [a, b], including both end points."...
>>> help(randint)
Help on function randint in module __main__:
randint(a, b)
Return random integer inrange[a, b], including both end points.
?
?
?
二、Python最簡單小例子
Python程序一
使用Python創建第一個CGI程序,文件名為hello.py,文件位于/var/www/cgi-bin目錄中,內容如下,修改文件的權限為755:[5]?
| 1 2 3 4 5 6 7 8 9 10 | #!/usr/bin/env?python print("Content-type:text/html\r\n\r\n") print("<html>") print("<head>") print("") print("</head>") print("<body>") print("<h2>Hello?World!?This?is?my?first?CGI?program</h2>") print("</body>") print("</html>") |
以上程序在瀏覽器訪問顯示結果如下:
| 1 | Hello?World!?This?is?my?first?CGI?program |
這個的hello.py腳本是一個簡單的Python腳本,腳本第一的輸出內容"Content-type:text/html\r\n\r\n"發送到瀏覽器并告知瀏覽器顯示的內容類型為"text/html"。
?
用python寫一個hello world程序
1,http://www.python.org/download/?下載windows安裝包,
2,python環境變量配置?
(1)設置環境變量:我的電腦-右鍵-屬性-高級-環境變量?在Path中加入 ??
;c:\python26 (注意前面的分號和路徑)
(2)此時,還是只能通過"python *.py"運行python腳本,若希望直接運行*.py,只需再修改另一個環境變量PATHEXT:
;.PY;.PYM3,測試是否安裝成功
cmd進入命令行???輸入python –v?若是輸出版本信息,則表示安裝完畢
4,建一個hello.py
print ("hello world")5,cmd 進入命令行 找到文件路徑 hello.py
會輸出"hello world"
6,接受用戶輸入
x= input("x:") y= input("y:") print (x * y) print("我開始學習python了,要加油啊!")?
?
Python基礎01 Hello World!
作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!
?
簡單的‘Hello World!’
?
Python命令行
假設你已經安裝好了Python, 那么在Linux命令行輸入:
$python
將直接進入python。然后在命令行提示符>>>后面輸入:
>>>print('Hello World!')
可以看到,隨后在屏幕上輸出:
Hello World!print是一個常用函數,其功能就是輸出括號中得字符串。
(在Python 2.x中,print還可以是一個關鍵字,可寫成print 'Hello World!',但這在3.x中行不通?)
?
寫一段小程序
另一個使用Python的方法,是寫一個Python程序。用文本編輯器寫一個.py結尾的文件,比如說hello.py
在hello.py中寫入如下,并保存:
print('Hello World!')退出文本編輯器,然后在命令行輸入:
$python hello.py
來運行hello.py。可以看到Python隨后輸出
Hello World!?
腳本
我們還可以把Python程序hello.py改成一個可執行的腳本,直接執行:
#!/usr/bin/env python print('Hello World!')?
需要修改上面程序的權限為可執行:
chmod 755 hello.py?
然后再命令行中,輸入
./hello.py就可以直接運行了
?
總結
命令行模式: 運行Python,在命令行輸入命令并執行。
程序模式: 寫一段Python程序并運行。
?
相當于不用編譯,可以直接執行的就是腳本。
?
三、Python和c++
28原則吧 80%精力學習c++ 20精力學習一門腳本語言
主要看樓主以后方向吧 如果是網絡安全python肯定需要 如果是游戲可以先學lua
光學習語言是不行的 多看看優秀的源碼的 openresty skynet stl
對于python可以先過書 幾天搞定一個高級話題 如裝飾器 迭代器 協程 元類
學一門學累了 看看csapp 算法導論 挺好
?
目測糾結的時間都足夠學個七七八八了。
python和c++面對的領域不同,特點不同,都學了也沒壞處。
何況編程這事,重要的是思想,不是語言。
?
?
要完成一些成規模的項目,軟件架構與性能都必不可少。C++正是為此而生,在盡量不犧牲性能的情況下,提供高層次抽象所需的功能。畢竟C所缺少的命名空間、高級數據結構等,使其完成大規模項目是有一定困難的。
不過C++并不是解決該問題的唯一方案。很多其他方案并不專注于同時確保兩點,而是將目標集中于更好的軟件架構,以及可以接受的性能。Python、Lua等很多語言都是如此。而同時,對于要求性能較高的部分,或者與系統結合緊密的部分,則是交給C模塊去處理。這樣的思路對大型項目是很有利的,架構方面因為有高級語言的支持而得到了更好的抽象,更容易實現復雜的邏輯。而循環次數較多的部分則交給C去處理。尤其是引入高級語言后,可以迫使人們將傳遞的數據交給高級語言,而不是C里隨處使用全局變量。
所以,以實用的角度講,Python+C是更好的選擇。另外就是C++為了尋求性能與架構的折中而不得不引入很多概念,這些概念使得C++比C要復雜很多,同時其對架構的支持能力卻又比高級語言查一截。
總的來說,我的建議是:
1. 學Python,反正很快
2. 學好C,結合具體的系統與函數庫
3. 學Python與C結合的方法,比如Python的C模塊、Cython、Swig等多種方式
4. 學一點C++語法,畢竟還是有一定概率會用到C++的庫,但不要在那些奇怪的C++功能上浪費時間
?
?
聊一聊Python與C++的不同(一)
之前一直在學C,C++,還有一些Java,抱著興趣去選了一個Python,當我看到老師敲得代碼后,我驚嘆,Python還可以這樣,如果用C的話,不得麻煩死,而且在寫函數時沒有用大括號,靠縮進分層次,顯得特別整潔,這也是為什么我第一次實驗課代碼總出問題的原因,那我想從今天開始總結一下Python與C++的不同。
一、頭文件
學一門語言的第一步就是輸出"hello world",如果是C++得這么寫:
?
但是如果是Python的話,只需要一句print("hello world") 句尾還不用加分號,是不是有點懷疑人生,main函數呢?頭文件呢?沒有返回值嗎?統統沒有,我當時看到這個心里在想,這是真的Python嗎? 那Python為什么沒有main函數?沒有main函數程序怎么知道從哪里開始呢?我們在用Python打印helloword時拿到就沒有調用任何頭文件嗎? 其實是這樣的,我們知道PythonPython使用縮進對齊組織代碼的執行,所有沒有縮進的代碼(非函數定義和類定義),都會在載入時自動執行,這些代碼,可以認為是Python的main函數。 至于print頭文件我查清楚了再說,在C中不用頭文件也可以用printf()函數 二、注釋 這個沒啥好說的,python是#,C++為// 三、數組 在學習C++的時候經常出現數組越界的情況,比如下標是-1,系統會崩潰,但是在這里如果數組的長度為n,那么他的下標范圍[-n,n-1],就是這么神奇。?
聊一聊Python與C++的不同(二)
今天我們聊一下基本數據類型吧,
在學習c++的時候我們要記住幾種數據類型,int,float,double,long,char,double,string,bool,每次使用都要明確定義每個數據類型,這樣做是為了在內存里申請指定大小的空間。
但是在Python中就有些不同了,比如我們在使用時直接拿出來不必指定他是什么類型的
如,我們定義一個int類型的x,并賦值等于3,
C++要這么做,int x=3;
而Python則要這么做 x=3,好像在寫一條數學公式,
但是這時我們想一個問題,我們在定義這個變量時,C++為x申請了4個字節的空間,Python為x申請了多大的空間呢
我們就從淺淺的分析一下吧。
首先Python語言為動態類型,也就是說對象的類型和內存都是在運行時確定的,另外,Python還采用了Windows內核對象一樣的方式對內存進行管理,每一個對象都在維護這一個對指向該對象的引用的計數
?
這個就好比C++中的指針,定義了指針x,然后為x申請空間并賦值3.14,然后在定義一個指針,指向x,這時x和y用的同一塊內存,代碼及結果如下:
?
最后我們在了解一下python內存的垃圾回收,
1、當內存中有不再使用的部分時,垃圾收集器就會把他們清理掉。它會去檢查那些引用計數為0的對象,然后清除其在內存的空間。當然除了引用計數為0的會被清除,還有一種情況也會被垃圾收集器清掉:當兩個對象相互引用時,他們本身其他的引用已經為0了。
2、垃圾回收機制還有一個循環垃圾回收器, 確保釋放循環引用對象(a引用b, b引用a, 導致其引用計數永遠不為0)。
?
程序有兩種執行方式,解釋執行和編譯執行。PYTHON是一種腳本語言,是解釋執行的,不需要經過編譯,所以很方便快捷,且能夠很好地跨平臺,寫一些小工具小程序特別合適。
而C++則是一種需要編譯后運行語言,在特定的機器上編譯后在特定的機上運行,運行效率高,安全穩定。但編譯后的程序一般是不跨平臺的。
學習一種編程語言不能看它熱不熱。而是要看它在某個領域的作用。就像匯編,雖然現在不熱了,但是它在某些行業內還是很吃香的。PYTHON確實很強大,但在三五年內,不會作為一種主流的編程語言。至少在Windows程序開發領域內不會。
建議將C++作為主要的學習方向,將PYTHON作為一種輔助工具。當然,都能學通則更好了。
?
?
?
?
四、Python和java
對比java和python
1.難易度而言。python遠遠簡單于java。
2.開發速度。Python遠優于java
3.運行速度。java遠優于標準python,pypy和cython可以追趕java,但是兩者都沒有成熟到可以做項目的程度。
4.可用資源。java一抓一大把,python很少很少,尤其是中文資源。
5.穩定程度。python3和2不兼容,造成了一定程度上的混亂以及大批類庫失效。java由于有企業在背后支持所以穩定的多。
6.是否開源。python從開始就是完全開源的。Java由sun開發,但現在有GUN的Openjdk可用,所以不用擔心。
7.編譯還是解釋。兩者都是解釋型。
我理解,C好比手動擋車(編譯型語言),java和python(解釋型語言)好比自動檔車。跑的最快的車都是手動檔,但是對開不好的人來說,開自動檔反而更快些。
Kno有一篇文章談到選擇編程語言,“先確定你的需求”,不要由語言的簡單還是復雜去覺定。只有能夠編寫你真正認為有用的程式,才能獲得滿足感,學習才能繼續。
那么java和python分別適用于什么樣的環境呢。由sourceforge.net可以看出:
最著名,久經考驗的普通應用程序,基本都是c++寫的。例如emule,7-zip,WinSCP,FileZilla等等等。
一部分由java開發,例如最有名的OpenOffice。
python寫的很少,如Pidgin,FireBird。
開發語言(有多少個程式由此語言開發)的排行如下:
# Java46,202
# C++36,895
# PHP30,048
# C28,075
# C#13,476
# Python13,379
# JavaScript11,285
# Perl9,216
# Unix Shell3,869
# Delphi/Kylix3,548
# Visual Basic3,186
# Visual Basic .NET
很多框架和類庫也和應用軟件一樣在這個列表里,因此比較公平。
由此可以看出,java不管在GNU還是商業領域都是應用最廣的語言。C主要用于構建系統底層。c++和java用于構建中間應用層。如果資源足夠,那么會選擇c++開發,以求運行速度,否則會用java開發,以求開發速度。python在各方面都比java優秀,可謂次世代語言。可最受爭議的是它的速度,純python比java慢很多,以及背后沒有商業支持,穩定性備受詬病。目前為止,python在商業層次上,主要作為一種膠水語言,粘合其他語言(主要是c/c++)的類庫。在GNU領域,主要局限于小規模的應用和個人化應用。以及逆向工程(黑客)應用。
為什么java在服務器端被大量應用,在客戶端用的卻比較少呢。難道服務器端用到的計算量反而少么。我認為這說明對比c++,java的速度還是可以接受的。無法被接受的是JRE平臺,以及JRE平臺啟動時卡的那一會兒。我就曾經為此認為java寫就的程式性能低下。
python用戶常常拿來說嘴的一點是:python并不慢,因為python運行時調用了大量c庫,而c是很快的。反過來想想,這正反映了其膠水語言的事實,任何一種語言都可以調用c庫,這么比較有價值么?假如一個庫完全由python,那么它的運行效率...不說也罷。編程不能總是用別人的庫啊。
----
Python編程語言目前的使用中需要不斷的學習。下面我們就詳細的看看如何才能更好的進行相關知識的學習。最近我一直在看一個基于wxPython的GUI應用程序代碼,大概45.5KLOC的左右,而且這還不包括它所用到的庫(如Twisted)。
代碼是由那些對Python比較生疏的Java的開發者寫的,所以它存在很嚴重的性能問題(如三十秒的啟動時間)。在檢查代碼的時候,我發現他們寫了很多在Java中能講得通但是對Python編程語言來說去卻是很難接受的東西。并不是因為“Python比Java慢”,而是因為在Python中有更方便的方法去完成同樣的目標,甚至是在Java中不可能的事情。
所以,令人難過的事就是這些家伙事倍功半,寫的那些代碼比本應合乎用Python編程語言實現的慢很多。下面,讓我們來看一些例子:
◆Java中的靜態方法不能翻譯成Python的類方法。哦,當然,他多多少少也能產生同樣的效果,但類方法的目的實際上是做一些通常在Java中甚至都不可能的事情(如繼承一個非默認的默認函數)。Java靜態方法慣用的翻譯通常翻譯成一個模塊級的函數,而不是一個類方法或靜態方法。(并且靜態常量應該翻譯成模塊級常量.)?
這不是性能上的問題,但是一個Python編程語言程序員如果想調用Foo.someMethod,他要是被迫采用像Java中Foo.Foo.someMethod的方式去做的話,那么他就會被逼瘋的。有一點一定要注意:調用一個類方法需要一個額外的存儲空間,而調用靜態方法或函數就不需要這樣.
對了,還有就是這些Foo.Bar.Baz的屬性鏈也不是自己就能數出來的.在Java中,這些帶點的名稱是有編譯器來查找的,運行的時候并不會去考慮一共有多少.而在Python中,查找的過程是在運行時進行的,所以要包括每個點.(在Python中,要記住一點,"平鋪的結構別嵌套的要好",盡管相對于從性能方面來說,可能它更多涉及的是"可讀性"和"簡單要比復雜好".)
◆要使用switch語句嗎?Python編程語言將是一個哈希表,不是一堆if-then語句。要使用在Java中不是switch語句而且還有字符串參與了的一堆if-then語句嗎?它將仍然是一個哈希表。CPython字典是用在我們所了解的領域中認為是最佳性能之一的哈希表來實現的。你自己所寫的代碼也不會比這個再好了,除非你是Guido、Tim Peters和Raymond Hettinger的私生子,而且還是遺傳增強了的。
◆XML不是答案。它也不是一個問題。現在用正則表達式來解釋Jamie Zawinski,“一些人,當他遇到一個問題的時候,就會想‘我知道,我要用XML.’那么他們就有兩個問題了。”
相對于在Java中來說這是個不同的情況,因為比起Java代碼,XML是靈活而且有彈性的。但比起Python的代碼來,XML就是一個船錨,一個累贅。在Python中,XML是用來協同工作的,而不是你的核心功能,因為你不需要那么做。在Java中,XML可能是你的救世主,因為它讓你實現了特定領域的語言并且“不用編碼”就提高你的應用程序的適應性。在Java中,避免編碼是一個很大的優勢,因為編碼意味著重新編譯。但在Python中,通常是,寫代碼比寫XML更簡單。還有就是Python處理代碼要比處理XML快很多很多。(不僅僅是這個,你必須寫XML處理代碼,同時Python就已經為你寫好了.)
如果你是一個Java程序員,你并不能利用本能知覺來考慮你是否要在你的Python核心應用中使用XML作為一部分。如果你不是因為信息交互的原因去實現一個已經存在的XML標準或是建立某種輸入、輸出格式或者建立某種XML編輯器或處理工具,那么就不要這么做。根本不要去這么做。甚至連想都不要想。現在,丟掉那個XML模式然后把你的手解放出來吧!如果你的應用程序或者平臺要被Python編程語言開發者使用,他們只會感謝你不要在他們的工作中添加使用XML的負擔。
(這里唯一的例外是如果你的客戶(your target audience)確確實實因為某些原因而需要使用XML。就好像,他們拒絕學習Python但如果你使用XML他們就給你付錢,或者你打算給他們一個很棒的能編輯XML的GUI,還有就是這個XML的GUI是另一個人寫的,同時你得到免費使用的權利。還有一些很少見的架構上的原因需要用到XML。相信我,它們不會應用到你的程序中去的。如果有疑問,對一個資深的Python開發員解釋你的用例。或者,如果你臉皮厚而且不介意被人嘲笑的話,試試向一個Lisp程序解釋你的程序為什么要用XML!)
◆Getter和setter是惡魔。我應該說它是惡魔,是魔鬼!Python編程語言對象不是Java Bean。不要寫什么getter和setter,而是還把它們內置在“屬性”里面。它直到你能證明你需要比一個簡單訪問復雜一點的功能時才有意義,要不然,不要寫getter和setter。它們是CPU時間的浪費,更要緊的是,它們還是程序員寶貴時間的浪費。不僅僅對于寫代碼和測試的人,對于那些要閱讀和理解它們的人也是。
在Java中,你必須使用getter和setter,因為公共字段不允許你以后改變想法再去使用getter和setter。所以,在Java中你最好事先避開這些"家務雜事".在Python中,這樣做很傻,因為你可以以一個普通特性開始并可以在任何時間改變你的想法,而不用影響到這個類的任何客戶。所以不要寫getter和setter方法。
◆代碼重復在Java中通常來說就是一場不可避免的災禍,你必須經常反復地寫同一個方法而只有一點點的變化(通常是這是因為靜態類型約束)。在Python中這樣做是沒有必要的也是不值得的(除了極少數一些特定的場合需要內聯一些要求性能的函數)。如果你發現自己一遍一遍在寫同樣的代碼而且變化很少,你就需要去學一下閉包。他們實際不并是那么可怕。
- 對Python編程技巧大總結
- 簡讀靈活性的Python編程語言
- 短時間內掌握Python編程語言
- 對Python編程語言歷史說明介紹
- 有關Python編程語言進行描述
?
這就是你要做的。你寫了一個包含了函數的函數。這里內部的函數就是你要一遍遍寫的函數的模版,但是在里面加入了針對不同情況的函數要使用變量。外部的函數需要剛剛提高的那種變量作為參數,并且將內部的函數作為結果返回。然后,每次你要寫另一種略微不同的函數的時候,你只要調用這個外部的函數,并且把返回值賦給你要讓“重復”函數出現的名字。現在,如果你需要改變這個工作方式,你只需要改變一個地方:這個模版。
在我所看過的應用程序/平臺中,只有一個很微不足道的程序使用了這個技術,它去掉了數百行重負的代碼。實際上,因為開發者使用了特別的樣板文件來為這個平臺開發插件,所以這會節省很多很多第三方開發人員的代碼,同時也使那些程序員要學習的東西變得簡單了。
這只是Java->Python編程語言思維方式轉變的冰山一角而已,現在我能正確的轉變而不用去鉆研程序的細節。本質上,如果你曾經用過一段時間Java,而且對Python比較陌生,那么你不要太相信自己的本能。你的本能已經被Java調節,而不是Python。向后退一步來說,最重要的是不要再寫這么多代碼了。
為了這樣做,讓自己覺得更加需要Python。假裝好像Python是可以做任何你想做的魔棒,而你無須出一點力。問一下,“Python怎樣解決我的問題?”還有“Python語言的哪個特點和我的問題最相似?”如果對于你需要的東西其實已經有了某種固定形式,那么你絕對會感到驚訝的。事實上,這種現象實在是太普遍了,甚至即使在很有經驗的Python程序員中也會出現,以至于Python社區中給這種現象起了個名字。我們稱之為“GUIDO的時間機器”,因為在我們自己還沒有掌握它之前,通常看上去要得到我們所需要的東西好像那是唯一的方法。
所以,如果你在使用Python編程語言時候不能感到比使用Java要至少多出10倍的生產力話,你就最好做一下改動,你是不是忘記使用time machine!(chances are good that you've been forgetting to use the time machine)(同時如果你還懷念你的Java IDE,你可以這樣想:因為你寫的Python程序比他所需要的要復雜得多.)
?
?
?
?
?
五、Python用于爬蟲和數據挖掘
用Python寫簡單爬蟲
首先,要通過urllib2這個Module獲得對應的HTML源碼。
| 1 2 3 4 | import?urllib2??#調用urllib2?? url='http://www.baidu.com/s?wd=cloga'?#把等號右邊的網址賦值給url html=urllib2.urlopen(url).read()???#html隨意取名?等號后面的動作是打開源代碼頁面,并閱讀 print?html?#打印 |
通過上面這三句就可以將URL的源碼存在content變量中,其類型為字符型。
接下來是要從這堆HTML源碼中提取我們需要的內容。用Chrome查看一下對應的內容的代碼(也可以用Firefox的Firebug)。
可以看到url的信息存儲在span標簽中,要獲取其中的信息可以用正則式。
?
?
Python簡單爬蟲2
在我們日常上網瀏覽網頁的時候,經常會看到一些好看的圖片,我們就希望把這些圖片保存下載,或者用戶用來做桌面壁紙,或者用來做設計的素材。
我們最常規的做法就是通過鼠標右鍵,選擇另存為。但有些圖片鼠標右鍵的時候并沒有另存為選項,還有辦法就通過就是通過截圖工具截取下來,但這樣就降低圖片的清晰度。好吧~!其實你很厲害的,右鍵查看頁面源代碼。
我們可以通過python?來實現這樣一個簡單的爬蟲功能,把我們想要的代碼爬取到本地。下面就看看如何使用python來實現這樣一個功能。
?
?
一,獲取整個頁面數據
?
首先我們可以先獲取要下載圖片的整個頁面信息。
getjpg.py
?
#coding=utf-8
import urllib
?
def getHtml(url):
??? page = urllib.urlopen(url)
??? html = page.read()
??? return html
?
html = getHtml("http://tieba.baidu.com/p/2738151262")
?
print html
?
Urllib?模塊提供了讀取web頁面數據的接口,我們可以像讀取本地文件一樣讀取www和ftp上的數據。首先,我們定義了一個getHtml()函數:
urllib.urlopen()方法用于打開一個URL地址。
read()方法用于讀取URL上的數據,向getHtml()函數傳遞一個網址,并把整個頁面下載下來。執行程序就會把整個網頁打印輸出。
?
?
二,篩選頁面中想要的數據
?
Python?提供了非常強大的正則表達式,我們需要先要了解一點python?正則表達式的知識才行。
http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html
?
假如我們百度貼吧找到了幾張漂亮的壁紙,通過到前段查看工具。找到了圖片的地址,如:src=”http://imgsrc.baidu.com/forum......jpg”pic_ext=”jpeg”
?
?
修改代碼如下:
?
import re
import urllib
?
def getHtml(url):
??? page = urllib.urlopen(url)
??? html = page.read()
??? return html
?
def getImg(html):
??? reg = r'src="(.+?\.jpg)" pic_ext'
??? imgre = re.compile(reg)
??? imglist = re.findall(imgre,html)
??? return imglist?????
??
html = getHtml("http://tieba.baidu.com/p/2460150866")
print getImg(html)
?
我們又創建了getImg()函數,用于在獲取的整個頁面中篩選需要的圖片連接。re模塊主要包含了正則表達式:
re.compile()?可以把正則表達式編譯成一個正則表達式對象.
re.findall()?方法讀取html?中包含?imgre(正則表達式)的數據。
? ?運行腳本將得到整個頁面中包含圖片的URL地址。
?
?
三,將頁面篩選的數據保存到本地
?
把篩選的圖片地址通過for循環遍歷并保存到本地,代碼如下:
?
?
#coding=utf-8
import urllib
import re
?
def getHtml(url):
??? page = urllib.urlopen(url)
??? html = page.read()
??? return html
?
def getImg(html):
??? reg = r'src="(.+?\.jpg)" pic_ext'
??? imgre = re.compile(reg)
??? imglist = re.findall(imgre,html)
??? x = 0
??? for imgurl in imglist:
??????? urllib.urlretrieve(imgurl,'%s.jpg' % x)
??????? x+=1
?
?
html = getHtml("http://tieba.baidu.com/p/2460150866")
?
print getImg(html)
?
?
這里的核心是用到了urllib.urlretrieve()方法,直接將遠程數據下載到本地。
通過一個for循環對獲取的圖片連接進行遍歷,為了使圖片的文件名看上去更規范,對其進行重命名,命名規則通過x變量加1。保存的位置默認為程序的存放目錄。
程序運行完成,將在目錄下看到下載到本地的文件。
?
?
?
?
?
轉載于:https://www.cnblogs.com/Renyi-Fan/p/7802678.html
總結
- 上一篇: Oracle 11g Dataguard
- 下一篇: 从源代码的角度分析--在BaseAdap