☆函数:
def fun_name(param):
return xxxx
返回多值:
def move(x, y, z):
return x, y
x, y = move(1, 2, 3)
print x, y
==> 1, 2
其实这个是一种假象,返回值仍是单一值
a = move(1, 2, 3)
print a
==>(1, 2)
原来返回值是一个tuple
递归函数:
汉诺伊
我们对柱子编号为a, b, c, 将所有圆盘从a移动到c可以描述为:
如果a只有一个圆盘,可以直接移动到c;
如果a有N个圆盘,可以看成a有一个圆盘(底盘)+(N-1)个圆盘,
首先需要把(N-1)个圆盘移动到b,然后,将a的最后一个圆盘移动到c,
再将b的(N-1)个圆盘移动到c。
def move(n, a, b, c):
if n==1:
print a, '-->', c
return
move(n-1, a, c, b)
print a, '-->', c
move(n-1, b, a, c)
move(4, 'A', 'B', 'C')
默认参数:
def power(x, n=2):
return x ** n
power(5)
==>25
power(5,3)
==>125
注意:由于函数的参数由左到右匹配,所以默认参数只能在最右边
可变参数:
def ff(*args):
print args
ff()
==>()
ff(1, 'a')
==>(1, 'a') #原来参数*args是个tuple
☆切片
对list进行切片
L[0:3]
L[x:y] #取x到y但不包含y的所有元素
L[:3]
L[:y] #从0开始取到y但不包含y的所有元素
L[x:] #从x开始取完
L[:] #取所有元素
L[1:8:2]
L[x:y:z] #从x取到y不包含y,间隔为z-1
倒序切片:
L[-2:] #从倒数第二个元素开始取到最后
L[ : -2: 2] #每隔一个直到倒数第二个
对字符串切片:
'ABCDEFG'[:3]
==>'ABC'
'ABCDEFG'[::2]
==>'ACEG'
另:upper()大写、lower()小写
☆迭代
有时候我们想在for循环中拿到索引,使用enumerate()函数:
L = ['Adam', 'Lisa', 'Bart']
for index, name in enumerate(L):
print index,'-',name
==>0 - Adam
==>1 - Lisa
==>2 - Bart
实际上,enumerate()把[‘Adam’, ‘Lisa’, ‘Bart’]变成了[(0,’Adam’), (1,’Lisa’), (2,’Bart’)]
因此,迭代的每个元素实际上都是一个tuple
for t in enumeration(L):
index = t[0]
name = t[1]
迭代 dict 的 value:
for v in d.values(): #把dict转换成value的list
for v in d.itervalues(): #不转换,省内存
☆列表生成式
生成列表:
range(1,10)
==>[1,2,3,4,5,6,7,8,9]
[x * x for x in range(1, 11)]
==>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
条件过滤:
[x * x for x in range(1, 11) if x % 2 == 0]
==>[4, 16, 36, 64, 100]
多层表达式:
[m+n for m in 'ABC' for n in '123']
==>['A1','A2','A3','B1','B2','B3','C1','C2','C3']
#相当于
L = []
for m in 'ABC':
for n in '123':
L.append(m+n)