瞭解Python

瞭解Python

1、Python簡介

做用

Python具備豐富和強大的庫。它常被暱稱爲膠水語言,可以把用其餘語言製做的各類模塊(尤爲是C/C++)很輕鬆地聯結在一塊兒。常見的一種應用情形是,使用Python快速生成程序的原型(有時甚至是程序的最終界面),而後對其中[3]  有特別要求的部分,用更合適的語言改寫,好比3D遊戲中的圖形渲染模塊,性能要求特別高,就能夠用C/C++重寫,然後封裝爲Python能夠調用的擴展類庫。須要注意的是在您使用擴展類庫時可能須要考慮平臺問題,某些可能不提供跨平臺的實現。html

 

因爲Python語言的簡潔性、易讀性以及可擴展性,在國外用Python作科學計算的研究機構日益增多,一些知名大學已經採用Python來教授程序設計課程。例如卡耐基梅隆大學的編程基礎、麻省理工學院的計算機科學及編程導論就使用Python語言講授。衆多開源的科學計算軟件包都提供了Python的調用接口,例如著名的計算機視覺庫OpenCV、三維可視化庫VTK、醫學圖像處理庫ITK。而Python專用的科學計算擴展庫就更多了,例如以下3個十分經典的科學計算擴展庫:NumPy、SciPy和matplotlib,它們分別爲Python提供了快速數組處理、數值運算以及繪圖功能。所以Python語言及其衆多的擴展庫所構成的開發環境十分適合工程技術、科研人員處理實驗數據、製做圖表,甚至開發科學計算應用程序java

提及科學計算,首先會被提到的多是MATLAB。然而除了MATLAB的一些專業性很強的工具箱還沒法替代以外,MATLAB的大部分經常使用功能均可以在Python世界中找到相應的擴展庫。和MATLAB相比,用Python作科學計算有以下優勢:python

● 首先,MATLAB是一款商用軟件,而且價格不菲。而Python徹底免費,衆多開源的科學計算庫都提供了Python的調用接口。用戶能夠在任何計算機上免費安裝Python及其絕大多數擴展庫。c++

● 其次,與MATLAB相比,Python是一門更易學、更嚴謹的程序設計語言。它能讓用戶編寫出更易讀、易維護的代碼。程序員

● 最後,MATLAB主要專一於工程和科學計算。然而即便在計算領域,也常常會遇到文件管理、界面設計網絡通訊等各類需求。而Python有着豐富的擴展庫,能夠輕易完成各類高級任務,開發者能夠用Python實現完整應用程序所需的各類功能。web

 

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.

 

 

 

2、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;.PYM

3,測試是否安裝成功

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

就能夠直接運行了

 

總結

print

命令行模式: 運行Python,在命令行輸入命令並執行。

程序模式: 寫一段Python程序並運行。

 

至關於不用編譯,能夠直接執行的就是腳本。

 

3、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++的不一樣。
1、頭文件
學一門語言的第一步就是輸出"hello world",若是是C++得這麼寫:

 

print"hello world"可是若是是Python的話,只須要一句()
句尾還不用加分號,是否是有點懷疑人生,main函數呢?頭文件呢?沒有返回值嗎?通通沒有,我當時看到這個內心在想,這是真的Python嗎?
那Python爲何沒有main函數?沒有main函數程序怎麼知道從哪裏開始呢?咱們在用Python打印helloword時拿到就沒有調用任何頭文件嗎?
實際上是這樣的,咱們知道PythonPython使用縮進對齊組織代碼的執行,全部沒有縮進的代碼(非函數定義和類定義),都會在載入時自動執行,這些代碼,能夠認爲是Python的main函數。
printprintf至於頭文件我查清楚了再說,在C中不用頭文件也能夠用()函數
2、註釋
#,C++爲//這個沒啥好說的,python是
3、數組
11在學習C++的時候常常出現數組越界的狀況,好比下標是-,系統會崩潰,可是在這裏若是數組的長度爲n,那麼他的下標範圍[-n,n-],就是這麼神奇。

 

聊一聊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內存的垃圾回收,
一、當內存中有再也不使用的部分時,垃圾收集器就會把他們清理掉。它會去檢查那些引用計數爲0的對象,而後清除其在內存的空間。固然除了引用計數爲0的會被清除,還有一種狀況也會被垃圾收集器清掉:當兩個對象相互引用時,他們自己其餘的引用已經爲0了。
二、垃圾回收機制還有一個循環垃圾回收器, 確保釋放循環引用對象(a引用b, b引用a, 致使其引用計數永遠不爲0)。

 

程序有兩種執行方式,解釋執行和編譯執行。
PYTHON是一種腳本語言,是解釋執行的,不須要通過編譯,因此很方便快捷,且可以很好地跨平臺,寫一些小工具小程序特別合適。
而C++則是一種須要編譯後運行語言,在特定的機器上編譯後在特定的機上運行,運行效率高,安全穩定。但編譯後的程序通常是不跨平臺的。
學習一種編程語言不能看它熱不熱。而是要看它在某個領域的做用。就像彙編,雖然如今不熱了,可是它在某些行業內仍是很吃香的。PYTHON確實很強大,但在三五年內,不會做爲一種主流的編程語言。至少在Windows程序開發領域內不會。
建議將C++做爲主要的學習方向,將PYTHON做爲一種輔助工具。固然,都能學通則更好了。

 

 

 

 

4、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中這樣作是沒有必要的也是不值得的(除了極少數一些特定的場合須要內聯一些要求性能的函數)。若是你發現本身一遍一遍在寫一樣的代碼並且變化不多,你就須要去學一下閉包。他們實際不併是那麼可怕。

 

這就是你要作的。你寫了一個包含了函數的函數。這裏內部的函數就是你要一遍遍寫的函數的模版,可是在裏面加入了針對不一樣狀況的函數要使用變量。外部的函數須要剛剛提升的那種變量做爲參數,而且將內部的函數做爲結果返回。而後,每次你要寫另外一種略微不一樣的函數的時候,你只要調用這個外部的函數,而且把返回值賦給你要讓「重複」函數出現的名字。如今,若是你須要改變這個工做方式,你只須要改變一個地方:這個模版。

在我所看過的應用程序/平臺中,只有一個很微不足道的程序使用了這個技術,它去掉了數百行重負的代碼。實際上,由於開發者使用了特別的樣板文件來爲這個平臺開發插件,因此這會節省不少不少第三方開發人員的代碼,同時也使那些程序員要學習的東西變得簡單了。

這只是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程序比他所須要的要複雜得多.)

 

 

 

 

 

5、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。保存的位置默認爲程序的存放目錄。

程序運行完成,將在目錄下看到下載到本地的文件。

 

相關文章
相關標籤/搜索