主要讲的是稍微高级一点的函数,这些函数往往能使代码更简洁,提高编程效率。
一:lambda匿名函数
为什么说是匿名函数呢?
因为python中声明函数的方式只有def和lambda两种,lambda函数实际上是一个表达式,而不是一个语句;其主体是一个单独的表达式而不是一个代码块:
lambda arguement1, argumnet2, argument3, ……, argument N: expression using arguments
被认为是没有函数名的,但是可以通过赋值,将表达式赋值给一个变量名,之后通过这个变量名调用函数,调用方式和def的代码一样遵循相同规则。
f = lambda x, y, z = x + y + z
f(2,3,4)
9
也许一看到lambda你会联想到数学里的lambda(我数学不好), 但是这里的确实比数学里的东西好理解?。也许你会问为什么要用lambda, 这是因为使用lambda确实能精简代码,这符合python之禅;但是也不能让代码太过晦涩难懂,适度使用这些技术也是很有用处的。
二:range、map、filter、reduce、zip、enumerate函数
放在一起是因为python3中他们返回的都是迭代器对象或者是可迭代对象或是处理迭代器对象,需要使用list()之类的函数转换成你想要的类型:
1.range()
range(stop)
range(start, stop[, step])
返回的是可迭代对象,通常和for循环一起用,记住留头去尾;支持.conut和.index
可以通过list函数转换为列表形式;
2.map()
格式:
map(function, *iterables)
十分像列表推导式,但要记住map()函数返回的是迭代器对象
map支持很多函数,这就使得你使用map变得十分方便高效
3.reduce()
reduce(function, sequence[, initial])
会将函数作用于序列的每一个元素上,然后返回值
reduce函数接受迭代器对象并进行处理,但是它本身不是一个可迭代对象。
并且在python3中reduce并不在内置函数中,而是在functools中,需要导入。
reduce还支持将一个可选的第三个参数放置在序列各项之前,进而当序列为空时返回充当的默认结果,有点基本工资的意思:
reduce(lambda x,y:x+y,[1,2,3],6)
12
对整个序列进行运算:1+2+3+6 = 12
4.filter()
filter 筛选的意思,函数也是筛选符合条件的可迭代对象元素。返回的仍是迭代器对象
5.zip()
zip(iter 1[, iter 2[ ...]])
将可迭代对象作为参数,将对象中对应的元素打包成元组,然后返回由这些元组组成的对象,可使用*解压
6.enumerate()
enumerate(iterable, start=0)
默认返回迭代对象;
得到对应元素值和索引;