本文共 8807 字,大约阅读时间需要 29 分钟。
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)]))
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)
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))
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)
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)
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)
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()
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)
有参装饰器def 有参装饰器名称(参数列表): 无参装饰器 return 无参装饰器对应的函数名 def 函数名(参数列表): def 装饰器名(需要添加功能的原函数): def 新函数(*args, **kwargs): 返回值 = 调用原函数 添加新功能 return 返回值 return 新函数 return 装饰器名
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)}')
结果:
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()
结果:
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))
结果:
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
结果:
求列表 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)
结果;
已经两个列表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))
结果:
已经三个列表分别表示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))
结果:
已经一个列表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/