循环
一、使用while 1 代替 while true
二、在循环时,使用xrange而非range,使用 xrange 可以节省大量的系统内存,因为 xrange() 在序列中每次调用只产生一个整数元素。而 range() 將直接返回完整的元素列表,用于循环时会有不必要的开销。
三、使用Map、Reduce、fileter 代替for循环
1、Map:
>>>def add(x):
>>> return x+100
>>> demo = [11,22,33]
>>>map(add,demo)
[111,122,133]
>>>def abc(a,b,c):
>>> return a*10000+b*100+c
>>>
>>>list1 = [11,22,33]
>>>list2 = [44,55,66]
>>>list3 = [77,88,99]
>>>map(abc,list1,list2.list3)
[114477,225588,336699]
2、reduce:
reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。reduce()还可以接收第3个可选参数,作为计算的初始值。
>>>def f(x,y):
>>> return x+y
>>>reduce(f,[1,3,5,7,9])
>>>25
3、fileter
filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
>>>def is_odd(x):
>>> return x % 2 == 1
>>>fileter(is_odd, [1,4,6,7,9,12,17])
>>>[1,7,9,17]
Lazy if-evaluation 特性:
python 中的条件表达式是具有惰性求值的特性的,或者说短路逻辑,也就是说,如果存在条件表达式:if x and y,在 x 为 false 的情况下 y 表达式的值将不再计算。关于短路逻辑:只有在需要求值时才进行求值。举例来说,表达式x and y需要两个变量都为真时才为真,所以如果x为假,表达式就会立刻返回false,而不管y的值(事实上各个语言都有这个特性)。实际上,如果x为假,表达式会返回x得值----否则它就返回y的值。
于是,对于and,应该把满足条件少的放在前面,对于or,把满足条件多的放在前面。
字符串拼接:
尽量使用join(),而非+:
1、列表
>>> seq1 = ['hello','good','boy','doiido']
>>> print ' '.join(seq1)
hello good boy doiido
2、字符串
>>> seq2 = "hello good boy doiido"
>>> print ':'.join(seq2)
h:e:l:l:o: :g:o:o:d: :b:o:y: :d:o:i:i:d:o
3、字典
>>> seq3 = {'hello':1,'good':2,'boy':3,'doiido':4}
>>> print ':'.join(seq3)
boy:good:doiido:hello
避免不必要的数据拷贝:
关于python中的copy与deepcopy:
使用copy的话,列表会随着原表改变:
>>>a = [1,2,3,4,[1,2,3,4]]
>>>b = copy.copy(a)
>>>c = copy.deepcopy(a)
>>>a.append(5)
>>>a[4].append(5)
>>>print a
>>>print b
>>>print c
输出:
[1, 2, 3, 4, [1, 2, 3, 4, 5], 5]
[1, 2, 3, 4, [1, 2, 3, 4, 5]]
[1, 2, 3, 4, [1, 2, 3, 4]]
函数模块化
使用函数,将功能脚本封装成一个函数,同时尽量避免属性的访问,即 '.' 的使用:
1、我们可以通过from module import name 的方式调用函数
2、将对象名方法保存下来(局部变量比全局变量快):
def list_append():
a = []
for i in xrange(1,100):
a.append(i)
return a
可以修改为:
def list_append():
a = []
a_ap = a.append
for i in xrange(1,100):
a_ap(i)
return a
使用Json进行反序列化:json.dumps()
关于两个变量的交换使用:a,b=b,a 而非使用中间变量:t=a;a=b;b=t
使用if is:if done is not None 比语句 if done != None 更快;