博客
关于我
python 高阶函数作业(3.16)
阅读量:510 次
发布时间:2019-03-07

本文共 8807 字,大约阅读时间需要 29 分钟。

总结:

1 实参高阶函数

python中定义函数就是在定义一个function类型的变量,变量能做的函数也可以

高阶函数(实参高阶函数 - 如果一个函数的参数是函数,那么这个函数是实参高阶函数(掌握 系统提供实参)

( 返回值高阶函数 - 如果一个函数的返回值值是函数,那么这个函数就是返回值高阶 函数)(会写装饰器)

2 min,max,sum, sorted, map ,reduce

1.max and min

max(序列,key=函数)

函数要求:
a.有且只有一个参数,这个参数指向的是前面序列中的每个元素
b.需要一个返回值,返回值决定求最大值的时候比较的对象

nums=[329,543,2343,24327,2424]print(max(nums))# 求列表中个位数最大的元素:9result=max(nums,key=lambda x:x%10)print(result)# 求列表中十位数最大的元素:9result1=max(nums,key=lambda x:x//10%10)print(result1)nums=[324,-78,-676,324.600]result2=max(nums,key=lambda item:item**2)print(result2)

练习:返回列表中各位数和最大的值

def sum1(x):    x=str(x)    l1=len(x)    s=0    for i in x:        s+=int(i)    return snums=[28,607,65,19,88]result=max(nums,key=sum1)print(result)# 法二result3=max(nums,key=lambda item:sum([int(x) for x in str(item)]))

练习:a.求平均分

b.获取年龄最小的学生

students = [    {   'name': '小明', 'age': 18, 'score': 98, 'tel': '187283822'},    {   'name': '小红', 'age': 30, 'score': 99, 'tel': '187283827'},    {   'name': 'Tom', 'age': 25, 'score': 87, 'tel': '187283828'},    {   'name': 'Bob', 'age': 19, 'score': 65, 'tel': '187283829'}]# 求平均分from functools import reduceresult=reduce(lambda x,item:x+item['score'],students,0)/len(students)print(result)# 法一:def age_small(item):    return item['age']result4=min(students,key=age_small)print(result4)# 法二:result5=min(students,key=lambda item:item['age'])print(result5)#排序(按个位数从小到大)nums=[329,'2432','34',24,2424]result6=max(nums,key=lambda item:int(item))print(result6)

2.map函数 - 将原序列中元素按照指定标志进行变换

map(函数,序列)

函数要求:
a.有且只有一个参数,这个参数指向的是后面这个序列每个元素
b.需要一个返回值,描述新序列中的元素和原序列中元素的关系
map(函数,序列1,序列2)
函数要求:
a.有且只有两个参数,这两个参数分别指向后面的
map(函数,序列1,序列2,序列3)

nums=[28,89,34,78,21]result=map(lambda item:item%10,nums)print(list(result))  #[8, 9, 4, 8, 1]#2)nums1=[23,433,43,2,432]nums2=[1,2,3,4,5]result=map(lambda item1,item2:item1+item2,nums1,nums2)print(list(result))# 练习scores=[29,89,67,56,34,90]ages=[23,30,19,24,25,23]# [{'score': 29, 'age': 23}, {'score': 89, 'age': 30}, ...]result=map(lambda item1,item2:{   'score':item1,'age':item2},scores,ages)print(list(result))# 练习keys=[1,2,3]values=[4,5,6]result=map(lambda item1,item2:(item1,item2),keys,values)print(dict(result))

3.reduce - 将序列中所有的元素经过指定的方式合并成一个数据

练习

nums = [2, 4, 5, 6, 3] # ‘24563’

nums = [2, 4, 5, 6, 3] # ‘2040506030’

nums = [23, ‘45’, 10, 2, ‘30’] # 23+45+10+2+30

nums = [23, ‘45’, 10, 2, ‘30’] # 23+10+2

nums=[2,4,5,6,3]result=reduce(lambda x,item:x*item,nums,1)print(result)# 1nums=[2,4,5,6,3]result=reduce(lambda x,item:x+str(item),nums,'')print(result)# 2nums=[2,4,5,6,3]# result=reduce(lambda x,item:x+str(item)+'0',nums,'')result=reduce(lambda x,item:f'{x}{item}0',nums,'')print(result)# 3nums = [23, '45', 10, 2, '30']result=reduce(lambda x,item:x+int(item),nums,0)print(result)# 4nums=[23, '45', 10, 2, '30']# result=reduce(lambda x,item:x+item if type(item)==int else x+0,nums,0)result=reduce(lambda x,item:x+(item if type(item)==int else 0),nums,0)print(result)

3 补充*的用法: 打包、解包

def f1(*nums):    print(nums)f1(2, 3, 4)    # nums = (2, 3, 4)x, *y = 10, 20, 30, 40t = (1, 11, 22)print(t)    # (1, 11, 22)print(*t)   # print(1, 11, 22)  -> 1 11 22d = {   'a': 10, 'b': 20}   # **d  -> a=10, b=20d2 = {   'end': ';', 'sep': ','}print('abc', 123, **d2)    # print('abc', 123, end=';', sep=',')def f2(f, *n, **kwargs):    # f = f3, n = (10, 20, 30)    f(*n, **kwargs)    # f3(10, 20, 30)  f3(x=10, y=20, z=30)def f3(x, y, z):    print('函数')f2(f3, x=10, y=20, z=30)

4 装饰器

1.什么是装饰器

装饰器 = 实参高阶函数 + 返回值高阶函数 + 糖语法
装饰器是用来给函数添加功能的

2.给函数添加功能

方法一: 在需要添加功能的函数中添加代码

def func1():    start = time()    # time()  - 获取当前时间    print('hello world!')    end = time()    print('执行时间:', end - start)def func2(N: int):    start = time()    result = reduce(lambda x, item: x * item, range(1, N+1), 1)    print(result)    end = time()    print('执行时间:', end - start)func2(8)

问题:如果要给不同的函数添加相同的功能,添加的功能的对应的代码需要重复写

方法二:将需要添加的功能封装成函数

def count_time(fn, *args, **kwargs):    # fn = func22    start = time()    fn(*args, **kwargs)    # 执行函数   func22()    end = time()    print('执行时间:', end - start)def func11():    print('hello world!')def func22(N: int):    result = reduce(lambda x, item: x * item, range(1, N + 1), 1)    print(result)def func33(a, b, c):    print(f'a:{a}, b:{b}, c:{c}')count_time(func11)count_time(func22, 4)# func33(10, 20, 30)count_time(func33, 10, 20, c=30)

问题: 调用函数的时候需要调用的时候新增功能,而不是添加过功能的原函数 - 感觉

方法三:装饰器

def 装饰器名称(需要添加功能的函数):    def 添加过功能的新函数(*args, **kwargs):        反函数返回值 = 需要添加功能的函数(*args, **kwargs)        添加新的功能        return 原函数返回值(如果装饰器本身的功能和原函数返回值有关,这个地方就不一定)    return 添加过功能的新函数
from time import timefrom functools import reducedef count_time(fn):    def new_f(*args,**kwargs):        start=time()        result=fn(*args,**kwargs)        end=time()        print(f'执行时间{end-start}')        return result    return new_f@count_timedef func1():    print('hello!')func1()print('==============================================')@count_timedef func2(N:int):    result=reduce(lambda x,item:x*item,range(1,N+1),1)    print(result)func2(4)# 唐语法;func2=count_time(func2)

练习1:写一个装饰器,给函数添加功能,然后原函数结束的时候打印一个’end’

def add_string(fn):    def new_fn(*args,**kwargs):        result=fn(*args,**kwargs)        print('end')        return result    return new_fn@add_stringdef func3():    print('hahahhahaha')func3()

练习2:写一个装饰器,将函数的返回值加100。 1 -> 101

def add_100(f):    def new_f(*args,**kwargs):        result=f(*args,**kwargs)        if type(result) in (int,float,bool,complex):            return result+100    return new_f@add_stringdef func4(N:int):    result = reduce(lambda x, item: x * item, range(1, N + 1), 1)    print(result)func4(4)

方法四:装饰器(实参)(3.17补充)

有参装饰器def 有参装饰器名称(参数列表):    无参装饰器    return 无参装饰器对应的函数名        def 函数名(参数列表):    def  装饰器名(需要添加功能的原函数):        def 新函数(*args, **kwargs):            返回值 = 调用原函数            添加新功能            return 返回值        return 新函数    return 装饰器名

2.为函数写一个装饰器,把函数的返回值 乘2再返回值(下面作业2),改为任意倍数的,实参装饰器

def multiply_N(N):    def multiply(f):        def new_f(*args, **kwargs):            if type(f(*args, **kwargs) in (int, float, bool, tuple, str, list)):                result = f(*args, **kwargs) * N            return result        return new_f    return multiplyN=int(input('请输入整倍数:'))item=eval(input('请输入适用乘法的结构(浮点型,整型,元组,布尔,序列,字符串):'))@multiply_N(N)def func1(item):    return itemprint(f'结果:{func1(item)}')

结果:

在这里插入图片描述

作业:

  1. 为函数写一个装饰器,在函数执行之后输出 after
def print_after(f):    def new_f(*args,**kwargs):        result=f(*args,**kwargs)        print('after')        return result    return new_f@print_afterdef func1():    print('这是第一道题')func1()

结果:

在这里插入图片描述

  1. 为函数写一个装饰器,把函数的返回值 乘2再返回值
def mutiply_by_2(f):    def new_f(*args,**kwargs):        if type(f(*args,**kwargs)) in (int,float,str,list,tuple,bool):            return f(*args,**kwargs)*2        else:            print('输入不符合条件!')    return new_f@mutiply_by_2def func2(str1):    return str1str1=input('请输入:')print(func2(str1))

结果:

在这里插入图片描述

  1. 写一个装饰器@tag要求满足如下功能:
def tag(f):    def new_f(*args,**kwargs):        return '

'+str(f(*args,**kwargs))+'

' return new_f@tagdef render(text): # 执行其他操作 return text@tagdef render2(): return 'abc'print(render('Hello')) # 打印出:

Hello

print(render2()) # 打印出:

abc

结果:

在这里插入图片描述

  1. 求列表 nums 中绝对值最大的元素

    例如:nums = [-23, 100, 89, -56, -234, 123], 最大值是:-234
nums = [-23, 100, 89, -56, -234, 123]# result=max(nums,key=lambda item:abs(item)) #方法一# result=max(nums,key=lambda item:item**2) #方法二result=max(nums,key=lambda item:item if item>=0 else -item) #方法三print(result)

结果;

在这里插入图片描述

  1. 已经两个列表A和B,用map函数创建一个字典,A中的元素是key,B中的元素是value

    A = ['name', 'age', 'sex']B = ['张三', 18, '女']新字典: {     'name': '张三', 'age': 18, 'sex': '女'}
A = ['name', 'age', 'sex']B = ['张三', 18, '女']# result=map(lambda item1,item2:[item1,item2],A,B) #法一result=map(lambda item1,item2:(item1,item2),A,B)print(dict(result))

结果:在这里插入图片描述

  1. 已经三个列表分别表示5个学生的姓名、学科和班号,使用map将这个三个列表拼成一个表示每个学生班级信息的的字典

    names = ['小明', '小花', '小红', '老王']nums = ['1906', '1807', '2001', '2004']subjects = ['python', 'h5', 'java', 'python']结果:{     '小明': 'python1906', '小花': 'h51807', '小红': 'java2001', '老王': 'python2004'}
names = ['小明', '小花', '小红', '老王']nums = ['1906', '1807', '2001', '2004']subjects = ['python', 'h5', 'java', 'python']# result=map(lambda item1,item2,item3:(item1,item3+item2),names,nums,subjects)result=map(lambda item1,item2,item3:[item1,item3+item2],names,nums,subjects)print(dict(result))

结果:

在这里插入图片描述

  1. 已经一个列表message, 使用reduce计算列表中所有数字的和(用采用列表推导式和不采用列表推导式两种方法做)

    message = ['你好', 20, '30', 5, 6.89, 'hello']结果:31.89
from functools import reducemessage = ['你好', 20, '30', 5, 6.89, 'hello']result=reduce(lambda x,item:x+item if type(item) in (int,float) else x+0,message,0)print(result)message = ['你好', 20, '30', 5, 6.89, 'hello']result=sum([x for x in message if type(x) in (int,float)])print(result)message = ['你好', 20, '30', 5, 6.89, 'hello']result=reduce(lambda x,item:x+item,[x for x in message if type(x) in (int,float)],0)print(result)

结果:在这里插入图片描述

转载地址:http://yrrjz.baihongyu.com/

你可能感兴趣的文章
MQ 重复消费如何解决?
查看>>
mqtt broker服务端
查看>>
MQTT 保留消息
查看>>
MQTT 持久会话与 Clean Session 详解
查看>>
MQTT介绍及与其他协议的比较
查看>>
MQTT工作笔记0007---剩余长度
查看>>
MQTT工作笔记0008---服务质量
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>
Mqtt搭建代理服务器进行通信-浅析
查看>>
MS COCO数据集介绍
查看>>
MS Edge浏览器“STATUS_INVALID_IMAGE_HASH“兼容性问题
查看>>
ms sql server 2008 sp2更新异常
查看>>
MS SQL查询库、表、列数据结构信息汇总
查看>>
MS UC 2013-0-Prepare Tool
查看>>
MSBuild 教程(2)
查看>>
msbuild发布web应用程序
查看>>
MSB与LSB
查看>>
MSCRM调用外部JS文件
查看>>
MSCRM调用外部JS文件
查看>>
MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
查看>>