Python语法

http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html


---------------------冒号

if/while/for/def  等语言,首行以关键字开始,以冒号结束


x += 1;  不支持x++,--x
x,y,z = 1,2,3   支持多元赋值


_xxx_ 系统定义名字    
_xxx 类中的私有变量名


增加引用计数
对象被创建x=1、别名被创建y=x、参数传递给函数foobar(x)、容器对象的一个元素myList = [1,x,3]
减少引用计数
本地引用离开作用范围、使用del x、对象的一个别名重新被赋值、myList.remove(x)


dir()用来查询一个类或者对象所有属性
help()用来查询的说明文档


---------------------------------字典的使用:
字典和表类似的地方,是包含有多个元素,每个元素以逗号分隔。但词典的元素包含有两部分,键和值,常见的是以字符串来表示键,也可以使用数字或者真值来表示键(不


可变的对象可以作为键)。值可以是任意对象。键和值两者一一对应。词典的每个元素是键值对。元素没有顺序。
dic = {'tom':11, 'sam':57,'lily':100}
print dic['tom']


词典元素的循环调用
dic = {'lilei': 90, 'lily': 100, 'sam': 57, 'tom': 90}
for key in dic:
    print dic[key]


词典的常用方法
dic.keys()           # 返回dic所有的键
dic.values()         # 返回dic所有的值
dic.items()          # 返回dic所有的元素(键值对)
dic.clear()                # 清空dic,dict变为{}


-------------------文件对象
创建文件对象
我们打开一个文件,并使用一个对象来表示该文件:
f = open(文件名,模式)


最常用的模式有:
"r"     # 只读
“w”     # 写入


比如
>>>f = open("test.txt","r")


文件对象的方法
读取:
content = f.read(N)          # 读取N bytes的数据
content = f.readline()       # 读取一行
content = f.readlines()      # 读取所有行,储存在列表中,每个元素是一行。


写入:
f.write('I like apple')      # 将'I like apple'写入文件


关闭文件:
f.close()




--------------------------------------模块
Python中还有其它的引入方式,


import a as b             # 引入模块a,并将模块a重命名为b


from a import function1   # 从模块a中引入function1对象。调用a中对象时,我们不用再说明模块,即直接使用function1,而不是a.function1。


from a import *           # 从模块a中引入所有对象。调用a中对象时,我们不用再说明模块,即直接使用对象,而不是a.对象。




----------------------------------搜索路径
Python会在以下路径中搜索它想要寻找的模块:
程序所在的文件夹
标准库的安装路径
操作系统环境变量PYTHONPATH所包含的路径


-----------------------------------模块包
可以将功能相似的模块放在同一个文件夹(比如说this_dir)中,构成一个模块包。通过
import this_dir.module
引入this_dir文件夹中的module模块。
该文件夹中必须包含一个__init__.py的文件,提醒Python,该文件夹为一个模块包。__init__.py可以是一个空文件。


-----------------------------------函数的参数
def f(a,b,c):
    return a+b+c


关键字(keyword)传递是根据每个参数的名字传递参数。关键字并不用遵守位置的对应关系
print(f(c=3,b=2,a=1))


参数默认值
在定义函数的时候,使用形如a=19的方式,可以给参数赋予默认值(default)。如果该参数最终没有被传递值,将使用该默认值。
def f(a,b,c=10):
    return a+b+c


------------------------------------包裹传递
在定义函数时,我们有时候并不知道调用的时候会传递多少个参数。这时候,包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会非常有用。


下面是包裹位置传递的例子:
def func(*name):
    print type(name)
    print name
func(1,4,6)
func(5,6,7,1,2,3)


两次调用,尽管参数个数不同,都基于同一个func定义。在func的参数表中,所有的参数被name收集,根据位置合并成一个元组(tuple),这就是包裹位置传递。
为了提醒Python参数,name是包裹位置传递所用的元组名,在定义func时,在name前加*号。


下面是包裹关键字传递的例子:
def func(**dict):
    print type(dict)
    print dict
func(a=1,b=9)
func(m=2,n=1,c=11)
与上面一个例子类似,dict是一个字典,收集所有的关键字,传递给函数func。为了提醒Python,参数dict是包裹关键字传递所用的字典,在dict前加**。
包裹传递的关键在于定义函数时,在相应元组或字典前加*或**。


