string,list,tuple

列表. 元组和字典

       Python支持3中基本序列数据类型:字符串string、列表list和元组tuple

 

       列表存储的通常是同种数据的序列,相反,元组通常存储异种数据的序列但这只是一种习惯,而非规则。

       元组的每个数据项都提供了元组所表示的总体信息中的一部分,假定一个元组表示某个班的一名学生,元组中可能包含学生的姓名、年龄、地址等信息。

       元组长度是事先确定的,不可在程序执行期间更改

       所以列表和元组的主要区别在于:列表是可变的,元组则是不可变的。

 

       Python不允许程序员选择采用传值还是传引用。Python参数采用的是传对象引用的方式,即函数收到的是对作为参数传递的值的一个引用。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到对一个可变对象的引用,就能修改对象的原始值相当于通过传引用来传递对象,而如果函数收到对一个不可变对象的引用,函数就不能直接修改原始对象相当于通过传值来传递对象。

functioin

函数

作用域规则

       Python定义了3个命名空间,分别是局部local、全局global和内建built-in命名空间。程序视图访问标识符的值时,python会按照特定顺序搜索命名空间(即局部、全局和内建命名空间),检查是否存在标识符,以及它的具体位置。

递归与重复

l  递归和重复都建立在一个控制结构的基础上。

l  重复使用的是重复结构,比如forwhile

l  递归使用选择结构,比如ifif/else

l  无论重复还是递归,实际都牵涉到重复性操作。区别在于:

n  重复是显式使用一个重复结构;

n  递归则是进行重复的函数调用;

l  两者都要进行终止测试:

n  重复会在循环继续条件为false时终止;

n  递归在识别出基本条件时终止;

l  由计数器控制的重复和递归都是逐渐终止:

n  重复会不断修改一个计数器,直到计数器的值使循环继续条件编程false

n  递归则不断对原始问题进行简化,直到抵达基本条件;

l  重复和递归都可能无休止地进行。

 

l  递归有很多缺点:它采用重复调用机制,不断产生函数调用开销,这不仅浪费处理器处理时间,还会占用大量内存。每次递归调用都会导致创建另一个函数拷贝(事实只是函数的变量),这会占用大量内存;

 

l  重复通常在函数内部发生,所以能忽略重复函数调用和额外内存分配的开销。

 

PS:一个由多个函数构成的程序与没有任何函数的一体式程序相比,会产生大量的函数调用,这些调用会占用大量的处理器时间和内存。但另一方面,一体式程序的编程、测试、调试和维护都比较复杂。

默认参数

       定义函数时,可以将一个或多个参数指定为默认参数,并可为其指定一个默认值。默认参数主要是为了提供方便,调用函数时,可以指定较少的参数数量。但是要注意,默认参数必须位于任何非默认参数的右边。调用有两个或更多默认参数的函数时,如果省略的参数不在参数列表最右边,那就必须省略它之后的所有参数。

比如:

       def box(length = 1, width = 1, height = 1):

              return length * width * height

关键字参数

       程序员可要求函数接收一个或多个关键字参数。函数定义为每个关键字指派一个默认值。函数即可使用关键字的默认值,也可在函数调用中为关键字指派一个新值(格式为keyword=value)。使用关键字参数时,参数在函数调用中的位置不必与它的函数定义中的位置一一对应。

 

functioin

函数

作用域规则

       Python定义了3个命名空间,分别是局部local、全局global和内建built-in命名空间。程序视图访问标识符的值时,python会按照特定顺序搜索命名空间(即局部、全局和内建命名空间),检查是否存在标识符,以及它的具体位置。

递归与重复

l  递归和重复都建立在一个控制结构的基础上。

l  重复使用的是重复结构,比如forwhile

l  递归使用选择结构,比如ifif/else

l  无论重复还是递归,实际都牵涉到重复性操作。区别在于:

n  重复是显式使用一个重复结构;

n  递归则是进行重复的函数调用;

l  两者都要进行终止测试:

n  重复会在循环继续条件为false时终止;

n  递归在识别出基本条件时终止;

l  由计数器控制的重复和递归都是逐渐终止:

n  重复会不断修改一个计数器,直到计数器的值使循环继续条件编程false

