-
为函数写一个装饰器,在函数执行之后输出 after
def prin_a(f): def new_fn(*args,**kwargs): result = f(*args,**kwargs) print('after') return result return new_fn @prin_a def text(): print('aaaaaa') text()
-
为函数写一个装饰器,把函数的返回值 +100 然后再返回。
def add_num(f): def new_fn(*args,**kwargs): result = f(*args,**kwargs) if type(result) in (int,float): return result+100 return result return new_fn @add_num def nums(): return 100 print(nums())
-
写一个装饰器@tag要求满足如下功能:
@tag
def render(text):
# 执行其他操作
return text
@tag
def render2():
return 'abc'
print(render('Hello')) # 打印出: <p>Hello</p>
print(render2()) # 打印出: <p>abc</p>
def tag(f):
def new_fn(*args,**kwargs):
result = f(*args,**kwargs)
if type(result)==str:
return f'<p>{result}</p>'
return result
return new_fn
@tag
def render2():
return 'abc'
print(render2())
@tag
def render(a):
return a
print(render('hello'))
-
求列表 nums 中绝对值最大的元素
例如:nums = [-23, 100, 89, -56, -234, 123], 最大值是:-234 nums = [-23, 100, 89, -56, -234, 123] def num1(item): if item<0: item=-1 return item else: return item result = max(nums,key=num1) 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 s,item:[s,item],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 na,nu,su:[na,su+nu],names,nums,subjects) print(dict(result))
-
已经一个列表message, 使用reduce计算列表中所有数字的和(用采用列表推导式和不采用列表推导式两种方法做)
message = ['你好', 20, '30', 5, 6.89, 'hello'] 结果:31.89 from functools import reduce result = reduce(lambda num,x:num+x if type(x) in (int,float) else num+0,message,0) print(result) message = ['你好', 20, '30', 5, 6.89, 'hello'] num1 = sum([i for i in message if type(i)==int or type(i)==float]) print(num1)
高阶函数
函数其实就是变量,变量能做,函数都可以做:
- 赋值新变量
- 重新赋值
- 做序列中的元素
- 做函数的参数
- 做函数的返回值
实参高阶函数
实参高阶函数:参数是函数的函数,一般实参高阶函数的形参名f/fn
常用高阶函数的使用:
-
max/min
语法:max(序列,key=函数)—对序列中元素比较大小,获取最大值
说明:key—关键字参数名
函数-----必须有且只有一个参数(指向序列元素)
需要一个返回值(比较对象)
nums = [100,25,36,88,21,96] def f1(item): # item 指向序列元素 return item%10 #比较对象 result = max(nums,key=f1) print(result) # 获取列表中各位数的个位数
-
sorted
语法:sorted(序列,key=函数)–比较序列中元素的大小,对序列中元素从小到大排序
说明:key–关键字参数名
函数----有且只有一个参数(指向序列的元素)
需要一个返回值(比较的对象)
students = [ {'name':'小明','age':21,'score':84}, {'name':'小话','age':28,'score':46}, {'name':'小卡卡','age':20,'score':56}, {'name':'小撒旦','age':26,'score':94}, {'name':'小幂','age':10,'score':96}, ] result = sorted(students,key=lambda item:item['age'] ) print(result)
-
map
语法1:map(函数,序列)—对原序列进行指定操作,产生一个新序列,返回值是一个map对象
说明:函数–需要一个参数(原序列元素)。需要有返回值(新序列元素)
语法2:map(函数,序列1,序列2)–根据序列1和序列2创建一个新序列
说明:函数–需要两个参数(两序列对应的元素)。需要有返回值(新序列元素)
s = [1,2,3,4,5] a = [12,5,6,4,3] def f(x,y): return x+y result = map(f,s,a) print(result) #<map object at 0x0136E250> map对象 print(list(result)) # [13, 7, 9, 8, 8]
-
reduce
语法:from functools import reduce (使用前必须先调用) reduce(函数,序列,初始值)-----计算累加、累乘、组合字符串
说明:函数—需要两个参数。第一个参数第一次指向初始值,第二次指向上一次的返回值
第二个参数指向序列中的元素
需要一个返回值:返回值决定运算规则(返回值是通过加法获得,运算即加法)
from functools import reduce a = [42,96,36,84,25,6,56] def f(x,y): return x+y # 返回值为和 result = reduce(f,a,0) print(result)
无参装饰器
作用:给函数添加新功能
语法:
1)定义
def 函数名1(参数1):-函数名1是装饰器的名,取名应与功能相关。参数1是原函数,一般用f/fn命名
def 函数名2(*args,**kwargs):----函数名2是新函数名,一般命名为new_f/new_fn
功能代码
result = 参数1(*args,**kwargs)----参数1是原函数,result变量是原函数的返回值
return result
return 函数名2
2)调用
@函数名1
def 原函数名():
代码段
# 定义一个计时功能装饰器
import time
def count_time(f):
def new_fn(*args,**kwargs):
start = time.time()
result = f(*args,**kwargs)
end = time.time()
print(f'执行时间:{end-start}')
return result
return new_fn
# 调用功能装饰器
@count_time
def f1():
print('ab')
f1()