在上一小节中简单的介绍了函数的基本用法,这小节将继续介绍关于函数的用法和技巧。本小节将主要介绍匿名函数
、三元表达式
、map
、reduce
、filter
。
1.匿名函数
匿名函数
顾名思义就是定义一个没有名字的函数。在javascript
中的匿名函数是这样创建的。
(function (){
console.log('hello world!')
})()
python中定义匿名函数需要使用关键字lambda
# 定义
lambda parameter_list: expression
#示例
lambda x,y: x + y
需要注意的是,匿名函数expression
是一个表达式
,不是代码语句。也不用写return
,返回值就是该表达式的结果。
匿名函数调用
f = lambda x, y: x + y
>>> f(1,2)
3
这样的写法虽然能够调用匿名函数
,但是完全没有体现出匿名函数的优势,建议不要这么使用。后面会介绍lambda
配合map
、reduce
、filter
使用。
2.三元表达式
三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(not)的条件判断,在Python 2.4以上才有了三元操作。三元表达式可以用if
代替,但是if不如三元表达式简洁
//js中的三元表达式
a > b? a : b;
python中的三元表达式:
# python中的三元表达式
a if a > b else b
#用if代替
if a > b:
return a
else:
return b
显然用三元表达式
会比用if
简洁许多,三元表达式一般和lambda
配合使用。说实话小菜第一次用python中的三元表达式感觉好别扭,也有可能是其他语言用习惯了。慢慢习惯吧!
3.map
Iterable
: 可迭代的,可迭代的就是逻辑上是“一排”的东西,比如列表、字典、元组都是iterable。
Iterator
: 迭代器,iterator对象在迭代过程中提供返回的值。
如果想了解这两个概念,请阅读Python的Iterable和Iterator
class map(func, *iterables) -->map Object
map
不是一个函数,而是一个类,接收一个函数和一个可迭代的(集合,列表)。map会根据提供的函数对指定序列做映射,返回一个map对象。
# 求一组数的平方
def square(x):
return x * x
list_x = [1,2,3,4,5,6,7]
list_y =list(map(square, list_x))
>>> list_y
[1,4,9,16,25,36,49]
我们用lambda
来写一下上面的功能
list_x = [1,2,3,4,5,6,7]
list_y = list(map(lambda x: x * x, list_x))
>>> list_y
[1,4,9,16,25,36,49]
是不是变得简洁了许多,这也是lambda
推荐的用法。
传多个参数
list_x = [1,2,3,4,5,6,7]
list_y = [1,2,3,4,5,6,7]
list_r = list(map(lambda x, y: x + y), list_x, list_y)
>>> list_r
[2,4,,6,8,10,12,14]
大家可以将list_x
或list_y
中的列表长度不一致时,看看会发生什么事情。
4.reduce
reduce()
函数会对参数序列中元素进行累积,使用resuce
时需要导入from functools import reduce
#语法
reduce(function, iterable[, initializer=none])
参数:
- function – 函数,必须有两个参数
- iterable – 可迭代对象
- initializer – 可选,初始参数
求一组列表的和
from functools import reduce
list_x = [1,2,3,4,5,6,7,8,9]
list_y = reduce(lambda x, y: x + y, list_x)
>>> list_y
45
reduce
函数必须要传入2个参数,第1次运行时,由于只传了一个参数,所以会将list_x
的第2项作为参数传入(1 + 2),第2次运行时,将上一次的结果作为参数传入(3 + 3),后面以此类推
添加初始值
from functools import reduce
list_x = [1,2,3,4,5,6,7,8,9]
list_y = reduce(lambda x, y: x + y, list_x, 10)
>>> list_y
55
reduce如果添加了第三个参数,第1次运行时,取list_x
第一个值和initializer
作为参数传入(1 + 10),第2次运行时,将上一次的结果作为参数传入(11 + 2),后面以此类推
5.filter
filter()
函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表
#定义
filter(function, iterable)
参数:
- function – 判断函数,函数返回值必须能够判断真和假
- iterable – 可迭代对象
示例
list_x = [1,0,1,0,1,0]
list_y = list(filter(lambda x: True if x == 1 else False),list_x)
>>> list_y
[1,1,1]
#或者
list_y = list(filter(lambda x: x),list_x)
>>> list_y
[1,1,1]
第2种方式比较简洁,因为1
和0
在python中转成boolean时,能够代表True
和False
。注意函数返回值一定要能够判断真
和假
。