天天看點

基于Visual C++2010 混合Python程式設計以及Python簡介

我們重點講解如何在基于Visual C++2010 開發Python的調用,先介紹下Python,

Python 具有腳本語言中最豐富和強大的類庫,足以支援絕大多數日常應用。它的名字來源于一個喜劇,也許最初設計Python這種語言的人并沒有想到今天Python會在工業和科研上獲得如此廣泛的使用。著名的自由軟體作者Eric Raymond在他的文章《如何成為一名黑客》中,将Python列為黑客應當學習的四種程式設計語言之一,并建議人們從Python開始學習程式設計。

 下面是一個在标準輸出裝置上輸出Hello World的簡單程式,這種程式通常作為開始學習程式設計語言時的第一個程式:

  在python2.x版本中

  #!/usr/bin/env python

  print "Hello, world!"

  或者:

  import sys

  sys.stdout.write("Hello, world/n")

  ///

  在python3.x中

  print是一個完完全全的函數,需要修改成:

  print('Hello world!')

Python的創始人為Guido van Rossum。1989年聖誕節期間,在阿姆斯特丹,Guido為了打發聖誕節的無趣,決心開發一個新的腳本解釋程式,做為 ABC 語言的一種繼承。之是以選中 Python(大蟒蛇的意思)作為程式的名字,是因為他是一個Monty Python的飛行馬戲團的愛好者。

  ABC是由Guido參加設計的一種教學語言。就Guido本人看來,ABC 這種語言非常優美和強大,是專門為非專業程式員設計的。但是ABC語言并沒有成功,究其原因,Guido 認為是非開放造成的。Guido 決心在 Python 中避免這一錯誤(的确如此,Python 與其它的語言如C、C++和Java結合的非常好)。同時,他還想實作在 ABC 中閃現過但未曾實作的東西。

  就這樣,Python在Guido手中誕生了。實際上,第一個實作是在Mac機上。可以說,Python是從ABC發展起來,主要受到了Modula-3(另一種相當優美且強大的語言,為小型團體所設計的)的影響。并且結合了Unix shell和C的習慣。

  Python在程式設計語言中的定位

  很多大規模軟體開發計劃例如 Zope, Mnet 及 BitTorrent. Google都在廣泛地使用它。

  通常認為,Python是一種解釋性的語言,但是這種說法是不正确的,實際上,Python在執行時,首先會将.py檔案中的源代碼編譯成Python的byte code(位元組碼),然後再由Python Virtual Machine來執行這些編譯好的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常被昵稱為膠水語言,這不是說他會把你的手指粘住,而是說他能夠很輕松的把用其他語言制作的各種子產品(尤其是C/C++)輕松地聯結在一起。常見的一種應用情形是,使用python快速生成程式的原型(有時甚至是程式的最終界面),然後對其中有特别要求的部分,用更合适的語言改寫,比如3D遊戲中的圖形渲染子產品,速度要求非常高,就可以用C++重寫。

Python的創始人為Guido van Rossum。1989年聖誕節期間,在阿姆斯特丹,Guido為了打發聖誕節的無趣,決心開發一個新的腳本解釋程式,做為 ABC 語言的一種繼承。之是以選中 Python(大蟒蛇的意思)作為程式的名字,是因為他是一個Monty Python的飛行馬戲團的愛好者。

  ABC是由Guido參加設計的一種教學語言。就Guido本人看來,ABC 這種語言非常優美和強大,是專門為非專業程式員設計的。但是ABC語言并沒有成功,究其原因,Guido 認為是非開放造成的。Guido 決心在 Python 中避免這一錯誤(的确如此,Python 與其它的語言如C、C++和Java結合的非常好)。同時,他還想實作在 ABC 中閃現過但未曾實作的東西。

  就這樣,Python在Guido手中誕生了。實際上,第一個實作是在Mac機上。可以說,Python是從ABC發展起來,主要受到了Modula-3(另一種相當優美且強大的語言,為小型團體所設計的)的影響。并且結合了Unix shell和C的習慣。

  Python在程式設計語言中的定位

  很多大規模軟體開發計劃例如 Zope, Mnet 及 BitTorrent. Google都在廣泛地使用它。

  通常認為,Python是一種解釋性的語言,但是這種說法是不正确的,實際上,Python在執行時,首先會将.py檔案中的源代碼編譯成Python的byte code(位元組碼),然後再由Python Virtual Machine來執行這些編譯好的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常被昵稱為膠水語言,這不是說他會把你的手指粘住,而是說他能夠很輕松的把用其他語言制作的各種子產品(尤其是C/C++)輕松地聯結在一起。常見的一種應用情形是,使用python快速生成程式的原型(有時甚至是程式的最終界面),然後對其中有特别要求的部分,用更合适的語言改寫,比如3D遊戲中的圖形渲染子產品,速度要求非常高,就可以用C++重寫。