n  递归则不断对原始问题进行简化,直到抵达基本条件;

l  重复和递归都可能无休止地进行。

 

l  递归有很多缺点:它采用重复调用机制,不断产生函数调用开销,这不仅浪费处理器处理时间,还会占用大量内存。每次递归调用都会导致创建另一个函数拷贝(事实只是函数的变量),这会占用大量内存;

 

l  重复通常在函数内部发生,所以能忽略重复函数调用和额外内存分配的开销。

 

PS:一个由多个函数构成的程序与没有任何函数的一体式程序相比,会产生大量的函数调用,这些调用会占用大量的处理器时间和内存。但另一方面,一体式程序的编程、测试、调试和维护都比较复杂。

默认参数

       定义函数时,可以将一个或多个参数指定为默认参数,并可为其指定一个默认值。默认参数主要是为了提供方便,调用函数时,可以指定较少的参数数量。但是要注意,默认参数必须位于任何非默认参数的右边。调用有两个或更多默认参数的函数时,如果省略的参数不在参数列表最右边,那就必须省略它之后的所有参数。

比如:

       def box(length = 1, width = 1, height = 1):

              return length * width * height

关键字参数

       程序员可要求函数接收一个或多个关键字参数。函数定义为每个关键字指派一个默认值。函数即可使用关键字的默认值,也可在函数调用中为关键字指派一个新值(格式为keyword=value)。使用关键字参数时,参数在函数调用中的位置不必与它的函数定义中的位置一一对应。

 

libraries and resources of Python

Python的库和资源

由于设计者和开源社区的共同努力,在python中有大量优秀的库可以被直接调用以高效地完成不同需求的工作。这里列举一些常见常用的库:
  Tkinter———— Python默认的图形界面接口。
  Tkinter是一个和Tk接口的Python模块,Tkinter库提供了对Tk API的接口,它属于Tcl/TkGUI工具组。Tcl/Tk是由John Ousterhout发展的书写和图形设备。Tcl(工具命令语言)是个宏语言,用于简化shell下复杂程序的开发,Tk工具包是和Tcl一起开发的,目的是为了简化用户接口的设计过程。Tk工具包由许多不同的小部件,如一个按钮、一个滚动条等。通过Tk提供的这些小部件,我们就可快速地进行GUI开发。PerlScheme等语言也利用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程序员可在程序中集成2D3D的图形。
  NumPyNumArraySAGE———— NumArrayPython的一个扩展库,主要用于处理任意维数的固定类型数组,简单说就是一个矩阵库。它的低层代码使用C来编写,所以速度的优势很明显。NumPyNumarray的后继者,用来代替NumArraySAGE是基于NumPy和其他几个工具所整合成的数学软件包,目标是取代 Magma, Maple, MathematicaMatlab 这类工具。
  MySQLdb模块———— 用于连接MySQL数据库。还有用于zope ZMySQLDA模块,通过它就可在zope中连接mysql数据库。
  PyGTK ———— 用于python GUI程序开发的GTK+库。GTK就是用来实现GIMPGnome的那个库。有了它,你完全可以自信的尝试自己制造Photoshop
  PyQt ———— 用于pythonQt开发库。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)。可在WindowsLinux平台下使用。
  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 ———— PythonWindows扩展
  pywmi ———— 省了好多折腾功夫
  reportlab ———— Python操作PDFLibary
  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的人会非常喜欢,简直是同一架构
  PIL———— Python 的图像处理库,可以打开数十种图像格式,还提供许多图像处理函数,如图像增强、滤波算法等。
  Pyro———— Python实现与JAVA RMI类似的技术
  PLY———— 基于PythonLEXYACC的语言工具
  Corepy———— 使用Python开发编写x86汇编程序
  LightCloud———— Python实现的分布式的键值数据库
  Parallel PythonPP———— 轻松开发SMP、集群并行计算的库
  开源社区的工作已经完成到这样的程度,基本上各种常见的编程需求都已经有非常成熟稳定高速的模块来实现,你所需要做的,只是去把它找出来然后阅读文档。

  官方主页 http://www.python.org/
  For windows python解释器(包括tkInterGUI开发环境,一个简单的IDE,完整广泛的英文文档)9MBhttp://www.python.org/ftp
 /python/2.4.3/python-2.4.3.msi

