一、高阶函数
如果一个函数的参数是另外一个函数,那么这个函数就可以称为高阶函数
1.1 map
map是系统内置函数,map函数接收两个参数,一个是函数,一个是可迭代对象(Iterable),map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
"""
map(function,iterable)
参数1:function,函数,函数的参数个数取决于后面序列的个数
参数2:iterable,一个序列或多个序列
功能:将传入的函数依次作用于序列中的每一个元素,并把结果作为新的Iterator返回
"""
#1.传入函数一个参数
def fun(x):
return x ** 2
#需求:获取一个列表中每个元素的平方,生成一个新的列表
l1 = map(fun,[1,2,3,4])
print(l1) #<map object at 0x000001E86D3DA6D8> #返回的是迭代器
print(list(l1)) #[1, 4, 9, 16] #将迭代器转换为迭代对象
#传入函数2个参数
l1 = [1,2,3,4]
l2 = [2,3,4,5,6,7]
def mul(x, y):
return x * y
#注意如果两个列表长度不一样,以短的为主计算,函数是平行取值,也就是说x取l1的值,y取l2的值
gen1 = map(mul,l1,l2) #可以使用lambda表达式
print(list(gen1)) #[2, 6, 12, 20]
#提取字典的键
gen3 = map(lambda x:int(x),{'1':10,'2':20})
print(list(gen3)) #[1,2]
#元组
gen4 = map(lambda x,y:(x,y),[1,2,3,4,5],[1,2,3])
print(list(gen4)) #[(1, 1), (2, 2), (3, 3)]
1.2 reduce
reduce()函数也是functools模块中的一个高阶函数。需要引入functools模块才能使用。
'''
functools.reduce(f, iterable[, initializer])
参数1:函数,这个函数需要两个参数。
参数2:可迭代对象
参数3:可选,是默认值
返回值:f函数计算的结果
'''
from functools import reduce
#1.累加求和
def add(x,y)
return x + y
print(reduce(add,[1,2,3,4,5],5))
计算过程:
(1)a = f(1,2) #将1赋值给x,2赋值给y
(2)a = f(a,3) #a赋值给x,3赋值给y
(3)a = f(a,4)
(4)a = f(a,5)
(5)f(d,10) = 20
#将序列变成整数
print(reduce(lambda x,y:x*10+y,[9,0,7,8])) #9078
1.3 filter
filter是内建函数,可以对可迭代对象进行过滤,去除不满足条件的元素
filter(function, iterable)
参数: function 确定是否保留元素,为真保留,为假去除元素,function的值可以None
iterable 可迭代对象
返回值:一个新的迭代器或迭代对象
#1 过滤掉非字符串数据
print(filter(lambda x:isinstance(x,str),['1',8,'2',3,True,0.9]))
等价于:
[s for s in ['1',8,'2',3,True,0.9] if isinstance(s,str)]
#2 回文数
#回文数判断
def is_palindrome(n):
l1 = list(str(n)) #将数字转换为字符串,再将字符串转为列表
l2 = l1[::-1] #获取反向列表
if l1 == l2: #列表比较,长度相同,每一个元素都相同则为真
return True
return False
#找出1-1000内所有的回文数
print(list(filter(is_palindrome,range(1,1001))))
1.4 sorted
sorted是内建函数,用于对有序序列进行排序,生成一个新序列
sorted(iterable[, key][, reverse])
参数:iterable 排序对象,可以列表、元组、字符串等有序序列
key 一个函数,作用于序列的每一个元素,根据函数返回值进行排序,
具体的函数的参数就是取自于可迭代对象中,
reverse 默认从小到大排序,如果reverse为True则从大到小排序
返回值: 新的序列
#字符串排序
print(sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)) #指定把元素变为小写后再排序
#多维数据排序
l=[('a', 1), ('b', 2), ('c', 6), ('d', 4), ('e', 3)]
print(sorted(l,key=lambda x:x[1])) #使用元组的第二个元素排序
students = [{'name':'abc','gender':'男','age':23} ,
{'name': 'kkd', 'gender': '男', 'age': 19} ,
{'name': 'ccxsbc', 'gender': '男', 'age': 20}]
print(sorted(students,key=lambda elem:elem['age'])) #指定用age排序
二、排列和组合
-
排列 从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Arrangement)。特别地,当m=n时,这个排列被称作全排列(Permutation),其值为n!/(n-m)!
-
组合 从n个不同的元素中,任取m(m≤n)个元素为一组,叫作从n个不同元素中取出m个元素的进行组合,计算公式:n!/(m!*(n-m)!)
import itertools #排列 mylist = list(itertools.permutations([1,2,3,4], 2)) print(mylist) print(len(mylist)) #组合 mylist = list(itertools.combinations([1,2,3,4,5], 5)) print(mylist) print(len(mylist)) #笛卡尔积 #repeat 重复3次 mylist = list(itertools.product("QWERTYUIOP", repeat=3)) print(mylist) print(len(mylist)