-------------------------------------解包裹
*和**,也可以在调用的时候使用,即解包裹(unpacking), 下面为例:
def func(a,b,c):
    print a,b,c
args = (1,3,4)
func(*args)
在这个例子中,所谓的解包裹,就是在传递tuple时,让tuple的每一个元素对应一个位置参数。在调用func时使用*,是为了提醒Python:我想要把args拆成分散的三个元素,


分别传递给a,b,c。(设想一下在调用func时,args前面没有*会是什么后果?)


相应的,也存在对词典的解包裹,使用相同的func定义,然后:
dict = {'a':1,'b':2,'c':3}
func(**dict)
在传递词典dict时,让词典的每个键值对作为一个关键字传递给func。


--------------------------------------混合
在定义或者调用参数时,参数的几种传递方式可以混合。但在过程中要小心前后顺序。基本原则是,先位置,再关键字,再包裹位置,再包裹关键字,并且根据上面所说的原


理细细分辨。


注意:请注意定义时和调用时的区分。包裹和解包裹并不是相反操作,是两个相对独立的过程。


--------------------------------------常用函数
range()
在Python中,for循环后的in跟随一个序列的话,循环每次使用的序列元素,而不是序列的下标。
之前我们已经使用过range()来控制for循环。现在,我们继续开发range的功能,以实现下标对循环的控制:
S = 'abcdefghijk'
for i in range(0,len(S),2):
    print S[i]
在该例子中,我们利用len()函数和range()函数,用i作为S序列的下标来控制循环。在range函数中,分别定义上限,下限和每次循环的步长。这就和C语言中的for循环相类似


了。


enumerate()
利用enumerate()函数,可以在每次循环中同时得到下标和元素:
S = 'abcdefghijk'
for (index,char) in enumerate(S):
    print index
    print char
实际上,enumerate()在每次循环中,返回的是一个包含两个元素的定值表(tuple),两个元素分别赋予index和char


zip()
如果你多个等长的序列,然后想要每次循环时从各个序列分别取出一个元素,可以利用zip()方便地实现:
ta = [1,2,3]
tb = [9,8,7]
tc = ['a','b','c']
for (a,b,c) in zip(ta,tb,tc):
    print(a,b,c)
每次循环时,从各个序列分别从左到右取出一个元素,合并成一个tuple,然后tuple的元素赋予给a,b,c
zip()函数的功能,就是从多个列表中,依次各取出一个元素。每次取出的(来自不同列表的)元素合成一个元组,合并成的元组放入zip()返回的列表中。zip()函数起到了聚合


列表的功能。


del是Python中保留的关键字,用于删除对象


len()查询词典中的元素总数


-----------------------------------------循环对象
循环对象是这样一个对象,它包含有一个next()方法(__next__()方法,在python 3x中), 这个方法的目的是进行到下一个结果,而在结束一系列结果之后,举出


StopIteration错误。


当一个循环结构(比如for)调用循环对象时,它就会每次循环的时候调用next()方法,直到StopIteration出现,for循环接收到,就知道循环已经结束,停止调用next()。
假设我们有一个test.txt的文件:
1234
abcd
efg
我们运行一下python命令行:
>>>f = open('test.txt')
>>>f.next()
>>>f.next()
...


不断输入f.next(),直到最后出现StopIteration
open()返回的实际上是一个循环对象,包含有next()方法。而该next()方法每次返回的就是新的一行的内容,到达文件结尾时举出StopIteration。这样,我们相当于手工进行


了循环。
自动进行的话,就是:
for line in open('test.txt'):
    print line
在这里,for结构自动调用next()方法,将该方法的返回值赋予给line。循环知道出现StopIteration的时候结束。


相对于序列,用循环对象的好处在于:不用在循环还没有开始的时候,就生成好要使用的元素。所使用的元素可以在循环过程中逐次生成。这样,节省了空间,提高了效率,


编程更灵活。


-------------------------------------------迭代器
从技术上来说,循环对象和for循环调用之间还有一个中间层,就是要将循环对象转换成迭代器(iterator)。这一转换是通过使用iter()函数实现的。但从逻辑层面上,常常可


以忽略这一层,所以循环对象和迭代器常常相互指代对方。


------------------------------------------------------生成器
生成器(generator)的主要目的是构成一个用户自定义的循环对象。


