1.高阶函数
高阶函数: 实参是一个函数名,函数的返回值也是一个函数
(1).函数本身也可以赋值给变量,变量也可以指向函数
# abs:求绝对值的函数
f = abs
print(f(-10))
(2).传递的参数包括函数名
f = abs
def fun(x,y,f):
return f(x),f(y)
print(fun(-10,34,abs))
2.内置高阶函数
(1).map函数
map函数: 接收两个参数,一个是函数,一个是序列
map将传入的函数依次作用到序列的每个元素,并且把结果作为新的序列返回
注意: map函数返回的是一个序列
1.求序列中每个元素的绝对值
# map(函数,序列):传入的函数依次作用到序列的每个元素,并且把结果作为新的序列返回
# abs:求绝对值的函数
print(list(map(abs,[1,-2,-5,4,])))
2.求由10个在2-7范围内的随机数生成的序列中每个元素的阶乘
import random
# 1.定义阶乘函数
def jc(n):
sum = 1
for i in range(1,n+1):
sum *= i
return sum
# 2.生成由10个在2-7范围内的随机数组成的序列
# 一般方法:
# for i in range(10):
# n = random.randint(2,7)
# print(n,jc(n))
# 列表生成式:
li = [random.randint(2,7) for i in range(10)]
print(li)
# 3.利用map函数求列表中每个元素的阶乘
print(list(map(jc,li)))
(2).reduce函数
reduce函数: 把一个函数作用在一个序列上,这个函数必须接收两个参数,一个是函数,一个是序列
reduce把结果继续和序列的下一个元素累计计算
reduce(f,[x1,x2,x3,x4,x5]) = f(f(f(f(x1,x2),x3),x4),x5)
注意: reduce函数返回的是一个数(计算结果)
1.计算 1 * 2 * 3 * 4 * 5
# 导入reduce模块
from functools import reduce
def multi(x,y):
return x*y
print(reduce(multi,range(1,6)))
2.计算1+2+3+4+5
# 导入reduce模块
from functools import reduce
def add(x,y):
return x + y
print(reduce(add,[1,2,3,4,5]))
3.filter过滤函数
filter过滤函数: 和map类似,也接收一个函数和一个序列
但是和map不同的是,filter把传入的函数依次作用于每个元素然后根据返回值是True还是False决定保留还是丢弃该元素
注意: filter函数返回的是一个序列
输出100以内所有偶数:
def isodd(num):
if num % 2 == 0:
return True
else:
return False
# filter:保留返回值是True的元素
print(list(filter(isodd,range(100))))
4.sorted排序函数
使用sorted函数,排好序后的序列是一个列表
1.列表的排序
li = [5,3,2,4]
print(li)
# 1.sort方法: 排序(默认为顺序排列)
li.sort()
print(li)
# reverse=True:表示倒序排列倒序排列
li.sort(reverse=True)
print(li)
# 2.sorted函数: 排序(reverse=True:表示倒序排列)
a = sorted(li,reverse=True)
print(a)
2.字典的排序
(1).按照商品名称进行排序
info = {
# 商品名称 商品数量 商品价格
('apple1',20,32),
('apple2',23,12),
('apple3',31,60),
('apple4',31,23),
('apple5',28,7)
}
# 集合的输出不一定是按定义的顺序输出的
print(info)
# print(type(info))
# 1).方式1:默认按照商品名称排序
print(sorted(info))
# 2).方式2:
def sorted_by_count(x):
#print(x[0])
return x[0]
print(sorted(info,key=sorted_by_count))
(2).按照商品数量进行排序
nfo = {
# 商品名称 商品数量 商品价格
('apple1',20,32),
('apple2',23,12),
('apple3',31,60),
('apple4',31,23),
('apple5',28,7)
}
print(info)
def sorted_by_count(x):
return x[1]
print(sorted(info,key=sorted_by_count))
(3).按照商品数量进行排序,如果商品数量一样,再按照商品价格排序
nfo = {
# 商品名称 商品数量 商品价格
('apple1',20,32),
('apple2',23,12),
('apple3',31,60),
('apple4',31,23),
('apple5',28,7)
}
print(info)
(4).按照商品价格进行排序
nfo = {
# 商品名称 商品数量 商品价格
('apple1',20,32),
('apple2',23,12),
('apple3',31,60),
('apple4',31,23),
('apple5',28,7)
}
print(info)
def sorted_by_price(x):
return x[2]
print(sorted(info,key=sorted_by_price))
排序练习:
题目需求:
给定一个整形数组,将数组中所有的0移动到末尾,非0项保持不变;
在原始数组上进行移动操作,勿创建新的数组;
# 输入:
第一行是数组长度,后续每一行是数组的一条记录;
4
0
7
0
2
# 输出:
调整后数组的内容;
4
7
2
0
0
代码:
# 定义空列表
li = []
# 接收用户输入的第一个数:数组的长度
len = int(input())
# 1.按题目要求输入
# 接收用户输入的数组并依次添加到列表中
for i in range(len):
num = int(input())
# append:添加元素
li.append(num)
# 2.排序
# item是列表中的所有元素
def sorted_0(item):
if item == 0:
return 1
else:
return 0
# 根据 key:函数的返回值 排序
new_li = sorted(li,key=sorted_0)
# 3.按题目要求输出
print(len)
for i in new_li:
print(i)
运行结果: