Python-语法
sf2gis@163.com
2015年1月1日
1 基本语法
单行多语句与多行单语句:单行多语句使用;分隔。多行单语句使用\换行。
标识符:与C相同(大小写敏感)。
不支持重载标识符。
语句层次通过缩进来体现。
获取帮助:help(函数名)。
入口函数:当.py文件被执行时,此模块的名称(__name__)将被设置为__main__,通过判断此名称,可以确保当前模块的执行状态。
参考:http://python.usyiyi.cn/python_278/tutorial/datastructures.html
1.1 注释:
独立注释:#
文档字符串注释:在函数、文件、模块的首行添加一行字符串,充当注释,可以用来自动生成文档。
1.2 基本类型
1.2.1bool
1/True 、0/False。
1.2.2字符串(ansi型):
字符列表组成。索引从0开始,负值索引表示从右向左。单字符表示字符串长度为1。
使用单引号或双引号(意义相同)。\为转义字符。
’’’三引号用于定义多行字符串(自动加入\n换行),其中可自由使用单行字符串’’/””。
续行字符:用于行尾的\。
使用print打印字符串。
r/R前缀可以取消转义字符为显示字符。
两个相邻的字符串字面值自动合并。支持+串联,*重复,\换行。支持列表操作【start,end】取部分列表(包括start,不包括end)(start默认值0,end默认值为全部长度)。
len()返回长度。
无法编辑,只能创建新值。注意:字符串值是只读的。
1.2.3Unicode字符串:
使用u/U前缀声明的字符串就是unicode编码的。encode():Unicode-》ansi,decode()相反。
1.2.4print
打印字符串。如果添加后缀逗号,则不换行。
1.3 操作符
+-*%/(整除,如果两个int操作,则floor整除,如果有浮点数参与,则是浮点除,默认使用double型浮点数),
//(用于整除,无论何种类型都是floor整除)。
**:幂
=:赋值,变量要求先定义后使用。
_:只读型快捷变量,用于表示最近一次操作的结果,定义此变量将会屏蔽全局变量。
in:判断是否在容器中。
del:一切对象的删除功能。
not:否定前缀。
is:相同判断。
and:并。
or:或。
< > ==:比较运算符,可以连续比较。相当于and连接共享操作值。不同类型的比较,只比较类型名。
type():获取类型。
不运行++ --
1.4 流程控制
选择:if…elif…else。无switch…case。
循环:for it in list。whilecond。+else。continue。break。
范围函数:range(start,end,step):生成等差数组列表。
占位语句:pass。
2 函数定义
2.1.1声明
2.1.1.1 def 函数名(参数)
第一行为简介,之后与doxygen相同。默认返回None。可以定义默认值,但默认值只计算一次,如果默认值为容器,则可能会有添加多次。可以使用关键字参数。可以使用可变参数,*name表示一维容器。**name表示字典类型。
return 返回值。
2.1.1.2 lambda表达式: 返回一个匿名函数。
目标:单行函数的简洁写法,尽量不要使用。
方法:lambda表达式
格式:lambda 参数:方法。
参考:http://www.cnblogs.com/evening/archive/2012/03/29/2423554.html
示例:
g=lambda x:x+1
g(1)
>>>2
或者
lambda x:x+1(1)
>>>2
3 容器
参考:http://hi.baidu.com/xifanwu/item/349ea5e269e8aff12a09a4c7
3.1 列表list
可变数组。
使用【】或list()生成。
由【】包裹,逗号分隔声明。支持索引和切片。可读写。可以为切片赋值改变列表。支持+,append(),len()。
3.1.1方法
append,extend,insert,remove,pop,index,count,sort,reverse。
3.1.2应用
3.1.2.1 stack
append()+pop()
3.1.2.2 queue
使用collections.deque,append()+popleft。
3.1.2.3 函数式编程
内置函数:filter,map,reduce,sum(seq)
filter(f,seq):过滤,返回结果为true的输入容器。
map(f,seq):映射,返回所有输入序列的结果。
reduce(f,seq):递减,逐次输入,并返回最终结果。
3.1.2.4 列表解析:快速构建列表
计算规则为由左向右依次深入。可以进行各种复杂的组合。
3.2 元组tuple
只读型常量列表。用()表示,可以混合类型。
使用()或tuple()创建。
只有一个值的元组,用(value,)表示。
3.2.1序列拆分
将元素中值依序列拆分后赋予变量列表。
3.3 集合set
不重复无序集合。是dict只有key的情况。
支持并|,交&,差-,异或^。
支持列表解析。
使用set()或{}创建,空集只能用set()创建。set()需要列表作为参数。
set(['a', 'r', 'b', 'c', 'd'])
{xfor x in'abracadabra'if x notin'abc'}
3.4 forzenset
set的常量型,不可变。
3.5 字典dict
键值对。使用dict()创建。{}可以创建空集合。
支持列表解析,append,extend,keys()。sorted(),in。
{key:value,key:value}
迭代器:iteritems()。只用于遍历字典。返回单个key-value。
示例:
dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
{'sape': 4139, 'jack': 4098, 'guido': 4127}
{x: x**2for x in (2,4,6)}
dict(sape=4139, guido=4127, jack=4098)//注意,此时key,value都是字符型
3.6 操作
详细参见:python-库.docx
3.6.1遍历:enumerate(枚举)
返回index,value。
示例:
>>> a=['a','b','c']
>>> b=enumerate(a)
>>> b.next()
(0, 'a')
>>> b.next()
(1, 'b')
3.6.2结合运算:zip()
返回几个容器中相同index的值的成组操作。
zip(col1,col2):将集合1,2合并。使用*zip可以分解。
3.6.3反向:reversed()。
只能用于遍历之中。
3.6.4排序:sorted()。
循环内部修改:使用副本循环,修改原始版本。
>>> words= ['cat','window','defenestrate']
>>> for w in words[:]: # Loop over a slice copy of the entire list.
... iflen(w)>6:
... words.insert(0, w)
切片:slice(),生成部分集合,为【】的内部调用
和:sum()
个数:len()。
3.6.5迭代器:iter(0,sentinel)
返回一个迭代器。如果sentinel不存在,则返回一个o的迭代器。如果sentinel存在,则每个调用o的next()函数,如果与sentinel相同,则结束。
3.6.6操作迭代器:next()
进入下一个。
3.6.7函数式编程:reduce(fun,iterator,initializer)
使用fun调用迭代器中的两个元素值进行计算,并将结果后延续。
参考:http://blog.youkuaiyun.com/ithomer/article/details/13021275
4 模块-功能脚本文件
全局变量:global name
4.1 定义
模块以文件为单位组织,模块名就是文件名。
模块中包含可执行语句和函数、变量定义。可执行语句只在首次导入或运行时才会运行。
_表示模块内私有数据,不能*方式导入。
4.2 使用
模块可以作为命名空间使用,使用import导入模块(只需导入模块名,不需要.py,整个程序只导入一次)(只能导入模块,不能导入其中函数、类或者变量),reload(模块)将重新导入模块。
使用时,需要模块名.变量名/函数名,简化方式是定义为本地变量来简化书写,from 模块名 import 变量名/函数名将自动定义变量名/函数名的本地名称。使用from 模块名 import *,将自动定义所有变量名/函数名的本地名称(私有数据除外)。
使用__name__可以获取模块名,被导入时,模块名为文件名,当作为脚本运行时,模块名为”__main__”。 ”__main__”名称的模块会进行main()参数解析,可以使用sys模块的argv列表获取。
4.3 搜索路径
模块搜索路径:导入时:内置库-》sys.path()目录。sys.path()目录为一个目录列表,当前目录为首元素,pythonpath为第二元素,其它目录可以依次添加。
4.4 编译pyc/pyo
已编译的模块文件pyc:用于快速启动,忽略解释器的编译过程。pyc中包含源文件py的时间信息,如果不符,则忽略pyc,重新编译。每次py编译成功后,会自动更新pyc。
pyc或pyo文件都不能加快运行速度,只能加快加载速度。直接执行的py文件不会生成pyc或pyo文件,因此,为了加快启动速度,可以使用简短的引导程序作为执行py,然后在其中使用pyc或pyo文件。
pyc/pro文件可以直接运行,不依赖于同名py文件。可以用于发布编译后文件,免于直接公布代码(pyc反向工程比较容易)。
4.5 标准库
Python有丰富的标准库,部分被内建于解释器。sys被内建于所有平台的解释器,sys.ps1,sys.ps2对应cmd主、次提示符。sys.path()是列表类型的搜索路径。
dir():内建函数,用于显示模块中定义的函数和变量、模块。返回已排序的字符串列表。默认显示当前模块中的函数、变量、模块。
__builtin__模块包含了所有的内建函数、变量、模块。
__builtins__:尚未定型用途,一般在main()中表示__builtin__模块,在其它中可以自定义。python3中已经更名,不推荐使用。
参考:
http://stackoverflow.com/questions/11181519/python-whats-the-difference-between-builtin-and-builtins
5 包
python使用包作为命名空间。
包是文件夹并具有__init__.py文件作为包的标识。
__init__.py中可以定义__all__列表,表示要导入的子模块列表。在from 包 import *时会导入此列表中的子模块,如果不定义,则不起作用。
可以使用绝对导入(隐式相对导入)或显示相对导入(.或..表示级别)。
包路径被设置为最先搜索路径。
*不能导入子包,只能导入包中模块。
6 输入输出
读取标准输入:raw_input()
6.1 字符串
任意类型转换为字符串:str():返回适合人类阅读的字符串。repr():返回解释器使用的字符串。除字符串和浮点数外,两者相同。
对齐:string.rjust(right adjust,右对齐,需要指定输出宽度),ljust,center。
填充0值位数:string.zfill(n):如果整数不足n位,向左侧填充0值。
format格式:使用{}为占位符,其中可以使用索引或key值。!s(默认,使用str()转化),!r(使用repr()转化)。详细说明参见帮助(与C类似)。
6.2 文件操作
打开文件:open(filename,mode)方法返回一个文件对象。使用with open() as f时,使用完成自动关闭。file()与open()相同。
关闭文件:f.close()。
读取文件:f.read(size),f.readline(),f.readlines(),list(f)。
写入文件:f.write(),只能写入字符串。
位置:f.tell(),f.seek(offset,startpos)
json:json模块运行json数据的序列化(json->string)和反序列化(string->json)。使用dumps,loads,load,dump。
7 语法错误和异常
7.1 语法错误
解释器无法正常解释语句时出现的错误提示,会有^标示出错误位置。标识为SyntaxError。
7.2 异常
运行时出现的错误称为异常。标识为*Error,表示各种异常。
捕获异常:
try 测试代码
except 异常处理
else 正常处理
finally 清理程序
抛出异常:raise
8 类
多继承。所有成员函数都是虚的。所有成员都是公开的。
多继承时,从左到右,深度优先。
不会自动调用基本的构造函数,需要手动调用。
8.1 定义
注意:对象是不变的,也就是传递时参数是按引用传递的。
类的全局变量是静态的,类的实例变量的是区分实例的。实例变量通过self.var定义。
声明成员函数时,第一个参数表示对象本身,调用时默认使用自身为第一个参数。
构造函数:__init__。
析构:__del__
函数对象和方法对象:函数对象接受参数列表,方法对象是第一个参数为对象本身的函数对象。
使用__name标识的成员都是私有的(其实只是将其改变为_classname__name的公开成员,为了避免基类与子类的命名冲突)。
模块的属性都是可写的。
可写的属性都可以使用del删除。
__class__表示对象所属的类。
8.2 继承
继承方法:class devide(base):…
子类调用基类方法:base.method(self,arg)
关系检测:isInstace(),issubclass()
8.3 迭代器
定义迭代器后可以使用for…in…循环。python使用__iter__()函数返回包含next()函数的对象(通常是自身)。next()判断当前的索引值,并返回当前值。
示例:
classReverse:
"""Iterator for looping over a sequence backwards."""
def__init__(self, data):
self.data= data
self.index=len(data)
def__iter__(self):
returnself
defnext(self):
ifself.index==0:
raiseStopIteration
self.index=self.index-1
returnself.data[self.index]
8.4 生成器
自动创建迭代器。生成器使用yield代替return来标记,具有此标记的函数被创建为生成器,自动创建__iter()和next()。使用时直接传入参数,返回值将具有上述两个函数。
在使用生成器作为参数的函数中,可以直接使用生成的实体函数作为表达式。
defreverse(data):
for index inrange(len(data)-1,-1,-1):
yield data[index]
for char in reverse('golf'):
print char
输出:
f
l
o
g