⑴ py2exe python24 NumPy錯誤意思是問題,怎麼解決
from distutils.core import setup
import py2exe
from distutils.filelist import findall
import os
import matplotlib
matplotlibdatadir = matplotlib.get_data_path()
matplotlibdata = findall(matplotlibdatadir)
matplotlibdata_files = []
for f in matplotlibdata:
dirname = os.path.join('matplotlibdata', f[len(matplotlibdatadir)+1:])
matplotlibdata_files.append((os.path.split(dirname)[0], [f]))
packages = ['matplotlib', 'pytz']
includes = []
excludes = []
dll_excludes = ['libgdk_pixbuf-2.0-0.dll',
'libgobject-2.0-0.dll',
'libgdk-win32-2.0-0.dll',
'wxmsw26uh_vc.dll']
opts = { 'py2exe': { 'packages' : packages,
'includes' : includes,
'excludes' : excludes,
'dll_excludes' : dll_excludes
}
}
setup ( console=['test.py'],
options = opts,
data_files = matplotlibdata_files
)
I compile the application by running >setup.py py2exe
At the end of compilation phase, it is written :
The following moles appear to be missing
['AppKit', 'FFT', 'Foundation', 'Image', 'LinearAlgebra', 'MA', 'MLab', 'Matrix', 'Numeric', 'PyObjCTools', 'P
yQt4', 'Pyrex', 'Pyrex.Compiler', 'RandomArray', '_curses', '_ssl', 'backends.draw_if_interactive', 'backends.
new_figure_manager', 'backends.pylab_setup', 'backends.show', 'cairo', 'cairo.gtk', 'fcompiler.FCompiler', 'fc
ompiler.show_fcompilers', 'fltk', 'gd', 'gobject', 'gtk', 'lib.add_newdoc', 'matplotlib.enthought.pyface.actio
n', 'mlab.amax', 'mlab.amin', 'numarray', 'numarray.convolve', 'numarray.fft', 'numarray.ieeespecial', 'numarr
ay.linear_algebra', 'numarray.linear_algebra.mlab', 'numarray.ma', 'numarray.numeric', 'numarray.random_array'
, 'numerix.ArrayType', 'numerix.Complex', 'numerix.Complex32', 'numerix.Complex64', 'numerix.Float', 'numerix.
Float32', 'numerix.Float64', 'numerix.Int', 'numerix.Int16', 'numerix.Int32', 'numerix.Int8', 'numerix.NewAxis
', 'numerix.UInt16', 'numerix.UInt32', 'numerix.UInt8', 'numerix.absolute', 'numerix.add', 'numerix.all', 'num
erix.allclose', 'numerix.alltrue', 'numerix.arange', 'numerix.arccos', 'numerix.arccosh', 'numerix.arcsin', 'n
umerix.arcsinh', 'numerix.arctan', 'numerix.arctan2', 'numerix.arctanh', 'numerix.argmax', 'numerix.argmin', '
numerix.argsort', 'numerix.around', 'numerix.array', 'numerix.arrayrange', 'numerix.asarray', 'numerix.asum',
'numerix.bitwise_and', 'numerix.bitwise_or', 'numerix.bitwise_xor', 'numerix.ceil', 'numerix.choose', 'numerix
.clip', 'numerix.compress', 'numerix.concatenate', 'numerix.conjugate', 'numerix.convolve', 'numerix.cos', 'nu
merix.cosh', 'numerix.cross_correlate', 'numerix.cumproct', 'numerix.cumsum', 'numerix.diagonal', 'numerix.d
ivide', 'numerix.dot', 'numerix.equal', 'numerix.exp', 'numerix.fabs', 'numerix.fft.fft', 'numerix.fft.inverse
_fft', 'numerix.floor', 'numerix.fmod', 'numerix.fromfunction', 'numerix.fromstring', 'numerix.greater', 'nume
rix.greater_equal', 'numerix.hypot', 'numerix.identity', 'numerix.indices', 'numerix.innerproct', 'numerix.i
scontiguous', 'numerix.less', 'numerix.less_equal', 'numerix.log', 'numerix.log10', 'numerix.logical_and', 'nu
merix.logical_not', 'numerix.logical_or', 'numerix.logical_xor', 'numerix.matrixmultiply', 'numerix.maximum',
'numerix.minimum', 'numerix.mlab.amax', 'numerix.mlab.amin', 'numerix.mlab.cov', 'numerix.mlab.diff', 'numerix
.mlab.hanning', 'numerix.mlab.rand', 'numerix.mlab.std', 'numerix.mlab.svd', 'numerix.multiply', 'numerix.nega
tive', 'numerix.newaxis', 'numerix.nonzero', 'numerix.not_equal', 'numerix.nx', 'numerix.ones', 'numerix.outer
proct', 'numerix.pi', 'numerix.power', 'numerix.proct', 'numerix.put', 'numerix.putmask', 'numerix.rank',
'numerix.ravel', 'numerix.repeat', 'numerix.reshape', 'numerix.resize', 'numerix.searchsorted', 'numerix.shape
', 'numerix.sin', 'numerix.sinh', 'numerix.size', 'numerix.sometrue', 'numerix.sort', 'numerix.sqrt', 'numerix
.subtract', 'numerix.swapaxes', 'numerix.take', 'numerix.tan', 'numerix.tanh', 'numerix.trace', 'numerix.trans
pose', 'numerix.typecode', 'numerix.typecodes', 'numerix.where', 'numerix.which', 'numerix.zeros', 'numpy.Comp
lex', 'numpy.Complex32', 'numpy.Complex64', 'numpy.Float', 'numpy.Float32', 'numpy.Float64', 'numpy.Infinity',
'numpy.Int', 'numpy.Int16', 'numpy.Int32', 'numpy.Int8', 'numpy.UInt16', 'numpy.UInt32', 'numpy.UInt8', 'nump
y.inf', 'numpy.infty', 'numpy.oldnumeric', 'objc', 'paint', 'pango', 'pre', 'pyemf', 'qt', 'setuptools', 'setu
ptools.command', 'setuptools.command.egg_info', 'trait_sheet', 'matplotlib.numerix.Float', 'matplotlib.numerix
.Float32', 'matplotlib.numerix.absolute', 'matplotlib.numerix.alltrue', 'matplotlib.numerix.asarray', 'matplot
lib.numerix.ceil', 'matplotlib.numerix.equal', 'matplotlib.numerix.fromstring', 'matplotlib.numerix.indices',
'matplotlib.numerix.put', 'matplotlib.numerix.ravel', 'matplotlib.numerix.sqrt', 'matplotlib.numerix.take', 'm
atplotlib.numerix.transpose', 'matplotlib.numerix.where', 'numpy.core.conjugate', 'numpy.core.equal', 'numpy.c
ore.less', 'numpy.core.less_equal', 'numpy.dft.old', 'numpy.random.rand', 'numpy.random.randn']
1) First Problem: numpy\core\_internal.pyc not included in Library.zip
No scipy-style subpackage 'core' found in C:\WinCE\Traces\py2exe test\dist\library.zip\numpy. Ignoring: No mole named _internal
Traceback (most recent call last):
File "profiler_ftt.py", line 15, in ?
from matplotlib.backends.backend_wx import Toolbar, FigureCanvasWx,\
File "matplotlib\backends\backend_wx.pyc", line 152, in ?
File "matplotlib\backend_bases.pyc", line 10, in ?
File "matplotlib\colors.pyc", line 33, in ?
File "matplotlib\numerix\__init__.pyc", line 67, in ?
File "numpy\__init__.pyc", line 35, in ?
File "numpy\_import_tools.pyc", line 173, in __call__
File "numpy\_import_tools.pyc", line 68, in _init_info_moles
File "<string>", line 1, in ?
File "numpy\lib\__init__.pyc", line 5, in ?
File "numpy\lib\type_check.pyc", line 8, in ?
File "numpy\core\__init__.pyc", line 6, in ?
File "numpy\core\umath.pyc", line 12, in ?
File "numpy\core\umath.pyc", line 10, in __load
AttributeError: 'mole' object has no attribute '_ARRAY_API'
I resolved that issue by adding the file ...\Python24\Lib\site-packages\numpy\core\_internal.pyc in ...\test\dist\library.zip\numpy\core.
Each time I compile that executable, I add the file by hand.
Does anybody know how to automatically add that file?
2) Second problem: I don't know how to resolve that issue:
Traceback (most recent call last):
File "profiler_ftt.py", line 15, in ?
from matplotlib.backends.backend_wx import Toolbar, FigureCanvasWx,\
File "matplotlib\backends\backend_wx.pyc", line 152, in ?
File "matplotlib\backend_bases.pyc", line 10, in ?
File "matplotlib\colors.pyc", line 33, in ?
File "matplotlib\numerix\__init__.pyc", line 67, in ?
File "numpy\__init__.pyc", line 35, in ?
File "numpy\_import_tools.pyc", line 173, in __call__
File "numpy\_import_tools.pyc", line 68, in _init_info_moles
File "<string>", line 1, in ?
File "numpy\random\__init__.pyc", line 3, in ?
File "numpy\random\mtrand.pyc", line 12, in ?
File "numpy\random\mtrand.pyc", line 10, in __load
File "numpy.pxi", line 32, in mtrand
AttributeError: 'mole' object has no attribute 'dtype'
I don't find the file numpy.pxi in my file tree nor in \test\dist\library.zip.
I browsed the web in the hope to find a solution but nothing.
It seems that this issue is well known but no solution provided in mailing lists.
⑵ ipad上能裝哪些編程軟體
Pythonista 優雅的集成化Python開發環境(包括numpy、matplotlib等庫,但沒有pandas庫;可通過安裝stash來使用pip安裝純python的庫; 通過objc庫可以方便的調用iOS功能,例如CoreML等,提供iOS原生的UI界面庫)。
Pyto (支持最新版本Python3.8,內置 pandas、biopython、SciPy, SciKit-Learn, SciKit-Image, OpenCV等庫,numpy的運行速度比pythonista快大約30%,內置 pypi ,可以安裝純Python的庫);
Juno / Juno connect 讓你的iPad可以本地運行 Jupyter 或者遠程連接 Jupyter伺服器。
⑶ 如何使用 Python 開發 iOS 程序
其實我們最主要解決的就是下面幾件事情:
在iOS App中安裝Python解釋器。
搭建Python和objc通信的橋梁。
如何配置工程並開發。
如果不使用UIKit這些,那麼就要使用OpenGL ES這些了,這種方式,主要是用於開發游戲的,我們這里不涉及這些。
當然,以下所有內容都是在一台已經安裝了Xcode的Mac上進行的。
在iOS App中安裝Python解釋器
Python-iOS-support
pybee開源了一個可以嵌入到iOS工程中的Python編譯腳本,具體位置在這:
https://github.com/pybee/Python-iOS-supp...
默認是使用Python 3.4.2,編譯x86_64、i386、ARMv7、ARMv7s、ARM64共5個版本,然後打成一個臃腫包,可選framework或者.a。
如果真的要用於生產環境的話,只要把Makefile中的
TARGETS-iOS=iphonesimulator.x86_64 iphonesimulator.i386 iphoneos.armv7 iphoneos.armv7s iphoneos.arm64
修改為:
TARGETS-iOS=iphoneos.armv7 iphoneos.arm64
我們只需要支持ARMv7和ARM64即可,ARMv7s可以兼容ARMv7,所以可以讓包小一些。
作者提供的已經編譯好的包裡面,主要有兩種版本:
Python 3.4.x
Python 3.5.x
按照作者的說法,Python版本是可以更換的,但是我嘗試過,我將最新版本的Python 2.7.11放進去,是無法編譯成功的。
有一些人提到了這個問題,但是作者還是建議使用3.4.x或者3.5.x版本,2.7x版本他已經不再支持了。
修改Python版本的地方在:
PYTHON_VERSION=3.4.2
替換為其他版本即可。
⑷ 編程都有哪些語言
如果你是軟體開發領域的新手,那麼你會想到的第一個問題是「如何開始?」編程語言有數百種可供選擇,但是你怎麼發現哪個最適合你,你的興趣和職業目標又在哪裡呢?選擇最佳編程語言以學習的最簡單方法之一,是通過市場反響、技術趨勢的發展…
閱讀下文,你會發現一些用於Web開發,移動開發,游戲開發等的優秀、專業的編程語言。最後,你將清楚地了解哪種編程語言可以在未來幾年甚至更長時間內幫助你的職業發展。讓我們來看一看……
1、JavaScript
如今,如果連JavaScript都不會用,那麼你不可能稱之為一名合格的軟體開發人員。榜單中的第一個是JavaScript,根本無法想像沒有JavaScript的軟體開發會是怎樣的世界。從Stack Overflow的2019年開發人員調查中可以看出,JavaScript已經連續7年成為開發人員中最受歡迎的語言。過去一年中,大約有75%的人使用了這種語言。
首先,JavaScript是輕量級的,可解釋的,並且在前端開發中起著重要作用的一門語言。甚至一些主要的社交媒體平台都認為JavaScript提供了一種輕松創建互動式網頁的簡便方法,並且是由職業驅動的。最受青睞的是JavaScript,因為它與所有主要瀏覽器兼容,並且其語法確實很靈活。作為一種前端語言,JavaScript還通過Node.js在伺服器端使用。
JavaScript是初學者中最可愛的編程語言。
2、Python
這可能會讓你感到驚訝;python出現在第二位。在許多調查中,它可能都放在第5上。但是,我一定會讓你相信,這是為什麼呢?在我的list中,Python是通用的,用戶友好的編程語言之一。為什麼這么說?像Java一樣,Python語法清晰,直觀並且幾乎類似於英語。Python的「基於對象」子集類似於JavaScript。根據Stack Overflow的說法,有一個部分說「被採用或被遷移,或者遷移得太早」,廣泛來說,遷移到python的人接近42%,這表明它排名第二。
如果你有興趣從事後端開發工作,例如Django –開放源代碼框架,則是使用python編寫的,這使得它易於學習且功能豐富,但卻很受歡迎。另外,python具有多種應用程序,使其功能強大。在科學計算,機器學習和工程學等領域中,Python支持一種編程樣式,該樣式使用簡單的函數和變數,而無需過多地查詢類定義。
人生苦短,我用Python!
再者,因為人工智慧這幾年大熱,而python尤其在大數據和人工智慧領域有廣泛的使用。
python本身面向對象語言,具有豐富和強大的庫,輕松地使用C語言、C++、Cython來編寫擴充模塊,所以很多稱它為「膠水語言」。當然僅僅知道這些還是不夠的。
3、Java
如果有人問為什麼Java,最常出現的句子是「寫一遍,哪都可以運行」 – Java在過去20年來一直是統治性的編程語言。Java是99%面向對象的,並且很強大,因為Java對象不包含對自身外部數據的引用。它比C ++更簡單,因為Java使用自動內存分配和垃圾回收。
Java具有高度的跨平台兼容性或平台無關性。由於你可以在任何地方(我指的是所有設備)進行編碼,因此可以編譯為低級機器代碼,最後,可以使用JVM – Java虛擬機(取決於平台)在任何平台上執行。
Java構成了Android操作系統的基礎,並選擇了約90%的財富500強公司來製作各種後端應用程序。我會毫不猶豫地採用由Amazon Web Services和Windows Azure運行的最大的Apache Hadoop數據處理。有許多充分的理由和廣泛的業務應用程序,擁有巨大的靈活性,而Java一直是初學者的最愛。
4、C / C++
「越老越吃香」 – C用不同的方式證明了這句話。C語言於1970年代後期被引入,為編程世界做出了巨大貢獻。C是少數幾種語言的母語。有些是從C派生的,或者是從其語法,構造和範例(包括Java,Objective-C和C#)啟發而來的。
即使在當今,可以看出,每當需要構建高性能應用程序時,C仍然是最受歡迎的選擇。Linux OS是基於C的。CPP是C的混合版本。C ++是一種基於C的面向對象的編程語言。因此,在設計更高級別的應用程序時,它比其他方法更可取。
C ++比動態類型的語言具有更好的性能,因為在真正執行代碼之前先對代碼進行類型檢查。開發的核心領域是虛擬現實,游戲,計算機圖形等。
5、PHP
這個事實會讓你感到非常驚奇,這種語言是為維護Rasmus的個人主頁(PHP)而創建的,實際上到今天已佔據了全球83%的網站。PHP代表超文本預處理器,是一種通用編程語言。顯然,PHP是一種腳本語言,可在伺服器上運行,並且用於創建以HTML編寫的網頁。它之所以受歡迎,是因為它免費,而且易於設置並且易於新程序員使用。
對於全球的Web開發人員來說,PHP是一個非常強大的選擇。它被廣泛用於創建動態網頁內容以及網站上使用的圖像。由於使用范圍廣泛,因此排名第五。另外,PHP可以很好地用於WordPress CMS(內容管理系統)。
它位於第五的原因之一,是英文PHP降低了網站性能並影響了載入時間。(無奈)
6、Swift
接下來是是Swift。Swift就像它的名字一樣流暢,是Apple Inc.開發的一種通用、開放源代碼的、已編譯的編程語言。如果你正在尋找針對本機iOS或Mac OS應用程序的開發,則Swift就是首選。Swift受Python和Ruby的影響很深,並且被設計為對初學者友好且易於使用。與它的前一個Objective-C相比,Swift被認為是一種更快,更安全,更易於閱讀和調試的工具。
與Objective-C不同,Swift需要更少的代碼,類似於自然的英語。因此,來自JavaScript,Java,Python,C#和C ++的現有技術人員可以更輕松地切換到Swift。
除此之外,人才儲備有限是它面臨的一個挑戰。與其他開源語言相比,你周圍可能找不到很多Swift開發人員。最近的調查表明,在78,000名受訪者中,只有8.1%的人使用Swift,這比其他人要少。並且由於頻繁的更新,Swift被認為在每個新版本中都不太穩定。
7、C#(C-shap)
C-sharp是Microsoft 2000年開發的功能強大的面向對象的編程語言。C-sharp用於開發桌面應用程序和最近的Windows 8/10應用程序,並且需要.NET框架來運行。微軟開發了C#作為Java的競爭對手。實際上,Sun不想讓微軟的干擾來改變Java,於是C#誕生了。
C#具有多種功能,使初學者更容易學習。與C ++相比,代碼是一致且合乎邏輯的。由於C#是靜態類型的語言,因此在C#中發現錯誤很容易,因為在將代碼轉到應用程序之前會先檢查代碼。
簡而言之,它是開發Web應用程序、桌面應用程序的完美選擇,並且在VR,2D和3D游戲中也得到了證明。像Xamarin這樣的跨平台工具已經用C#編寫,使其與所有設備兼容。
8、Ruby
一種開源的動態編程語言,著重簡單性和生產率,於1990年中在日本開發。它的設計主題是簡化編程環境並增加樂趣。Ruby在全棧Web框架Ruby on Rails框架中流行。Ruby具有動態類型化的語言,它沒有硬性規定,並且是一種高級語言,在很大程度上類似於英語。
簡而言之,你可以使用更少的代碼來構建應用程序。但是Ruby面臨的挑戰是動態類型化的語言,它不容易維護,並且靈活性使其運行緩慢。
9、Objective-C
Objective-C(ObjC)是一種面向對象的編程語言。Apple將其用於OS X和iOS操作系統及其應用程序編程介面(API)。它開發於1980年代,並在某些最早的操作系統中得到使用。Objective-C是面向對象的通用對象。你可以將其稱為混合C,因為它為C編程語言添加了功能。
10、SQL
SQL(es-que-el)代表結構化查詢語言,是一種用於操作資料庫的編程語言。它包括存儲,處理和檢索存儲在關系資料庫中的數據。SQL保持數據的准確性和安全性,並且無論其大小如何,都有助於維護資料庫的完整性。
今天,SQL已在Web框架和資料庫應用程序中使用。如果你精通SQL,則可以更好地掌握數據探索和有效的決策制定。
如果你打算選擇資料庫管理作為你的職業,請首先使用C或C++。SQL開發人員的需求量很大,而且薪水也不低。
⑸ c語言和python哪個好入門
從開始看Python到現在也有半個多月了,前後看了Python核心編程和Dive into
Python兩本書。話說半個月看兩本,是個人都知道有多囫圇吞棗,這也是因為我暫時沒有需求拿這個做大型開發,主要是平時的小程序test用一用。所以
我的策略是,整體瀏覽,用到時候現查。話說這核心編程第一版太古老了,老在講2.2之前的東西,我看的翻譯電子版,翻譯得也不好,很晦澀。看完這個後還有
點雲里霧里,看網上人家說DIP好,啄木鳥還有免費電子文檔,就找來看這個。怎麼說呢,講的比核心編程好,但不適合第一次看的初學者。我之所以覺得講得
好,是因為看核心編程,有些概念還有些模糊,看了這本書就明白不少了。要是初學者上來就看這本,保證不好理解。
下面就是在學習的過程中,在翻閱資料的過程中,總結的一些C和python比較明顯的不同之處,有大方向的,也有細節的。肯定沒有總結完,比如動態
函數,lambda這些,我都懶得往上寫了。實際上,作為兩種完全不同的語言,下面這些差異只是冰山一角而已。權當拋磚引玉吧,至少應該對和我有相同研究
興趣,正在考慮是否學習另一門語言的朋友有點幫助。此文也算是DIP的學習筆記吧。順帶說一句,要是有朋友了解,可以幫忙推薦一下實戰性強的Python
教材,語言這東西,不多練手,光比劃,是不可能學好的。
學習目的
我的以後的研究方向是嵌入式,顯然,C語言是我的主要語言。我不是一個語言愛好者,我以前覺得,對於做研究而不是應用的人來說,了解多門語言,不如
精通一門語言。之所以去看python,主要還是因為python更有利於快速開發一些程序,也是因為現在認識到,研究和應用是不能分離的。個人以為,要
想在計算機工程的競爭中立足,必須懂C語言。因為真正要做高性能編程,
不可能將機器的體系架構拋到腦後讓Python虛擬機(或Java虛擬機等)幫你搞定所有底層。越來越多的CPU
core,越來越恐怖的內存性能瓶頸,對於上層開發人員來說,無所謂,但是對高性能程序開發人員來說,這些是無法透明的。很多應用,還是自己掌控比較有
效。這些場合中,匯編和C還是不可替代的。但是,光知道C是不夠的,掌握一門面向對象語言,相對更高層的語言,不僅對以後的個人發展有利,也會對自己的技
術認識產生幫助。
如果要問對我來說誰更重要,我覺得還是C更重要。C的學習曲線更陡,貌似簡單,實際上到處都是陷阱,看上去比較簡單低效的程序,也不是學1,2個月
就能搞定的。談到優化的深層次和難度嘛,需要的功底是按年算的。但是一旦你C語言的基礎打好了,對計算機的理解,對其他語言的理解都是大有裨益的。比如,
如果你有C基礎,可以說,學過1天python,就能寫的出來一些不短的程序。後面的優化也不是什麼大不了的演算法,都是非常基本的語句換來換去。當然這里
不是說 Python不好,實際上,上層應用,Python比C方便的不是一個層次。
很多人覺得,既然懂C了,那麼進一步掌握C++應該是水到渠成,但C++不是C的超集,而我又不喜歡C++的繁瑣和巨大,所以才決定看一看Python。我很喜歡Python的優雅與快捷。
語言類型
和C不一樣,Python是一種動態類型語言,又是強類型語言。這個分類怎麼理解呢?大概是可以按照下列說明來分類的:
靜態類型語言
一種在編譯期間就確定數據類型的語言。大多數靜態類型語言是通過要求在使用任一變數之前聲明其數據類型來保證這一點的。Java和 C 是靜態類型語言。
動態類型語言
一種在運行期間才去確定數據類型的語言,與靜態類型相反。Python 是動態類型的,因為它們確定一個變數的類型是在您第一次給它賦值的時候。
強類型語言
一種總是強制類型定義的語言。Java 和 Python 是強制類型定義的。您有一個整數,如果不明確地進行轉換 ,不能將把它當成一個字元串。
弱類型語言
一種類型可以被忽略的語言,與強類型相反。VBScript 是弱類型的。在 VBScript 中,您可以將字元串 『12′ 和整數 3 進行連接得到字元串』123′,然後可以把它看成整數 123 ,所有這些都不需要任何的顯示轉換。
對象機制
具體怎麼來理解這個「動態確定變數類型」,就要從Python的Object對象機制說起了。Objects(以下稱對象)是Python對於數據
的抽象,Python中所有的數據,都是由對象或者對象之間的關系表示的,函數是對象,字元串是對象,每個東西都是對象的概念。每一個對象都有三種屬性:
實體,類型和值。理解實體是理解對象中很重要的一步,實體一旦被創建,那麼就一直不會改變,也不會被顯式摧毀,同時通常意義來講,決定對象所支持的操作方
式的類型(type,包括number,string,tuple及其他)也不會改變,改變的只可能是它的值。如果要找一個具體點的說明,實體就相當於對
象在內存中的地址,是本質存在。而類型和值都只是實體的外在呈現。然後Python提供一些介面讓使用者和對象交互,比如id()函數用來獲得對象實體的
整形表示(實際在這里就是地址),type()函數獲取其類型。
這個object機制,就是c所不具備的,主要體現在下面幾點:
1 剛才說了,c是一個靜態類型語言,我們可以定義int a, char
b等等,但必須是在源代碼裡面事先規定。比如我們可以在Python裡面任意一處直接規定a =
「lk」,這樣,a的類型就是string,這是在其賦值的時候才決定的,我們無須在代碼中明確寫出。而在C裡面,我們必須顯式規定char *a =
「lk」,也就是人工事先規定好a的類型
2 由於在C中,沒有對象這個概念,只有「數據的表示」,比如說,如果有兩個int變數a和b,我們想比較大小,可以用a ==
b來判斷,但是如果是兩個字元串變數a和b,我們就不得不用strcmp來比較了,因為此時,a和b本質上是指向字元串的指針,如果直接還是用==比較,
那比較的實際是指針中存儲的值——地址。
在Java中呢,我們通過使用 str1 == str2 可以確定兩個字元串變數是否指向同一塊物理內存位置,這叫做「對象同一性」。在 Java 中要比較兩個字元串值,你要使用 str1.equals(str2)。
然後在Python中,和前兩者都不一樣,由於對象的引入,我們可以用「is」這個運算符來比較兩個對象的實體,和具體對象的type就沒有關系
了,比如你的對象是tuple也好,string也好,甚至class也好,都可以用」is」來比較,本質上就是「對象同一性」的比較,和Java中
的==類似,和 C中的pointer比較類似。Python中也有==比較,這個就是值比較了。
3
由於對象機制的引入,讓Python的使用非常靈活,比如我們可以用自省方法來查看內存中以對象形式存在的其它模塊和函數,獲取它們的信息,並對它們進行
操作。用這種方法,你可以定義沒有名稱的函數,不按函數聲明的參數順序調用函數,甚至引用事先並不知道名稱的函數。 這些操作在C中都是不可想像的。
4 還有一個很有意思的細節,就是類型對對象行為的影響是各方面的,比如說,a = 1; b =
1這個語句中,在Python裡面引發的,可能是a,b同時指向一個值為1的對象,也可能是分別指向兩個值為1的對象。而例如這個語句,c = []; d
= [],那麼c和d是肯定指向不同的,新創建的空list的。沒完,如果是」c = d =
[]「這個語句呢?此時,c和d又指向了相同的list對象了。這些區別,都是在c中沒有的。
最後,我們來說說為什麼python慢。主要原因就是function call
overhead比較大。因為所有東西現在都是對象了,contruct 和destroy 花費也大。連1 + 1 都是 function
call,像』12′+』45′ 這樣的要 create a third string object, then calls the string
obj』s __add。可想而知,速度如何能快起來?
列表和數組
分析Python中的list和C中的數組總是很有趣的。相信可能一些朋友和一樣,初學列表的時候,都是把它當作是數組來學的。最初對於list和數組區別的定性,主要是集中在兩點。首先,list可以包含很多不同的數據類型,比如
["this", 1, "is", "an", "array"]
這個List,如果放在C中,其實是一個字元串數組,相當於二維的了。
其次呢,list有很多方法,其本身就是一個對象,這個和C的單純數組是不同的。對於List的操作很多樣,因為有方法也有重載的運算符。也帶來一些問題,比如下面這個例子:
加入我們要產生一個多維列表,用下面這個語句
A = [[None] * 2] * 3
結果,A的值會是
[[None, None], [None, None], [None, None]]
初一看沒問題,典型的二維數組形式的列表。好,現在我們想修改第一個None的值,用語句
A[0][0] = 5
現在我們再來看看A的值:
[[5, None], [5, None], [5, None]]
發現問題沒有?這是因為用 * 來復制時,只是創建了對這個對象的引用,而不是真正的創建了它。 *3 創建了一個包含三個引用的列表,這三個引用都指向同一個長度為2的列表。其中一個行的改變會顯示在所有行中,這當然不是你想要的。解決方法當然有,我們這樣來創建
A = [None]*3
for i in range(3):
A[i] = [None] * 2
這樣創建了一個包含三個不同的長度為2的列表。
所以,還是一直強調的,越復雜的東西,越靈活,也越容易出錯。
代碼優化
C是一個很簡單的語言,當我們考慮優化的時候,通常想得也很簡單,比如系統級調用越少越好(緩沖區機制),消除循環的低效率和不必要的系統引用,等
等,其實主要都是基於系統和硬體細節考慮的。而Python就完全不一樣了,當然上面說的這些優化形式,對於Python仍然是實用的,但由於
Python的語法形式千差萬別,庫和模塊多種多樣,所以對於語言本身而言,就有很多值得注意的優化要點,舉幾個例子吧。
比如我們有一個list L1,想要構建一個新的list L2,L2包括L1的頭4個元素。按照最直接的想法,代碼應該是
L2 = []
for i in range[3]:
L2.append(L1[i])
而更加優化和優美的版本是
L2 = L1[:3]
再比如,如果s1..s7是大字元串(10K+),那麼join([s1,s2,s3,s4,s5,s6,s7])就會比
s1+s2+s3+s4+s5+s6+s7快得多,因為後者會計算很多次子表達式,而join()則在一次過程中完成所有的復制。還有,對於字元串操作,
對字元串對象使用replace()方法。僅當在沒有固定字元串模式時才使用正則表達式。
所以說,以優化為評判標准,如果說C是短小精悍,Python就是博大精深。
include和import
在C語言中的include非常簡單,因為形式單一,意義明確,當你需要用到外部函數等資源時,就用include。而Python中有一個相似的
機制,就是import。乍一看,這兩個傢伙挺像的,不都是我們要用外部資源(最常見的就是函數或者模塊(Python))時就用這個來指明么?其實不
然,兩者的處理機制本質區別在於,C中的include是用於告訴預處理器,這個include指定的文件的內容,你都給我當作在本地源文件中出現過。而
import呢,不是簡單的將後面的內容*直接*插入到本地裡面去,這玩意更加靈活。事實上,幾乎所有類似的機制,Python都比C靈活。這里不是說C
不好,C很簡練,我其實更喜歡C。
簡單說說這個靈活性。import在python中有三種形式,import X, from X import *( or a,b,c……),
X = __import__(』x')。最常用的是第二種,因為比較方便,不像第一種那樣老是用X.mole來調用模塊。from X
import *只是import那些public的mole(一般都是不以__命名的模塊),也可以指定a,b,c來import。
什麼時候用哪一種形式呢?應該說,在大多數的模塊文檔里,都會明確告訴你應該用哪種形式。如果需要用到很多對象,那麼from X import
*可能更合適一些,但是,就目前來看,大多數第三方Python庫都不推薦使用from molename import *
這種格式。這樣做會使引入者的namespace混亂。很多人甚至對於那些專門設計用於這種模式的模塊(包括Tkinter,
threading和matplot)都不採用這種方式。而如果你僅僅需要某個對象類a,那麼用from X import a比用import
X.a更好,因為以後你調用a的函數直接用a.function()既可以了,不用加X。
如果你連自己希望import的模塊都不知道怎麼辦?請注意,此時Python的優勢就體現出來了,我們可以用
__import__(mole)來調用mole,其中這個mole是字元串,這樣,可以在運行時再決定,你到底要調用什麼mole。舉
個例子:
def classFromMole (mole, Name):
mod = __import__ (mole)
return getattr (mod, Name)
這里,定義了一個函數classFromMole,你可以在代碼的任何時候調用它,
o = classFromMole (MoleOfTheClass, NameOfTheAttribute)()
只需要傳入字元串形式的你希望import的模塊MoleOfTheClass和其中屬性的名字NameOfTheAttribute(當然可以是數據也可以是方法),就能調用了,這個名字字元串不用事先指定,而是根據當時運行的情況來判斷。
順帶說一句,Python中import的順序也有默認規定,這個和C中的include有點類似,因為我們一般都是先include系統文件,再
include自己的頭文件(而且還有<>和「」的區別)。Python中呢,一般應該按照以下順序import模塊:
1. 標准庫模塊 — 如 sys, os, getopt 等
2. 第三方模塊
3. 本地實現的模塊。
全局變數
這里談全局變數呢,倒不是說Python和c的全局變數概念不同,他們的概念是相同的。只是在使用機制上,是有一些差異的。舉個例子:
– mole.py –
globalvar = 1
def func():
print globalvar
# This makes someglobal readonly,
# any attempt to write to someglobal
# would create a new local variable.
def func2():
global globalvar
globalvar = 2
# this allows you to manipulate the global
# variable
在 func這個函數中,globalvar是只讀的。如果你使用了globalvar =
xxx這種賦值語句,Python會重新創造一個新的本地對象並將新值賦給它,原來的對象值不變。而在func2函數中,由於我們事先申明了
globalvar是global的,那麼此時的更改就直接在全局變數上生效。