day11-总结 高阶函数
-
1.生成式
生成式就是生成器的简写
1)语法一
生成器 = (表达式 for 变量 in 序列)
a.说明: 表达式 - 任何有结果的语句; 数据,赋值后的变量,非赋值的运算表达式等...
b.展开成生成器:
def 函数名():
for 变量 in 序列:
yield 表达式
生成器 = 函数名()
# 1.用生成式创建生成器
gen = (x*2 for x in 'hello')
print(type(gen)) # <class 'generator'>
print(next(gen)) # hh
print(next(gen)) # ee
print(next(gen)) # ll
print(next(gen)) # ll
print(next(gen)) # oo
# print(next(gen)) # StopIteration
# 2. 列表生成式
list1 = list(x for x in range(5))
print(list1)
list2 = [x for x in 'abc']
print(list2) # ['a', 'b', 'c']
gen2 = (x*10 for x in range(5))
list2 = list(gen2)
print(list2)
# print(next(gen2)) # StopIteration
def yt_list(seq):
temp = []
for item in seq:
temp.append(item)
return temp
# 3.字典生成式
dict1 = dict((x, x*2) for x in range(5))
print(dict1) # {0: 0, 1: 2, 2: 4, 3: 6, 4: 8
2) 语法二:
生成器 = (表达式 for 变量 in 序列 if 条件语句)
a.展开成函数
def 函数名():
for 变量 in 序列:
if 条件语句:
yield 表达式
生成器 = 函数名()
gen3 = (x for x in range(10) if x % 2)
print(list(gen3)) # [1, 3, 5, 7, 9]
补充:python中的三目运算符:
变量 = 表达式1 if 条件语句 else 表达式2
功能:判断条件语句是否为True,如果是,结果就是表达式1,否则结果就是表达式2
gen4 = (True if num % 3 == 0 else False for num in range(1, 11))
print(list(gen4)) # [False, False, True, False, False, True, False, False, True, False]
-
函数作为变量
python中声明函数就是声明类型是function的变量;函数名就是变量
-
实参高阶函数
装饰器 = 实参高阶函数 + 返回值高阶函数 + 糖语法
-
实参高阶函数
有一个参数是函数的函数就是实参高阶函数
python中内置的sorted,max,min等函数,以及列表的sort方法都是实参高阶函数
这些函数中都有一个key,要求传参的时候传一个函数,
这个函数需要一个参数和一个返回值,参数代表序列中的元素,返回值是比较对象
num = [1, 54, 5, 64, 25, 22]
print(sorted(num)) # [1, 5, 22, 25, 54, 64]
# 问题1 :按个位数的大小对num中元素从小到大排序
def func1(item):
return item % 10
num.sort(key=func1)
# num.sort(key=lambda item: item % 10)
print(num) # [1, 22, 54, 64, 5, 25]
# 问题2:安各位数之和从大到小排序
def func2(item):
sum1 = 0
for x in str(item):
sum1 += int(x)
return sum1
num.sort(reverse=True, key=func2)
print(num) # [64, 54, 5, 22, 25, 1]
# 按照字典中key为'score'的值从小带大排序
dicts = [{'name': '小明', 'score': 90},
{'name': '小花', 'score': 55},
{'name': '小pp', 'score': 85}
]
dicts.sort(key=lambda item: item['score'])
print(dicts) # [{'name': '小花', 'score': 55}, {'name': '小pp', 'score': 85}, {'name': '小明', 'score': 90}]
-
返回值高阶函数
-
1.返回值高阶函数
函数的返回是一个函数,这样的函数就是返回值高阶函数
# 返回值高阶函数
def func1():
def func2():
print('函数2')
return func2
# 练习: 声明一个函数operation,要求可以接收一个字符参数, 最后根据字符值的不同返回不同功能的函数
# + -> 求多个数和功能的函数 - -> 求多个数的差的功能的功能, * -> 求多个数的乘积的功能
# operation('+')(1, 2, 4, 5) -> 12
# operation('-')(1, 2, 4, 5) -> -10
# operation('*')(1, 2, 4, 5) -> 40
def operation(char):
# char = '+'
if char == '+':
def sum(*args):
# args = (1, 2, 4, 5)
temp = 0
for x in args:
temp += x
return temp
return sum
elif char == '-':
def diff(*args):
temp = args[0]
for x in args[1:]:
temp -= x
return temp
return diff
print(operation('+')(1, 2, 4, 5))
"""
print(sum(1, 2, 4, 5))
print(12)
"""
print(operation('-')(1, 2, 4, 5))
-
闭包
-
1.什么是闭包
闭包就是一个函数,满足以下俩个条件:
1)函数的返回值是申明在这个函数中的函数(内函数)
2)这个内函数必须使用外函数中的临时变量(外函数中的局部变量)
闭包作用:保存临时变量的值(函数调用结束后,函数中的数据不销毁
def func1(x):
a = 10
def func2():
print(a + x)
print('内函数')
return func2
func1(10)
-
装饰器
-
1.什么是装饰器
装饰器本质还是函数
装饰器作用:在不修改函数本身的前提下给函数添加功能
语法:
def 函数名1(参数1):
def 函数名2(*args, **kwargs):
实现为原函数添加功能的代码
(保证出现:参数1(*args, **kwargs))
return 函数名2
@函数名1
声明需要添加功能的函数
# 练习:写一个装饰器,给函数添加权限,密码是:'321'
def password(fn):
def test(*args, **kwargs):
password = 321
num = int(input('输入密码:'))
if num == password:
fn(*args, **kwargs)
return test
@password
def func3():
print('函数3')
func3()