可擴充性可說是Python作為一種程式設計語言的特色。新的内置子產品(module)可以用C 或 C++寫成。而我們也可為現成的子產品加上Python的接口。Python可以使使用者避免過分的文法的羁絆而将精力主要集中到所要實作的程式任務上。

  Python也被稱為是一門清晰的語言。因為它的作者在設計它的時候,總的指導思想是,對于一個特定的問題,隻要有一種最好的方法來解決就好了。這在由Tim Peters寫的python格言(稱為The Zen of Python)裡面表述為:

  There should be one-- and preferably only one --obvious way to do it.

  有意思的是,這正好和Perl語言(另一種功能類似的進階動态語言)的中心思想TMTOWTDI(There's More Than One Way To Do It)完全相反。這似乎是人們常把Perl和Python互相比較的重要原因。

  Python語言是一種清晰的語言的另一個意思是,它的作者有意的設計限制性很強的文法,使得不好的程式設計習慣(例如if語句的下一行不向右縮進)都不能通過編譯。這樣有意的強制程式員養成良好的程式設計習慣。其中很重要的一項就是Python的縮進規則。

  例如if語句:

  if age<21:

  print "You cannot buy wine!/n"

  print "But you can buy chewing gum./n"

  print "this is outside if/n"

  一個和其他大多數語言(如C)的差別就是,一個子產品的界限,完全是由每行的首字元在這一行的位置來決定的(而C語言是用一對花括号{}來明确的定出子產品的邊界的,與字元的位置毫無關系)。這一點曾經引起過争議。因為自從C這類的語言誕生後,語言的文法含義與字元的排列方式分離開來,曾經被認為是一種程式語言的進步。不過不可否認的是,通過強制程式員們縮進(包括if,for和函數定義等所有需要使用子產品的地方),Python确實使得程式更加清晰和美觀。

  另外Python在其他部分的設計上也堅持了清晰劃一的風格,這使得Python稱為一門易讀性、易維護性好,并且被大量使用者所歡迎的、用途廣泛的語言。Python直接編寫的程式段有時運作效率甚至高于用C編寫的程式。

python的優缺點

  

優點

   簡單————Python是一種代表簡單主義思想的語言。閱讀一個良好的Python程式就感覺像是在讀英語一樣,盡管這個英語的要求非常嚴格!Python的這種僞代碼本質是它最大的優點之一。它使你能夠專注于解決問題而不是去搞明白語言本身。

  易學————就如同你即将看到的一樣,Python極其容易上手。前面已經提到了,Python有極其簡單的文法。

  免費、開源————Python是FLOSS(自由/開放源碼軟體)之一。簡單地說,你可以自由地釋出這個軟體的拷貝、閱讀它的源代碼、對它做改動、把它的一部分用于新的自由軟體中。FLOSS是基于一個團體分享知識的概念。這是為什麼Python如此優秀的原因之一——它是由一群希望看到一個更加優秀的Python的人創造并經常改進着的。

  高層語言————當你用Python語言編寫程式的時候,你無需考慮諸如如何管理你的程式使用的記憶體一類的底層細節。

  可移植性————由于它的開源本質,Python已經被移植在許多平台上(經過改動使它能夠工作在不同平台上)。如果你小心地避免使用依賴于系統的特性,那麼你的所有Python程式無需修改就可以在下述任何平台上面運作。這些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至還有PocketPC和Symbian!

  解釋性————這一點需要一些解釋。一個用編譯性語言比如C或C++寫的程式可以從源檔案(即C或C++語言)轉換到一個你的計算機使用的語言(二進制代碼,即0和1)。這個過程通過編譯器和不同的标記、選項完成。當你運作你的程式的時候,連接配接/轉載器軟體把你的程式從硬碟複制到記憶體中并且運作。而Python語言寫的程式不需要編譯成二進制代碼。你可以直接從源代碼 運作 程式。在計算機内部,Python解釋器把源代碼轉換成稱為位元組碼的中間形式,然後再把它翻譯成計算機使用的機器語言并運作。事實上,由于你不再需要擔心如何編譯程式,如何確定連接配接轉載正确的庫等等,所有這一切使得使用Python更加簡單。由于你隻需要把你的Python程式拷貝到另外一台計算機上,它就可以工作了,這也使得你的Python程式更加易于移植。

  面向對象————Python既支援面向過程的程式設計也支援面向對象的程式設計。在“面向過程”的語言中,程式是由過程或僅僅是可重用代碼的函數建構起來的。在“面向對象”的語言中,程式是由資料和功能組合而成的對象建構起來的。與其他主要的語言如C++和Java相比,Python以一種非常強大又簡單的方式實作面向對象程式設計。

  可擴充性————如果你需要你的一段關鍵代碼運作得更快或者希望某些算法不公開,你可以把你的部分程式用C或C++編寫,然後在你的Python程式中使用它們。

  可嵌入性————你可以把Python嵌入你的C/C++程式,進而向你的程式使用者提供腳本功能。

  豐富的庫————Python标準庫确實很龐大。它可以幫助你處理各種工作,包括正規表達式、文檔生成、單元測試、線程、資料庫、網頁浏覽器、CGI、FTP、電子郵件、XML、XML-RPC、HTML、WAV檔案、密碼系統、GUI(圖形使用者界面)、Tk和其他與系統有關的操作。記住,隻要安裝了Python,所有這些功能都是可用的。這被稱作Python的“功能齊全”理念。除了标準庫以外,還有許多其他高品質的庫,如wxPython、Twisted和Python圖像庫等等。

  概括————Python确實是一種十分精彩又強大的語言。它合理地結合了高性能與使得編寫程式簡單有趣的特色。

缺點

   1. 強制縮進

  這也許不應該被稱為局限,但是它用縮進來區分語句關系的方式還是給很多初學者帶來了困惑。即便是很有經驗的Python程式員,也可能陷入陷阱當中。最常見的情況是tab和空格的混用會導緻錯誤,而這是用肉眼無法分别的。

  2. 單行語句和指令行輸出問題

  很多時候不能将程式連寫成一行,如import sys;for i in sys.path:print i。而perl和awk就無此限制,可以較為友善的在shell下完成簡單程式,不需要如Python一樣,必須将程式寫入一個.py檔案。(對很多使用者而言這也不算是限制)

  

  NO.1 運作速度(雖然比java快,但沒法和需要編譯的語言相比)。有速度要求的話,用C++改寫關鍵部分吧。

  NO.2 國内市場較小(國内以python來做主要開發的,目前隻有一些 web2.0公司)。但時間推移,目前很多國内軟體公司,尤其是遊戲公司,也開始規模使用他。

  No.3 中文資料匮乏(好的python中文資料屈指可數)。托社群的福,有幾本優秀的教材已經被翻譯了,但入門級教材多,進階内容還是隻能看英語版。

  NO.4 構架選擇太多(沒有像C#這樣的官方.net構架,也沒有像ruby由于曆史較短,構架開發的相對集中。Ruby on Rails 構架開發中小型web程式天下無敵)。不過這也從另一個側面說明,python比較優秀,吸引的人才多,項目也多。

Python的前景及應用

  

前景

   Python在程式設計領域的占有率一直處于穩步上升之中,根據最新的資料,Python排名第六。前五名分别是Java、C、PHP、C++ 和 VB. 作為一個很年輕的語言,Python的位置已經相當令人振奮了。随着微軟将Python納入.Net 平台,相信Python的将來會更加強勁發展。Python 很可能會成為.Net平台快速開發的主流語言。欲了解這方面情況,請參考Iron Python的相關資訊.

  著名的搜尋引擎 Google 也大量使用Python。更加令人吃驚的是,在Nokia智能手機所采用的Symbian作業系統上,Python成為繼C++,Java之後的第三個程式設計語言!2006年的Google程式設計大賽已經将Python作為參賽語言之一,可見Python的影響力之巨大。

  Zope-應用伺服器

  Plone-内容管理系統

  Django-鼓勵快速開發的web framework

  Twisted - Python Network Application Framework Python的網絡應用程式架構

  TurboGears - 另一個Web應用快速開發架構

  Bit Torrent - 著名的BT下載下傳工具

  還有很多遊戲也是用Python制作的

  

應用範圍

   

  系統程式設計,提lass=innerlink>API,能友善進行系統維護和管理,Linux下标志性語言之一,是很多系統管理者理想的程式設計工具。

  圖形處理,有PIL、Tkinter等圖形庫支援,能友善進行圖形處理。

  數學處理,NumPy擴充提供大量與許多标準數學庫的接口。

  文本處理,python提供的re子產品能支援正規表達式,還提供SGML,XML分析子產品,許多程式員利用python進行XML程式的開發。

  資料庫程式設計,程式員可通過遵循Python DB-API(資料庫應用程式程式設計接口)規範的子產品與Microsoft SQL Server,Oracle,Sybase,DB2,Mysql、SQLite等資料庫通信。python自帶有一個Gadfly子產品,提供了一個完整的SQL環境。

  網絡程式設計,提供豐富的子產品支援sockets程式設計,能友善快速地開發分布式應用程式。

  作為Web應用的開發語言,支援最新的XML技術。

  多媒體應用,Python的PyOpenGL子產品封裝了“OpenGL應用程式程式設計接口”,能進行二維和三維圖像處理。PyGame子產品可用于編寫遊戲軟體。

Python的庫

  由于設計者和開源社群的共同努力,在python中有大量優秀的庫可以被直接調用以高效地完成不同需求的工作。這裡列舉一些常見常用的庫:

  Tkinter———— Python預設的圖形界面接口。

  Tkinter是一個和Tk接口的Python子產品,Tkinter庫提供了對Tk API的接口,它屬于Tcl/Tk的GUI工具組。Tcl/Tk是由John Ousterhout發展的書寫和圖形裝置。Tcl(工具指令語言)是個宏語言,用于簡化shell下複雜程式的開發,Tk工具包是和Tcl一起開發的,目的是為了簡化使用者接口的設計過程。Tk工具包由許多不同的小部件,如一個按鈕、一個滾動條等。通過Tk提供的這些小部件,我們就可快速地進行GUI開發。Perl、Scheme等語言也利用Tk庫進行GUI開發。Tkinter是跨平台,在各種平台下都能使用。

  Python Imaging Library(PIL)————python提供強大的圖形處理的能力,并提供廣泛的圖形檔案格式支援,該庫能進行圖形格式的轉換、列印和顯示。還能進行一些圖形效果的處理,如圖形的放大、縮小和旋轉等。是Python使用者進行圖象處理的強有力工具。

  Pmw(Python megawidgets)Python超級GUI元件集————一個在python中利用Tkinter子產品建構的進階GUI元件,每個Pmw都合并了一個或多個Tkinter元件,以實作更有用和更複雜的功能。

  PyXML———— 用Python解析和處理XML文檔的工具包,包中的4DOM是完全相容于W3C DOM規範的。它包含以下内容:

  xmlproc: 一個符合規範的XML解析器。

  Expat: 一個快速的,非驗證的XML解析器。 還有其他

  和他同級别的還有 PyHtml PySGML

  PyGame———— 用于多媒體開發和遊戲軟體開發的子產品。

  PyOpenGL———— 子產品封裝了“OpenGL應用程式程式設計接口”,通過該子產品python程式員可在程式中內建2D和3D的圖形。

  NumPy、NumArray和SAGE———— NumArray是Python的一個擴充庫,主要用于處理任意維數的固定類型數組,簡單說就是一個矩陣庫。它的低層代碼使用C來編寫,是以速度的優勢很明顯。NumPy是Numarray的後繼者,用來代替NumArray。SAGE是基于NumPy和其他幾個工具所整合成的數學軟體包,目标是取代Magma, Maple, Mathematica和Matlab 這類工具。

  MySQLdb子產品———— 用于連接配接MySQL資料庫。還有用于zope的ZMySQLDA子產品,通過它就可在zope中連接配接mysql資料庫。

  PyGTK ———— 用于python GUI程式開發的GTK+庫。GTK就是用來實作GIMP和Gnome的那個庫。有了它,你完全可以自信的嘗試自己制造Photoshop

  PyQt ———— 用于python的Qt開發庫。QT就是實作了KDE環境的那個庫,由一系列的子產品組成,有qt, qtcanvas, qtgl, qtnetwork, qtsql, qttable, qtui and qtxml,包含有300個類和超過5750個的函數和方法。PyQt還支援一個叫qtext的子產品,它包含一個QScintilla庫。該庫是Scintillar編輯器類的Qt接口。

  PyMedia ———— 用于多媒體操作的python子產品。它提供了豐富而簡單的接口用于多媒體處理(wav, mp3, ogg, avi, divx, dvd, cdda etc)。可在Windows和Linux平台下使用。

  Psyco ———— 一個Python代碼加速度器,可使Python代碼的執行速度提高到與編譯語言一樣的水準。

  Python-ldap ———— 提供一組面向對象的API,可友善地在python中通路ldap目錄服務,它基于OpenLDAP2.x。

  smtplib子產品 ———— 發送電子郵件。

  ftplib子產品 ———— 定義了FTP類和一些方法,用以進行用戶端的ftp程式設計。我們可用python編寫一個自己的ftp用戶端程式,用于下載下傳檔案或鏡像站點。如果想了解ftp協定的詳細内容,請參考RFC959。

  xmpppy子產品 ———— Jabber伺服器采用開發的XMPP協定,Google Talk也是采用XMPP協定的IM系統。在Python中有一個xmpppy子產品支援該協定。也就是說,我們可以通過該子產品與Jabber伺服器通信,是不是很Cool。

  下面這些就不詳細介紹,隻列出名字和功能

  adodb ———— ADO資料庫連接配接元件

  bsddb3 ———— BerkeleyDB的連接配接元件

  chardet ———— 編碼檢測

  scons ———— 項目建構工具,寫好了模闆用起來還是很友善的

  sendpkt ———— Python發包

  setuptools ———— 一套python包管理機制

  Cheetah ———— 建構和擴充任何種類的基于文本的内容

  pycurl ———— URL處理工具

  pydot ———— 畫圖的,graphiz

  pyevent ———— Python的事件支援

  pylint ———— 培養良好的編碼習慣

  Pylons ———— 又一個web framework

  pypcap ———— 抓包的

  pysqlite2 ———— SQLite的連接配接元件

  python-dnet ———— 控制網絡安全的其他裝置

  pythonwin ———— Python的Windows擴充

  pywmi ———— 省了好多折騰功夫

  reportlab ———— Python操作PDF的Libary。

  scapy ———— 網絡包建構分析架構,可程式設計的wireshark,有興趣的google “Silver Needle in the Skype”

  simplejson ———— JSON的支援

  sqlalchemy ———— SQL資料庫連接配接池

  SQLObject ———— 資料庫連接配接池

  cherrypy ———— 一個WEB framework

  ctypes ———— 用來調用動态連結庫

  Cx-oracle ———— 連接配接oracle的工具

  DBUtils ———— 資料庫連接配接池

  django ———— 一個WEB framework

  DPKT ———— raw-scoket網絡程式設計

  docutils ———— 用來寫文檔的

  dpkt ———— 資料包的解包群組包

  feedparser ———— rss解析

  Kodos ———— 正規表達式調試工具

  Mechanize ———— 爬蟲連接配接網站常用

  pefile ———— windows pe檔案解析器

  py2exe ———— 用來生成windows可執行檔案

  twisted ———— 巨無霸的網絡程式設計架構

  winpdb ———— 自己的程式或者用别的庫不太明白的時候就靠它了

  wxPython ———— GUI程式設計架構,熟悉MFC的人會非常喜歡,簡直是同一架構(對于初學者或者對設計要求不高的使用者來說,使用 Boa Constructor可以友善迅速的進行wxPython的開發)

  PIL———— Python 的圖像處理庫,可以打開數十種圖像格式,還提供許多圖像處理函數,如圖像增強、濾波算法等。

  Pyro———— Python實作與JAVA RMI類似的技術

  PLY———— 基于Python的LEX、YACC的語言工具

  Corepy———— 使用Python開發編寫x86彙程式設計式

  LightCloud———— Python實作的分布式的鍵-值資料庫

  Parallel Python(PP)———— 輕松開發SMP、叢集并行計算的庫

  開源社群的工作已經完成到這樣的程度,基本上各種常見的程式設計需求都已經有非常成熟穩定高速的子產品來實作,你所需要做的,隻是去把它找出來然後閱讀文檔。

定義一個簡單的Python腳本

 def welcome(name):

return "Hello '" + name + "' from IronPython"

打開VS2010,建立一個C++,CLR windows form窗體“Python範例”

,删掉form1,在函數初始化的時候,代碼如下

using System;

using IronPython::Hosting;

using Microsoft::Scripting::Hosting;

namespace Python範例

{

private static void Main(string[] args)

{

Console.WriteLine("載入 helloworld.py...");

ScriptRuntime py = Python.CreateRuntime();

dynamic helloworld = py.UseFile("helloworld.py");

Console.WriteLine("helloworld.py 載入!");

for (int i = 0; i < 1000; i++)

{

Console.WriteLine(helloworld.welcome("Employee #{0}"), i);

}

Console.ReadLine();

}

}

程式完全執行成功,大家在開發C++的時候,某些麻煩的工作可以讓Python搞定