1.几个函数
abs(x)
cmp(x, y) //x>y,返回1,x==y返回0,x<y返回-1
int(x) //转型为int
isinstance(x, (int,float)) //例子,检查x是否为int或者float类型
//ps:函数名其实为指向函数对象的引用,可以把函数名赋给另一个变量:
a = abs
a(-1)
2. 定义函数
def 函数名(参数):
函数体 //如果是空函数,可以只写个pass
函数可以返回多个值:
def reMutiResult(x ,y):
nx = x + y
ny = x - y
return nx, ny
x, y = reMutiResult(10,8)
返回的实际上是一个tuple,所以还是返回一个值
3.默认参数
定义函数的时候,假如某个参数有常用值,可以将这个参数的默认值设为这个常数值,这样在调用这个函数的时候,假如没有指定该参数的值,则默认该参数为默认值
def test(x, y = 2):
x = x + y
print test(5)
//结果为7
定义的时候,必选参数要放在默认参数前,假如有多个默认参数,而前面的默认参数按默认值而后面的默认参数要改变时
def test(x, y=2, z=3):
n = x + y + z
return n
print test(5, z=5) //结果为12
默认参数必需指向不变对象
4.可变参数
在参数前面加一个*
可以把参数变成可变参数
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
这样calc
函数可以传入任意个数的参数,包括0个
假如要传入list或者tuple,在传入的变量前加*
t = (1, 2, 3)
calc(*t)
5.关键字参数
在参数前面加**
把参数变为关键字参数,关键字参数允许、传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def person(name, age, **kw):
print 'name:', name, 'age:', age, 'other:', kw
person('Aka', 20, gender='M', job='Engineer')
//结果是`name: Aka age: 20 other: {'gender': 'M', 'job': 'Engineer'}`
和可变函数一样,传入参数时可以传入dict,传入的时候前面加**
关键字参数可以拓展函数的功能。比如问卷调查中的可选项。
6.参数组合
可以将四种参数一起使用,但是顺序必需是:必选参数、默认参数、可变参数和关键字参数。
def func(a, b, c=0, *args, **kw):
print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw
lis = ['Aka', 8, 23, 'li', 89]
d = {'city': 'Jinhua'}
func(*lis, **d)
通过可变参数传入一个list或tuple可以覆盖到前面的必选参数,默认参数。所以,对于任意函数,都可以通过类似func(*args, **kw)
的形式调用它,无论它的参数是如何定义的。
使用*args
和**kw
是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
7.递归函数
①用尾递归优化递归函数,防止栈溢出
②尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。
③Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题。
8.高级特性
①切片(slice)
L[0:3] or L[:3] //表示取List L 索引从0到3,但不包括3的元素,起始的索引值为0时可以省略
由于python支持`L[-1]取倒数第一个元素,所以也可以倒数切片
L[-n:] //表示取倒数的n个元素
注意 L[-n:-1] //取不到最后一个元素
L[:10:2] //表示前十个数,每两个取一个,假如list是0到99的整数,那么结果就是[0,2,4,6,8]
L[:] //什么都不写,表示复制原来的数组
字符串和tuple都可以进行切片操作
②迭代
python中任意可迭代对象,不管有没有下标都可以进行迭代。
d = {1: 'One', 2: 'Two'}
for key in d:
print key
1
2
如果要迭代valuefor value in d.itervalues()
如果要迭代key和value for key,value in d.iteritems()
字符串也可以进行迭代
如何判断对象可迭代:
通过collections模块的Iterable类型判断:
from collections import Iterable
isInstance('abc', Iterable)
如果想要同时迭代索引值,使用enumerate
把list(或者tuple,str)变成索引-值对
for i,value in enumerate(['A', 'B', 'C']):
print i,value
0 A
1 B
2 C