1. 程式人生 > >基於Visual C 2010 混合Python程式設計以及Python簡介

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

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

我們重點講解如何在基於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指令碼

 

 

 

 

 

[python] view plain copy print ?
  1. def welcome(name):  
  2.  return "Hello '" + name + "' from IronPython"  
def welcome(name): return "Hello '" + name + "' from IronPython"

 

 

開啟VS2010,建立一個C++,CLR windows form窗體“Python範例”
,刪掉form1,在函式初始化的時候,程式碼如下

 

 

[cpp] view plain copy print ?
  1. using System;  
  2. using IronPython::Hosting;  
  3. using Microsoft::Scripting::Hosting;  
  4. namespace Python範例  
  5. {  
  6.       
  7.         private static void Main(string[] args)  
  8.         {  
  9.             Console.WriteLine("載入 helloworld.py...");  
  10.   
  11.             ScriptRuntime py = Python.CreateRuntime();  
  12.             dynamic helloworld = py.UseFile("helloworld.py");  
  13.   
  14.             Console.WriteLine("helloworld.py 載入!");  
  15.   
  16.             for (int i = 0; i < 1000; i++)  
  17.             {  
  18.                 Console.WriteLine(helloworld.welcome("Employee #{0}"), i);  
  19.             }  
  20.             Console.ReadLine();  
  21.           
  22.     }  
  23. }  
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搞定

 

 

 

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述