⑴ 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的,那么此时的更改就直接在全局变量上生效。