Python Code snippet - Keosu - 博客园
Python Code snippet
(1)函数默认参数
def foo3 (i, L=[]):
if len(L)==0:
L.append(0)
L[0]+=i
return L[0]
print foo3(1)
print foo3(2)
print foo3(3)
print foo3(4)
上述代码得到的结果是
1
3
6
10因此不要用可变对象作为默认参数值(Don’t use mutable as defaults)
1234deffunction(x, l=[]):# 不要这么干deffunction(x, l=None):# 更好的一种方式iflisNone:l=[]tca , tcb , tcc 差异
class tc:
tca = []
tcb = ''
def __init__(self,ff):
self.tcc = [](2) Python中 set 相关操作
python的set 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素.
集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算.
作为一个无序的集合,set 不记录元素位置或者插入点。因此,set 不支持 indexing, slicing, 或其它类序列的操作。
基本操作:
len(s) set 的长度
x in s 测试 x 是否是 s 的成员
x not in s 测试 x 是否不是 s 的成员
s.issubset(t)
s <= t 测试是否 s 中的每一个元素都在 t 中
s.issuperset(t)
s >= t 测试是否 t 中的每一个元素都在 s 中
s.union(t)
s | t 集合的并
s.intersection(t)
s & t 集合的交
s.difference(t)
s - t 差集s.symmetric_difference(t)s.copy() 浅复制
s ^ t 对称差集s.update(t)
s |= t
s.intersection_update(t)
s &= t
s.difference_update(t)
s -= t
s.symmetric_difference_update(t)
s ^= ts.add(x)
#说明:非运算符版本的操作支持任何 iterable 对象,不仅限于set
s.remove(x) 删除元素 x, 如果不存在则引发 KeyError
s.discard(x) 如果存在元素 x, 则删除
s.pop() 删除并返回一个不确定元素, 为空则引发 KeyError
s.clear() 删除所有元素(3)列表,元组,字典 (List,Tuple,Dictionary)
两个变量的交换:
1a, b=b, a参数在切片操作中的步骤,如:
123a=[1,2,3,4,5]>>> a[::2]# 以步长为2的增量迭代整个list对象[1,3,5]一个特殊的例子 `x[::-1]`用来反转x的实用语法。
12>>> a[::-1][5,4,3,2,1]学习各种集合(learn the various collections)
python有各种各样的容器数据类型,在特定情况下选择python内建的容器如:list和dict。通常更多像如下方式使用:
123456freqs={}forcin"abracadabra":try:freqs[c]+=1except:freqs[c]=1
另外一种方式:
123freqs={}forcin"abracadabra":freqs[c]=freqs.get(c,0)+1使用defaultdict
1234fromcollectionsimportdefaultdictfreqs=defaultdict(int)forcin"abracadabra":freqs[c]+=1其它集合
12345namedtuple()# 用指定的域创建元组子类的工厂函数deque# 类似list的容器,快速追加以及删除在序列的两端Counter# 统计哈希表的dict子类OrderedDict# 记录实体添加顺序的dict子类defaultdict# 调用工厂方法为key提供缺省值的dict子类(4)序列的特殊操作 filter , map , reduce , lambda
filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple返回:
#返回不能被2和3整除的数
>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
map(function, sequence) :对sequence中的item依次执行function(item),见执行结果组成一个List返回:
>>> def cube(x): return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> def add(x, y): return x+y
>>> map(add, range(8), range(8))
[0, 2, 4, 6, 8, 10, 12, 14]
reduce(function, sequence, starting_value):对sequence中的item顺序迭代调用function
>>> def add(x,y): return x + y
>>> reduce(add, range(1, 11))
55 (注:1+2+3+4+5+6+7+8+9+10)
>>> reduce(add, range(1, 11), 20)
75 (注:1+2+3+4+5+6+7+8+9+10+20)
lambda: 快速定义单行的最小函数,类似于C语言中的宏
>>> g = lambda x: x * 2
>>> g(3)
6
>>> (lambda x: x * 2)(3)
6
(5)使用iteritems而不是itemsiteriterms 使用的是 generators,所以当迭代很大的序列是此方法更好
12345d={1:"1",2:"2",3:"3"}forkey, valind.items()# 调用items()后会构建一个完整的list对象forkey, valind.iteritems()# 只有在迭代时每请求一次才生成一个值(6)使用isinstance 而不是type
需要注意的是这里使用basestring而不是str是因为你可能会用一个unicode对象去检查是否为string,例如:
12345>>> a=u'aaaa'>>>isinstance(a,basestring)True>>>isinstance(a,str)False因为在Python中3.0以下的版本存在两种字符串类型str和unicode
object|basestring/ \str unicode
