var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2007年12月25日

    Python学习

    分类:

    1989年圣诞节期间,荷兰·阿姆斯特丹, Guido van Rossum为打发圣诞节的无趣,决心开发一个新的脚本解释程序,作为 ABC 语言的一种继承,第一个Python实现运行在Mac机。之所以选中 Python(巨蟒)作为程序的名字,是因为他是一个Monty Python的飞行马戏团的爱好者。

     

    Python是一个动态的面向对象编程语言,一门跨平台的脚本语言,可移植度非常高,可用于许多种软件开发除了OS和驱动程序。它提供强有力的支持来集成其他语言和工具,具有非常庞大的标准库,可以很容易地通过CC++扩展新函数和数据类型,并可以在几天内学会。许多Python程序员报告生产率大幅度提高并感觉该语言促进更高质量、更可维护的代码开发。

     

    Python Windows安装。从官网下载页面选择对应的Windows版本,按默认安装到%SystemDrive%\Pythonversion’,安装完成重启计算机后,在系统属性->环境变量->系统变量中选择变量Path,在该变量值最后添加';%SystemDrive%\Pythonversion或只针对当前窗口设置,在cmd下输入set path=%path%;%SystemDrive%\Pythonversion窗口关闭后设置失效。

     

    通常Linux/Unix/UnixPython的解释器被安装在'/usr/local/bin/python'目录下,把'/usr/local/bin'目录放进Shell的搜索路径里。要测试你的操作系统安装了Python,在命令行的shell提示符下输入命令python –v,如果见到版本信息,说明已经安装了Python

     

    调用Python解释器。在命令行的shell提示符下键入python,启动解释器,然后解释器进入交互模式,shell提示符变为主提示符’>>>’,其下调出帮助输入help()或者help(object),按q退出帮助,想要获取操作符的帮助,需要正确的设置PYTHONDOCS环境变量;或者在命令行中直接执行语句python -c command [arg] ...’;或者直接执行有些能作脚本使用的python模块 python -m module [arg] ...’。输入文件结束符(EOF)Windows上是Ctrl+z或者F6再按EnterLinux/Unix/Unix上是Ctrl+d,解释器会以0值退出,如果没起作用,输入命令退出import sys; sys.exit()

     

    BSDUnxi系统中,Python若要像Shell脚本那样直接执行,只要在脚本文件开头写一行命令#! /usr/bin/env python;在某些平台上,第一行必须以Unix的行结束符('\n')结束,不能用Mac('\r')或者Windows('\r\n')结束。Python脚本能使用ASCII以外的字符集,最好的做法是在#!行后用注释行来定义字符集# -*- coding: encoding -*-,根据该声明,Python会尝试将文件中的字符编码转为encoding编码,并尽可能将该编码直接写成Unicode文本,中文推荐用gb2312或者utf_8来处理。每次解释器启动时执行一些命令,可以用PYTHONSTARTUP环境变量来指定一个文件包含你想要执行的命令。这个文件在交互会话期是只读,但从脚本中读文件或者以终端'/dev/tty'做为外部命令源时该环境变量无效。如果想从某个脚本中启动文件,必须在脚本中加入:

    import os

    filename = os.environ.get(’PYTHONSTARTUP’)

    if filename and os.path.isfile(filename):

       execfile(filename)

     

    Python中有4种类型的数——整数、长整数、浮点数和复数。单引号('/双引号(")指示字符串,三引号('''"""),你可以指示一个多行的字符串。转义符(\)表转义或字符串在下一行继续。自然字符串通过给字符串加上前缀rR来指定常用于正则表达式,Unicode字符串通过给字符串加上前缀uU来指定。如果两个字符串按字面意义相邻放着,它们会被Python自动级连。

     

    不要混合使用制表符和空格来缩进,因为这在跨越不同的平台的时候,无法正常工作。在每个缩进层次使用单个制表符或两个或四个空格 。选择这三种缩进风格之一。更加重要的是,选择一种风格,然后一贯地使用它,即只使用这一种风格。

     

    流程控制

    if x<0:.. elif ... elif ... else ...

    while conditions: ...

    for x in a/a[:]: ...

    内置函数range()能生成一个等差级数链表:range(10)range(5, 10)range(-10, -100, -30)第三个数为步长。

    break语句用于跳出最近一级的for或者while循环,continue表示跳过当前循环块中的剩余语句,然后继续执行下一轮循环。

    pass语句什么也不做,用于那些语法上必须要有什么语句,但程序什么也不做的场合。

    定义函数def f(arguments...,**name...): ... global x... return...;默认参数值和关键参数。

    文档字符串(DocStrings) 帮助程序文档更加简单易懂,在函数的第一个逻辑行描述对象用途。首行以大写字母开始,句号结尾,第二行是空行,从第三行开始是详细的描述。用__doc__调用该函数的文档字符串属性。

     

    模块

    模块基本上就是一个包含了所有你定义的函数和变量的文件。为了在其它程序中重用模块,模块的文件名必须以.py为扩展名。模块的不带__前缀的模块名可以由全局变量__name__得到。

    import modname; modname.f... modname.itemname...

    from modname import *...,f...,itemname...

    导入一个modname的模块时,解释器先在当前目录中搜索名为'modname.py'的文件,然后在环境变量PYTHONPATH定义的目录列表中搜索,然后是环境变量PATH中的路径列表,最后搜索安装目录(Unix中通常是'.:/usr/local/lib/python')。实际上,解释器由sys.path变量指定的路径目录搜索模块,该变量初始化时默认包含了输入脚本(当前目录)PYTHONPATH和安装目录。Windowssys.path内置的位置可以查找注册表项:HKLM\SOFTWARE\Python\PythonCore\version\PythonPath。为提高Python程序启动速度,引入了字节编译的文件,这些文件以.pyc作为扩展名。

    内置函数dir(modname)按模块名搜索模块定义,它返回一个字符串类型的存储列表;但不会列出内置函数和变量名,如果想列出这些内容,需要查看标准模块__builtin__

    del itemname...用来删除一个变量/名称。

    包通常是使用“圆点模块名”的结构化模块命名空间,以避免模块之间的命名冲突。'__init__.py'文件使得Python视某目录为一个包,'__init__.py'可以是一个空文件,也可以包含了包的初始化代码,或者设置了__all__’变量(包索引链表)

    import A.B.C使用时必须通过完整名称来引用。

    from package import item...

    from package import * __all__定义导入模块。

    变量'__path__'在包的’__init__.py’文件代码执行之前初始化一个目录名列表,作用于包中的子包和模块的搜索功能。用于扩展包中的模块集,但不常用。

     

    数据结构

    有四种内建的数据结构——列表、元组、集合和字典。

    list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目。列表中的项目包括在方括号中,它的所有方法:append(x),extend(L),insert(i,x),remove(x),pop([i]),index(x),count(x),sort(),reverse()。有三个内置函数非常有用:filter(function, sequence),map(function, sequence),reduce(function, sequence)

    另一种标准序列类型元组,一个元组由数个逗号分割的值组成,在输出时元组总有括号,元组是不可改变的。

    集合(set)是一个无序不重复元素的集,基本功能包括关系测试和消除重复元素。集合对象还支持联合(union),交(intersection),差(difference)和对称差集(sysmmetric difference)等数学运算。

    字典(dictionary)以关键字(唯一,不可变类型,常用字符串或数值)为索引,关键字:值对(key: value pairs)集合。键值对在字典中以这样的方式标记:d={key1:value1,key2:value2},字典中的键/值对是没有顺序的。字典的主要操作是依据关键字来存储和取值,也可用del来删除关键字:值对。keys()方法返回由所有关键字组成的链表,sort()方法使链表有序,has_key()方法或in关键字来检查字典中是否存在某一关键字,链表中如存储关键字-值对元组,dict()方法可以从中直接构造字典。在字典中循环,关键字和值可以使用iteritems()方法同时读出;在序列中循环,索引位置和值可以用enumerate()方法同时得到;同时循环两个或更多的序列,用zip()整体读出。不同类型的对象比较中,链表<字符串<元组等等。

    序列的两个主要特点是索引操作符和切片操作符,索引操作符让我们可以从序列中抓取一个特定项目,切片操作符让我们能够获取序列的一个切片,即一部分序列。列表的赋值语句不创建拷贝,使用切片([:])操作符才能建立序列的拷贝。

     

    输入和输出

    函数str()将值转化为适于人阅读的形式(如没有则返回与repr()等同的值),而repr()转化为供解释器读取的形式,用来取得对象的规范字符串表示,反引号(也称转换符-``)可以完成相同的功能。raw_input(prompt)直接把输入作为字符串返回,input(prompt) raw_input的基础上把字符串转换为数字返回。

    open(filename, mode)方法返回一个文件,分别使用file类的read()readline()readlines()write()tell()seek(offset,from_what)方法来恰当地读写文件,调用close()方法来告诉Python完成了对文件的使用。

    Python提供一个叫pickle的标准模块,几乎可以把任何Python对象表达为字符串,这一过程称为封装(pickling),从字符串表达出重新构造对象称为拆封(unpickling)。封装状态中的对象既可以存储在文件或对象中,又可以通过网络在远程的机器之间传输。还有另一个模块称为cPickle,它的功能和pickle模块完全相同,只不过它是用C语言编写的,因此要快得多(比pickle1000倍)。
    一个对象x,一个以写模式(‘w’)打开的文件对象f

    pickle.dump(x, f)  #把对象存储到打开的文件f

    x = pickle.load(f)  #取回存储在文件f中的对象

     

    错误和异常

    语法错误(Syntax errors)也称解析错误。

    在程序运行中检测出的错误称为异常(Exceptions)

    使用try…except语句来处理异常,通常的语句放在try块中,错误处理语句放在except块中。首先,执行try子句,如果没有异常发生,except子句在try语句执行完毕后被忽略;如果有异常发生,那么try子句其余部分被忽略,如果异常匹配except关键字后指定的异常类型,就执行对应的except子句,如果异常没匹配except关键字后指定的异常类型,它就会传递到上一级try语句中,如果始终无法找到对应的处理语句,它将称为一个未处理的异常,终止程序运行,显示提示信息。try...except语句可带一个else子句,该子句只能出现在所有except子句之后,当try语句没有跑出异常时,需要执行一些代码时可以用这个子句。

    可以使用raise语句抛出异常,第一个参数指定异常的名称,第二个指定异常的参数。

    try...finally用于在任何情况下都一定要执行finally子句。

    with语句使得文件之类的对象总能保证及时准确地进行清理。

     

    类创建一个新类型,而对象是这个类的实例。

    类的方法与普通的函数只有一个特别的区别——它有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,它的名称是self

    class ClassName:…

    x = ClassName()

    实例化操作时,类定义了一个名为__init__()的特殊方法:

    def __init__(self):

    self.data = []

    方法__del__(self),它在对象消逝的时候被调用。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。

    方法__str__(self)在我们对对象使用print语句或是使用str()的时候调用。

    方法__lt__(self,other)当使用小于运算符(<)的时候调用,类似地,对于所有的运算符(+>等等)都有特殊的方法。

    方法__getitem__(self,key)使用x[key]索引操作符的时候调用。

    方法__len__(self)对序列对象使用内建的len()函数的时候调用。

    Python中所有的类成员(包括数据成员)都是公共的,所有的方法都是有效的。但如果你使用的数据成员名称以双下划线前缀,Python的名称管理体系会有效地把它作为私有变量。如果某个变量只想在类或对象中使用,就应该以单下划线前缀。

    继承class DerivedClassName(modname.BaseClassName):…

    多继承class DerivedClassName(Base1, Base2, Base3):…

     

    标准库

    1.     os模块提供与操作系统相关联的函数。

    2.     glob模块提供了一个函数用于从目录通配符搜索中生成文件列表。

    3.     命令行参数以链表形式存储于sys模块的argv变量,sys还有stdin,stdoutstderr属性。

    4.     re模块为高级字符串处理提供了正则表达式工具。

    5.     textwarp模块格式化文本段落以适应设定的屏宽。

    6.     pprint模块美化打印使得数据结构显示的更清晰。

    7.     math模块为浮点运算提供了对底层C函数库的访问。

    8.     decimal模块提供了一个‡Decimal数据类型用于浮点数计算。

    9.     random模块提供了生成随机数的工具。

    10. datetime模块为日期和时间处理同时提供了简单和复杂的方法。

    11. locale模块访问定义好的国家信息数据库。

    12. urllib2模块用于处理从urls接收的数据,smtplib模块用于发送电子邮件。

    13. zlib,gzip,bz2,zipfiletarfile模块支持通用的数据打包和压缩格式。

    14. timeit模块提供性能度量工具,profile模块提供了针对更大代码块的时间度量工具。

    15. doctest模块扫描模块并根据程序中内嵌的文档字符执行测试,unittest模块在一个独立的文件里提供一个更全面的测试集。

    16. xmlrpclib,SimpleXMLRPCServer模块实现了在琐碎的任务中调用远程过程。

    17. logging模块提供了完整和灵活的日志系统。

    18. array模块提供了一个类似链表的array()对象,collections模块提供了一个类似链表的deque()对象,bisect模块操作存储链表,heapq模块提供了基于正规链表的堆实现。

    19. struct模块提供pack()unpach()函数用于变长二进制纪录格式。

    20. email包是一个邮件消息管理库,可以处理MIME或其它基于RFC 2822的消息文档。

    21. xml.dom,xml.sax包为流行的信息交换格式提供了强大的支持。

    22. 国际化由gettext,localecodecs包支持。

     

    当要使函数接收元组或字典形式的参数的时候,分别使用***前缀在函数需要获取可变数量的参数的时候特别有用。lambda语句被用来创建新的函数对象,并且在运行时返回它们。exec语句用来执行储存在字符串或文件中的Python语句,eval语句用来计算存储在字符串中的有效Python表达式。assert语句用来声明某个条件是真的。

     

    本文PDF下载

    Python的成功之路

    分享到:

    历史上的今天:

    敏捷测试 2011年12月25日
    MSN协议 2009年12月25日