the choice of GUI development using python

python进行GUI开发的选择

clip_image002

Python最大的特点就在于她的快速开发功能。作为一种胶水型语言,python几乎可以渗透在我们编程过程中的各个领域。这里简单介绍一下用python进行gui开发的一些选择。

1.      Tkinter

clip_image004

Tkinter似乎是与tcl语言同时发展起来的一种界面库。tkinterpython的配备的标准gui库,也是opensource的产物。Tkinter可用于windows/linux/unix/macintosh操作系统,而且显示风格是本地化的。Tkinter用起来非常简单,python自带的IDLE就是采用它写的。除此外,tkinter的扩展集pmwTix功能上都要相对它强大,但tkinter却是最基本的。我认为,在用pythongui开发,tkinter是最基本的知识,所以这个环节是必须要学习的。你或许在以后的开发中并不常用tkinter,但是一些小型的应用上面,他还是很有用的,而且开发速度也很快。 

2.      WxPython

clip_image005

WxWidgets应该算是近几年了比较流行的GUI跨平台开发技术了。wxWidgets有不同的版本应用,有c++的,也有basic的,现在在python上面也有较好的移植。wxpython的功能上面要强于tkinter,她提供了超过200个类,面向对象的编程风格,设计的框架类似于MFC。对于大型GUI应用上面,wxPython还是具有很强的优势的。boa constructor可以帮助我们快速可视地构建wxwidgets界面。 

3.      PyQT

clip_image006

Qt同样是一种开源的GUI库,Qt的类库大约在300多个,函数大约在5700多个。Qt同样适合于大型应用,由它自带的qt designer可以让我们轻松来构建界面元素。 

4.      pyGtk

clip_image007

GtklinuxGnome的核心开发库了。功能上面非常齐全。值得说明的是,在windows平台下gtk的显示风格并不是特别本地化。不过他带的glade的界面设计器还是可以帮你省不少事的。 

5.      Jython

clip_image008

尝试过用python访问java类库吗,那么就用jython吧。jython其实可以认为是另外一个python开发环境,基于java的,但是大多数的CPython调用jython下还是可以的。你可以在jython环境下像使用java一样来通过python的语法来调用java语言,真的很酷。 

6.      MFC

clip_image010

Windows Pywin32允许你像VC一样的形式来使用PYTHON开发win32应用。代码风格可以类似win32 sdk,也可以类似MFC,由你选择。如果你仍不放弃vc一样的代码过程在python下,那么这就是一个不错的选择。 

7.      PythonCard

clip_image012

PythonCard其实是对wxPython的再封装。不过封装的更加简单,使用起来觉得比wxPython更直观,也更简单化了。 

8.      Dabo

clip_image013

仍是一个基于wxpython的再封装库,没用过,不太了解。它提供数据库访问,商业逻辑以及用户界面。 

9.      AnyGui

clip_image014

通过底层的api来访问其它工具集,像tkinter,wxpythonqt.具体也没怎么用过。

10. WPY

clip_image015

MFC风格的Gui开发库,代码风格也类似于MFC,仅管如此,你依旧可以使用这个库来开发GUI应用,而不用担心平台移植的问题。她同样是一个跨平台的库。 

11. IronPython

clip_image016

如果你要想开发.net下面的应用的话,那么IronPython就是你的选择,与jython有点类似,他同样支持标准的python模块,但同样增加了对.net库的支持。你也可以理解为他是另一个python开发环境。你可以非常方便地使用python语法进行.net应用的开发,这一点听起来真的挺有意思。 

总结

所以:

l  如果你是java用户,那么你就用jython吧,除了可以享受python的模块功能及语法外,你可以找到许多 java的影子;

l  如果你是.net用户,那么就用iron python吧;

l  如果你对Visual C++很熟悉,那么你可以使用MFC,WPY或是wxPython,当然我更建议wxPython了。

l  当然,我认为对于tkinter是每一个原来搞C的人都应该了解和学习的GUI库,因为她很轻便,小型应用就可以使用她来搞定,对于较大型应用可以采用pyGtk,pyQt,WxPython PythonCard来搞定,这样的话,既可以注重知识的衔接性,也可以快速进行软体的开发了