22函数---匿名函数、函数式编程、内置函数

一、匿名函数:lambda

一次使用,随时随地定义
没有名字,有了名字就失去了意义
当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
匿名函数通常被用作高阶函数的参数。比如,filter(),map(),reduce()。
lambda x,y:x+y

二、函数式编程

函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,
就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。
函数就是面向过程的程序设计的基本单元。

函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数!
Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

三、高阶函数

    函数也是对象,可以把函数作为参数传入,这样的函数称为高阶函数。map()、reduce()、filter()

 lambda 常与内置函数结合使用 

# 1、map、reduce、filter

# map() 对序列中的每一个元素应用被传入的函数,返回包含结果的可迭代对象
l = map(lambda x:x+3,[1,2,4]) print(list(l))#[4, 5, 7] # # # # reduce() 把结果继续和序列的下一个元素做累积计算 from functools import reduce s = reduce(lambda x,y:x+y,[2,3,4,5]) print(s)#14 # # # filter()过滤出元素,把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定是否保留该元素 a = list(filter(lambda x:x>1,range(-5,5))) print(a)#[2, 3, 4]

 

# 2、max()对字典的运算:最小值,最大值,排序

salaries={
    'aa':3000,
    'bb':100000000,
    'cc':10000,
    'ee':2000
}

# 迭代字典取得的是Key
print(max(salaries)) #ee
# 这样返回的是value, 但通常我们要得到的是对应的键
print(max(salaries.values())) #100000000

# max(iterable, key, default),第一个参数是迭代器,max会遍历迭代器,将每个返回值作为参数传给key,此处对字典遍历的结果是key
# 此时key是一个函数
# 这样根据value进行排序,返回的是对应的键
print(max(salaries, key=lambda k:salaries[k]))

  

# 3、或者使用zip()函数,py3中zip()返回的是一个对象,需手动 list() 转换
# zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象

salaries_and_name = zip(salaries.values(),salaries.keys())
print(salaries_and_name)
print(max(salaries_and_name))#或者print(max(list(salaries_and_name)))也可以

  

# 4、sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
print(sorted(L))#[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
print(sorted(L, key=lambda L:L[1]))#按成绩排序,[('Bart', 66), ('Bob', 75), ('Lisa', 88), ('Adam', 92)]

 例:

# 1、文件内容如下,标题为:姓名,性别,年纪,薪资
#
# egon male 18 3000
# alex male 38 30000
# wupeiqi female 28 20000
# yuanhao female 28 10000
#
# 要求:
# 从文件中取出每一条记录放入列表中,
# 列表的每个元素都是{'name':'egon','sex':'male','age':18,'salary':3000}的形式

# # (1)我写的
l = []
with open('data.txt', 'r') as f:
    data = f.readlines()
    for d in data:
        res = {'name':d.split()[0],
               'sex':d.split()[1],
               'age':d.split()[2],
               'salary':d.split()[3]}
        l.append(res)
    print(l)

# (2)
with open('data.txt', 'r') as f:
    items = (line.split() for line in f)
    #列表是无序的,但是读取出来的itmes是有序的
    info = [{'name':name,'sex':sex,'age':age,'salary':salary }
             for name,sex,age,salary in items]
    print(info)


# # 2    根据1得到的列表, 取出薪资最高的人的信息
info = max(l,key= lambda dic:dic['salary'])
print(info)
# # 3 根据1得到的列表,取出最年轻的人的信息
info = min(l,key= lambda dic:dic['age'])
print(info)
# # 4 根据1得到的列表,将每个人的信息中的名字映射成首字母大写的形式
# # (1)没有用map函数
d = [{'name':i['name'].capitalize(),'sex':i['sex'],'age':i['age'],'salary':i['salary']} for i in l]
print('d',d)
# # (2)使用map函数
d = map(lambda dic: {'name':dic['name'].capitalize(),
                     'sex':dic['sex'],
                     'age':dic['age'],
                     'salary':dic['salary']},l)
print('dd',list(d))
# # 5 根据1得到的列表,过滤掉名字以a开头的人的信息
info = filter(lambda d:not d['name'].startswith('a'),l)
print('5:',list(info))

 

posted @ 2021-04-03 18:14  cheng4632  阅读(100)  评论(0编辑  收藏  举报