学习python的第十天

一、高阶函数

1.函数就是变量

定义函数的时候,其实就是在等一一个类型的function的变量,函数名就是变量名
普通变量能做的事情,函数都可以做

def a():
    print('函数1')
b = [1, 2, 3]
1)查看变量类型
print(type(b))
print(type(a))
2)使用变量中保存的数据
print(b)
print(a)
3)修改变量的值
b = 100
a = 'abc'
print(b)
print(a)
4)变量可以作为列表元素
x = 10


def y():
    return 'abc'


list1 = [x,y,y()]
print(list1)
print(list1[0] * 2, list1[0] % 10)
print(list1[2][0], list1[2].replace('a', 'A'))
print(list1[1]())  # 调用函数

面试题 考点:执行函数时赋值

list1 = []
for i in range(5):
    list1.append(lambda x:x*i)
print(list1[1](2))  #8
print(list1[2](2))  #8

二、实参高阶函数

普通变量可以作为函数的参数
函数可以作为函数的参数
将函数的返回值作为实参

1.实参高阶函数

如果一个函数的参数是函数,那么这个函数就是实参高阶函数

1)怎么确定调用函数的时候参数传什么值

看这个参数在函数中是怎么使用的
func5就是一个高阶参数

def func5(x):
    print(x(100))


def test(a):
    # a = 100
    return a*10    # return 1000


func5(test)

2.实参高阶函数的应用

除了写装饰器以外,一般不会自己取定义实参高阶函数,主要使用系统已经定义好的实参高阶函数
系统中常用的实参高阶函数:max、min、sorted、reduce、map

1) max、min

max(序列)\min(序列) - 求序列中的元素的最大值\最小值
max(序列,key)\min(序列,key) - 参数key的类型就是一个函数
key的要求:
a.是一个函数
b.有且只有一个参数,并且这个参数指向的是序列中的每一个元素
c.函数需要一个返回值,这个返回值就是比较大小的比较对象

# 求个位数最大的元素
nums = [12, 13, 43, 78, 9]
print(max(nums))
print(max(nums, key=lambda item: item))
print(max(nums, key=lambda item: item % 10))

# 求分数最高的学生,最小的学生
stu = [
    {'name': '小明', 'score': 90, 'age': 18},
    {'name': '小红', 'score': 95, 'age': 21},
    {'name': '小刚', 'score': 89, 'age': 25}
]
print(max(stu, key=lambda item: item['score'])['name'])
print(min(stu, key=lambda item: item['age'])['name'])
2)sorted

sorted(序列) - 将序列按照序列元素大小进行排序,返回一个列表
sorted(序列,key) - 参数key的类型就是一个函数
key的要求:
a.是一个函数
b.有且只有一个参数,并且这个参数指向的是序列中的每一个元素
c.函数需要一个返回值,这个返回值就是比较大小的比较对象

# 按照个位数的大小从小到大排序
nums = [78, 69, 57, 28, 71, 54]
print(sorted(nums))
print(sorted(nums, key=lambda item: item % 10))
# 按学生分数从高到底排序
stu = [
    {'name': '小明', 'score': 90, 'age': 18},
    {'name': '小红', 'score': 95, 'age': 21},
    {'name': '小刚', 'score': 89, 'age': 25}
]
print(sorted(stu, key=lambda item: item['name'], reverse=True))
3)map

用法一:
map(函数,序列) - 将序列按照函数给定的规则创建成一个新的序列
函数的要求:
a.是一个函数
b.有一个参数(指向序列中的每个元素)
c.有一个返回值(产生新元素的规则)

# 打印出个位数
nums = [23, 35, 67, 91, 25, 45]
new_nums = list(map(lambda item: item %10, nums))
print(new_nums)
# 转化成百分数
nums = [0.23, 0.45, 0.89, 0.12, 0.65]
new_nums = list(map(lambda item: f'{item:.2%}', nums))
print(new_nums)

方法二:
map(函数,序列1,序列2) - 将序列按照函数给定的规则创建成一个新的序列
函数的要求:
a.是一个函数
b.有两个参数(第一个参数指向第一个序列中的每个元素,第二个参数指向第二个序列中的每个元素)
c.有返回值(产生新元素的规则)
注意:两个序列中元素的个数要一致

# 合并字符串
strs = ['abc' ,'how' ,'you' ,'love']
nums = [1, 20, 4, 60]
new_list = list(map(lambda x, y: x+ str(y), strs, nums))
print(new_list)
# 计算打折价格
prices = [67, 250, 35, 1564, 25]
discount = [1, 0.8, 0.75, 0.95, 0.5]
new_prices = list(map(lambda x, y: f'{x * y:.2f}元', prices, discount))
print(new_prices)
4)reduce

方法一:
reduce(函数,序列) - 将序列中所有元素按照函数规定的操作进行合并
函数的要求:
a.函数
b.有两个参数(第一个参数第一次指向序列的第一个元素,从第二次开始指向上次运算的结果,第二个元素指向序列第二个开始的每个元素)

# 拼接字符串
nums = [11, 12, 52, 24, 35, 18]
result = reduce(lambda x,y: str(x)+str(y),nums)
print(result)

方法二:
reduce(函数,序列,初始值) - 将序列中所有的元素按照函数规定的操作进行合并
函数的要求:
a.函数
b.有两个参数(第一个参数第一次是初始值,第二次开始时上一次的运算结果)

# 求年龄和
stu = [
    {'name': '小明', 'score': 90, 'age': 18},
    {'name': '小红', 'score': 95, 'age': 21},
    {'name': '小刚', 'score': 89, 'age': 25}
]
result = reduce(lambda x,y:x+y['score'],stu,0)
print(result)

三、列表推导式

1.什么是列表推导式

用来快速创建列表
方法一:
方法一:
列表 = [表达式 for 变量 in 序列]
产生一个新的列表,变量在序列中每取一个元素就将表达式的值添加到新列表中
方法二:
列表 = [表达式 for 变量 in 序列 if 条件语句]
方法三:
列表 = [表达式 for 变量1 in 序列1 for 变量2 in 序列2]
列表 = [表达式 for 变量1 in 序列1 for 变量2 in 序列2 if 条件语句]

# 方法一
list1 = [10 for x in range(5)]
print(list1)
list2 = [x * 2 for x in range(1,5)]
print(list2)
list3 = [f'{x:0>3}'for x in range(10,15)]
print(list3)

# 方法二:
list4 = [x for x in range(10) if x % 2]
print(list4)
list5 = ['str'+str(x) for x in [1,2,3]]
print(list5)

nums = [23,89,67,56,10,33]
new_nums = [x%10 for x in nums ]
print(new_nums)

# 方法三:
list6 = [f'{x}:{y}' for x in range(1,5) for y in range(10,14) if x % 2 if y % 2 ==0]
print(list6)

2.字典推导式

字典 = {key:value for 变量 in 序列}
字典 = {key:value for 变量 in 序列 if 条件语句}

dict1 = {'a':1,'b':2,'c':3}
dict2 = {value:key for key,value in dict1.items()}
print(dict2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值