在上一小节中简单的介绍了函数的基本用法,这小节将继续介绍关于函数的用法和技巧。本小节将主要介绍匿名函数三元表达式mapreducefilter

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配合mapreducefilter使用。

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_xlist_y中的列表长度不一致时,看看会发生什么事情。

4.reduce

reduce() 函数会对参数序列中元素进行累积,使用resuce时需要导入from functools import reduce

#语法
reduce(function, iterable[, initializer=none])

参数:

求一组列表的和

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)

参数:

示例

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种方式比较简洁,因为10在python中转成boolean时,能够代表TrueFalse。注意函数返回值一定要能够判断

python3.7 入门教程

Python 准备工作(1) Python 基本数据类型 Number(2) Python 字符串 str(3) Python 列表List(4) Python 元组tuple(5) Python 集合set(6) Python 字典 dict(7) Python 变量(8) Python 运算符(9) Python 条件语句(10) Python 循环语句(11) Python 包 模块(12) Python 函数一(13) Python 函数二(14) Python 面向对象(15) Python 正则(16) Python json(17) Python 枚举(18) Python 闭包(19) Python 装饰器(20) Python 杂记(21) Python with(22)