Python中filter函数map函数reduce函数的区别

Python中filter函数map函数reduce函数的区别以及匿名函数的使用

1.匿名函数

释义:

  • 用lambda关键词能创建小型匿名函数。这种函数得名于省略了用def声明函数的标准步骤,是对函数的简写。

参数说明:

  • lambda函数的语法只包含一个语句,如下:
  • argument: 参数,命令行参数
lambda [arg1 [,arg2,.....argn]]:expression

注意:

  • Lambda函数能接收任何数量的参数但只能返回一个表达式的值
  • 匿名函数不能直接调用print,因为lambda需要一个表达式

示例如下:

#无参数无返回值的函数
def my_print():
    print("你好,Python")
my_print()

#当前表达式的定义
f=lambda :print("你好,Python")
f()#函数的调用
#等价于  以下函数的定义加调用
(lambda :print("你好,Python"))()

#无参数有返回值的函数
def my_pi():
    return 3.14
print(my_pi())
·
f=lambda:3.14
print(f())

#有参数无返回值函数
def my_print(name):
    print('你好,%s'%name)
my_print("xiaohong")

f=lambda name:print('你好,%s'%name)
f('小红')

#有参数有返回值的函数
def add2num(a,b):
    return a+b
print(add2num(2,3))

f=lambda a,b:a+b
print(f(1,2))

2.filter函数

1.定义:
filter()函数用于对序列过滤,过滤掉不符合条件的元素,返回一个迭代器对象,其中包含对其执行函数时结果为真的所有元素,过滤掉不符合条件的元素
2.语法:
filter(func,seq)该函数接收两个参数,第一个为函数,第二个为可迭代对象

def use_filter(data):
    # 使用result接收filter过滤偶数值的功能
    result = filter(lambda x: x % 2 == 0, data)
    return result

if __name__ == '__main__':
    # 使用data接收0-50的数值t
    # data = [i for i in range(51)]
    data = range(51)
    # 调用use_filter函数传入data,使用resul变量接收
    result = use_filter(data)
    print(list(result))
# range()函数可创建一个整数列表,
# range(start, stop[, step])
# start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
# stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
# step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)

3.map函数

1.定义:
创建一个列表,其中包含对指定序列包含的项执行指定函数返回的值,是根据提供的函数对指定序列做映射。即是将传入的函数依次作用到序列的每个元素,并把结果返回。即返回结果是一个map对象
2.语法:
map(function,sequence,…),该接收两个参数,一个是函数,一个是序列;

rest = map(lambda x, y: x*y, [3, 5], [3, 5])
print(list(rest))   # [9, 25]
//map()函数种传入的列表多于一个时,map()函数可以并行执行

求列表中元素的立方方法

# 求列表中元素的立方方法
def pow_number(L):
    """
    使用for循环
    :param L: list/type int类型的列表或者是元组
    :return:原来列表中每一项的立方
    """
    rest_list = []
    for x in L:
        rest_list.append(x*x*x)
    return rest_list

def f(n):
    return n*n*n


def pow_number_use_map(L):
    """
     使用map函数
    :param L: list/type int类型的列表或者是元组
    :return:原来列表中每一项的立方
    """
    return map(f, L)

def pow_number_use_lambda(L):
    """
     使用lambda函数
    :param L: list/type int类型的列表或者是元组
    :return:原来列表中每一项的立方
    """
    res = map(lambda n: n*n*n, L)

    return res



if __name__ == '__main__':
    X = range(1, 10)
    rest = pow_number(X)
    print(rest)
    print("*"*40)
    rest = pow_number_use_map(X)
    print (list(rest))
    print("*" * 40)
    rest = pow_number_use_map(X)
    print(list(rest))
    print("*" * 40)
    rest = pow_number_use_lambda(X)
    print(list(rest))

4.reduce函数

1.定义:
使用指定的函数将序列的前两个元素合二为一,再将结果与第3个元素合二为一,以此类推,直到处理完整个序列并得到一个结果值
2.语法:
reduce(func,seq[.initial]) 等价于func(func(func(seq[0],seq[1],)seq[2],…))
两个参数分别是函数和列表名

# 计算1-20的乘积
from functools import reduce

def use_reduce(data):

    result = reduce(lambda x, y: x*y, data)
    return result
if __name__ == '__main__':
    data = range(1, 21)
    res = use_reduce(data)
    print(res)

序列求和的4种方法

from functools import  reduce
# 求序列和
def get_sum(data):
    """
    根据给定的列表,求里面的各个数字的总和
    :param data:  list/type 里面是整数
    :return:列表所有项的和
    """
    rest = 0
    for i in data:
        rest += i
    return rest
def get_sum2(data):
    """
    内置函数
    :param data:  list/type 里面是整数
    :return:列表所有项的和
    """
    return sum(data)

def f(m,n):
    return m+n


def get_sum_reduce(data):
    """
       reduce+普通函数
       :param data:  list/type 里面是整数
       :return:列表所有项的和
       """
    return reduce(f, data)

def get_sum_lambda(data):
    """
       reduce函数+匿名函数
       :param data:  list/type 里面是整数
       :return:列表所有项的和
       """
    return reduce(lambda m, n: m+n, data)

if __name__ == '__main__':
    data = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    result = get_sum(data)
    print(result)
    print("——————————————————————————————")
    result_1 = get_sum2(data)
    print(result_1)
    print("——————————————————————————————")
    result_2 = get_sum_reduce(data)
    print(result_2)
    print("——————————————————————————————")
    result_3 = get_sum_lambda(data)
    print(result_3)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值