生成器的编写方法和函数定义类似,只是在return的地方改为yield。生成器中可以有多个yield。当生成器遇到一个yield时,会暂停运行生成器,返回yield后面的值。当再


次调用生成器的时候,会从刚才暂停的地方继续运行,直到下一个yield。生成器自身又构成一个循环器,每次循环使用一个yield返回的值。


下面是一个生成器:
def gen():
    a = 100
    yield a
    a = a*8
    yield a
    yield 1000
该生成器共有三个yield, 如果用作循环器时,会进行三次循环。
for i in gen():
    print i
 
再考虑如下一个生成器:
def gen():
    for i in range(4):
        yield i
它又可以写成生成器表达式(Generator Expression):
G = (x for x in range(4))
生成器表达式是生成器的一种简便的编写方式。读者可进一步查阅。


---------------------------------------------表推导
表推导(list comprehension)是快速生成表的方法。它的语法简单,很有实用价值。


假设我们生成表L:
L = []
for x in range(10):
    L.append(x**2)
以上产生了表L,但实际上有快捷的写法,也就是表推导的方式:
L = [x**2 for x in range(10)]
这与生成器表达式类似,只不过用的是中括号。


-------------------------------------------lambda函数
在展开之前,我们先提一下lambda函数。可以利用lambda函数的语法,定义函数。lambda例子如下:


func = lambda x,y: x + y
print func(3,4)
lambda生成一个函数对象。该函数参数为x,y,返回值为x+y。函数对象赋给func。func的调用与正常函数无异。


以上定义可以写成以下形式:
def func(x, y):
    return x + y
 
函数作为参数传递
函数可以作为一个对象,进行参数传递。函数名(比如func)即该对象。比如说:
def test(f, a, b):
    print 'test'
    print f(a, b)


test(func, 3, 5)
test函数的第一个参数f就是一个函数对象。将func传递给f,test中的f()就拥有了func()的功能。


我们因此可以提高程序的灵活性。可以使用上面的test函数,带入不同的函数参数。比如:
test((lambda x,y: x**2 + y), 6, 9)


---------------------------------------------map()函数
map()是Python的内置函数。它的第一个参数是一个函数对象。


re = map((lambda x: x+3),[1,3,5,6])
这里,map()有两个参数,一个是lambda所定义的函数对象,一个是包含有多个元素的表。map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结果储存于返回的表re中。map通过读入的函数(这里是lambda函数)来操作数据(这里“数据”是表中的每一个元素,“操作”是对每个数据加3)。


在Python 3.X中,map()的返回值是一个循环对象。可以利用list()函数,将该循环对象转换成表。


如果作为参数的函数对象有多个参数,可使用下面的方式,向map()传递函数参数的多个参数:


re = map((lambda x,y: x+y),[1,2,3],[6,7,9])
map()将每次从两个表中分别取出一个元素,带入lambda所定义的函数。


----------------------------------------------------filter()函数
filter函数的第一个参数也是一个函数对象。它也是将作为参数的函数对象作用于多个元素。如果函数对象返回的是True,则该次的元素被储存于返回的表中。filter通过读入的函数来筛选数据。同样,在Python 3.X中,filter返回的不是表,而是循环对象。


filter函数的使用如下例:


复制代码
def func(a):
    if a > 100:
        return True
    else:
        return False


print filter(func,[10,56,101,500])
复制代码
 
---------------------------------------------------------reduce()函数
reduce函数的第一个参数也是函数,但有一个要求,就是这个函数自身能接收两个参数。reduce可以累进地将函数作用于各个参数。如下例:


print reduce((lambda x,y: x+y),[1,2,5,7,9])
reduce的第一个参数是lambda函数,它接收两个参数x,y, 返回x+y。


reduce将表中的前两个元素(1和2)传递给lambda函数,得到3。该返回值(3)将作为lambda函数的第一个参数,而表中的下一个元素(5)作为lambda函数的第二个参数,进行下一次的对lambda函数的调用,得到8。依次调用lambda函数,每次lambda函数的第一个参数是上一次运算结果,而第二个参数为表中的下一个元素,直到表中没有剩余元素。


上面例子,相当于(((1+2)+5)+7)+9


根据mmufhy的提醒: reduce()函数在3.0里面不能直接用的,它被定义在了functools包里面,需要引入包









































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值