python随笔

1、range与xrange\zip与izip

range([start],stop[,step]),产生一个序列,默认从0开始
xrange([start],stop[,step]),生成器,一次产生一个xrange对象,节省了内存,默认从0开始
zip([iterable, ...]),产生一个元组序列,每一个元组中的元素从各个list的第n个取得
izip([iterable, ...]),生成器,一次产生一个元组,节省了内存

2、sum

接受一个可迭代对象:sum(iterable[, start]) 

3、is操作符检查两个对象是否相同,==检查两个对象是否相等,isinstance检查一个对象类型

4、enumerate

python提供的首选的循环方式并不需要以来索引,但很多时候我们需要用到他,这时enumerate为此而生
for i,item in enumerate(list):
    print i,tiem

这种方法是快于一下这种的:
for i in xrange(len(list)):
    print i,list[i]

5、print不换行,在行尾加一个逗号即可:print a,

6、避免隐式的共享引用创建二维列表

multilist = [[0 for col in range(5)] for row in rang(10)]

以下方式将导致隐式共享引用:

multilist = [[0] * 5] * 10

7、二维阵列变换

arr = [[1,2,3],[4,5,6],[7,8,9]]
print map(list,zip(*arr))

zip接受一个可迭代对象列表,将每个列表按位置对应成元组,map返回对每个元组实行了list化的结果

8、*args和**kwds语法

*args用于接收任意基于位置的参数,可以是任何可迭代对象
**kwds用于接收任意命名的参数,类似于字典,例子:a=1,b=2,c=3,d=4这样的参数传递
确保*args和**kwds在所有参数后面,如果两者同时出现,确保**kwds在*args之后

9、迭代器

当一个类实现了__iter__这个函数,那这个类就是可迭代的
如果它还实现了 next ( self ) ,那它就称为迭代器
当Python在执行for循环时,会先调用container的__iter__()方法来获得container的迭代器,其实就是将container转化成迭代器(iterator)。然后它会重复调用迭代器(iterator)的

next()方法,直到迭代器(iterator)抛出StopIteration的异常。一旦这个异常抛出,for循环就结束了。 iter()函数用来生成一个迭代器,每次可以调用该迭代器的next()函数,如下:

a = [122, 221, 333]
b = iter(a)
b.next()
b.next()
b.next()

10、callable(object)

检查对象object是否是可以被调用的,类是可以被调用的,类的实例是不可以被调用的,除非类中声明了__call()__方法

11、hasattr(object, name)和getattr(object, name [, defalut])和delattr(object,name)和setattr(object,name,value)

hasattr()判断对象object是否包含名为name的属性
getattr()获得一个对象object的名为name的属性值,默认值为default
delattr()函数在object对象许可时,删除object对象的name属性
setattr()将object参数的name属性设置为value参数值

12、globals()和locals()

globals()获得一个描述当前全局符号表的字典
locals()获得当前本地符号表的字典

13、chr()和ord()

chr()将一个ASCII值转换为字符
ord()将一个字符转换为ASCII值

14、divmod(a,b)

返回商和余数的元组

15、repr(object)

返回对象的字符串表示

16、round(x,[:n])

round()函数返回浮点型参数x舍入到十进制小数点后n位的值

17、exec语句

exec语句被设计为执行能使用函数和语句的任意组合的python的任何代码片段。执行的代码访问相同的全局定义和局部定义的对象、类和方法或函数

18、help()

获取帮助信息

19、lambda函数

Python 支持一种有趣的语法,它允许你快速定义单行的最小函数。这些叫做 lambda 的函数,是从 Lisp 借用来的,可以用在任何需要函数的地方

def f(x):
    return x+2
可以改写成f = lambda x:x+2

另一个例子,apihelper.py 中的 lambda 函数:
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
前面的判断语句中,lambda的值永远是True,不论lambda函数的返回值是什么

20、map()和zip()

a=[1,2];b=[3,4];c=[5,6]
map(None,a,b,c)和zip(a,b,c)是一样的哦

21、python的三元运算符

'true' if True else 'false'
'true' if False else 'false'

22、字符串翻转

'hello world'[::-1]

23、符合PEP8原则的长字符串写法

string = ("this is a "
      "really long long "
      "string")

24、0打头的数字处理

>>> "%02d" % 1
'01'
>>> "%02d" % 100
'100'
>>> str(1).zfill(2)
'01'
>>> str(100).zfill(2)
'100'
>>> int('01')
1

25、清空列表

del l[:]

26、打乱列表

from random import shuffle
# works in place
l = range(10)
shuffle(l)

27、按某一字典值对列表排序

newlist = sorted(list_to_be_sorted, key=lambda k: k['name'])

28、choice()\shuffle()\random()\sample()

choice(sequence)接收一个可迭代对象(包括字符串),随机选择其中一个返回
shuffle(sequence)接收一个可迭代对象,打乱
random()返回0到1之间的浮点数
sample(sequence,k)返回一个可迭代对象中随机的长度为k的片段,不会改变原对象

29、字典的合并,使用update()

>>> x = {'a':1, 'b': 2}
>>> y = {'b':10, 'c': 11}
>>> z = x.copy()
>>> z.update(y)
{'a': 1, 'c': 11, 'b': 10}

30、使用局部变量会比使用全局变量要快,python将局部变量存储在固定大小的队列中,因为你不可能在函数中动态的增加变量,python解释器(CPython)只需要按照位置来寻找变量就可以了(像列表那样),但是全局变量是存在于真正的字典中的,python通过键值来寻找变量

31、input和output

import sys
for line in sys.stdin:
    print line
print >> sys.stderr, 'spam'

32、让主函数可以被别处调用的好方法

def main():
    '''do something '''


if __name__ == '__main__':
    main()

33、dict判断key存在

if key in dict:
    '''do something'''

34、list去重

方法一:
t1 = [‘a’,’c’,’b’,’d’,’c’,’d’]
t2 = list(set(t1))

方法二:
t1 = [‘a’,’c’,’b’,’d’,’c’,’d’]
t2 = {}.fromkeys(t1).keys()

35、list两两分组

t = [1,2,3,4,5,6,7,8]
t = list(zip(t[0::2],t[1::2]))

36、dict按value去重

a = {"a":"11", "b":"11", "c":"22", "d":"22"}
func = lambda z:dict([(x, y) for y, x in z.items()])
print func(func(a))