1.高阶函数
高阶函数
- 实参是一个函数
- 函数的返回值也是一个函数
def fun(x,y,f):
return f(x),f(y)
print(fun(-10,34,abs))
2.内置高阶函数
2.1.map()
map():接收两个参数 一个是函数 一个是序列
map将传入的函数依次作用到序列的每个元素 并且把结果作为新的序列返回
对一个序列[-1,3,-4,-5]的每一个元素求绝对值
print(list(map(abs,[-1,3,-4,-5])))
对序列的每个元素求阶乘
import random
def f(x):
"""对x求阶乘"""
res = 1
for i in range(1,x+1):
res = res * i
return res
li = [random.randint(2,7) for i in range(10)]
print(list(map(f,li)))
2.2.reduce()
reduce():把一个函数作用在一个序列上,这个函数必须接收两个参数。
reduce把结果继续和序列的下一个元素做累积计算,reduce(f,[1,2,3,4]) = f(f(f(1,2),3),4)。
- python2:reduce是内置函数
- python3.x:from functools import reduce
from functools import reduce
def multi(x,y):
return x*y
print(reduce(multi,range(1,10)))
def add(x,y):
return x+y
print(reduce(add,range(1,101))
2.3.filter()
filter过滤函数
- filter()把传入的函数依次作用于,序列的每个元素 然后根据返回值是True或者False,决定保留还是丢弃该元素。
def isodd(num):
if num % 2 == 0:
return True
else:
return False
print(list(filter(isodd,range(100))))
2.4.匿名函数lambda()
from functools import reduce
print(reduce(lambda x,y:x+y,range(100)))
print(list(map(lambda x:x**2,range(5))))
print(list(filter(lambda x:x%2==0,range(100))))
2.5…内置函数sort
# 改变原有的list
li = [4, 5, 6, 7, 2, 1, 3, 8, 9, 10]
li.sort()
print(li)
# 不改变原来的list
li = [4, 5, 6, 7, 2, 1, 3, 8, 9, 10]
li1 = li[:]
li1.sort()
print(li1)
print(li)
# 不改变原来的list
li = [4, 5, 6, 7, 2, 1, 3, 8, 9, 10]
li2 = sorted(li)
print(li2)
print(li)
# sorted中添加函数
li3 = [4, -5, -6, 7, 2, -1, 3, -8, 9, -10]
li4 = sorted(li3, key=abs)
print(li4)
print(li3)
# 给字符串排序
s = ['daas', 'dasas', 'FEDFerw', 'fsadER']
print(s)
print(sorted(s))
print(sorted(s, key=str.lower))
print(sorted(s, key=str.upper))
# 指定位置排序
students =[('john','A',15),
('jane','B',12),
('dave','B',10)]
print(sorted(students,key=lambda student:students[2]))
info = [
# 商品名称 商品数量 商品价格
('apple1', 200, 100),
('apple2', 40, 32),
('apple3', 20, 10),
('apple4', 20, 15),
]
# 按照商品数量进行排序
def sorted_by_count(x):
return x[1]
print(sorted(info, key=sorted_by_count))
# 按照商品价格进行排序
def sorted_by_price(x):
return x[2]
print(sorted(info, key=sorted_by_price))
# 先按照商品数量进行排序 如果商品数量一致
# 则按照商品价格进行排序
def sorted_by_count_price(x):
return x[1], x[2]
print(sorted(info, key=sorted_by_count_price))
nums = [3,2,8,0,1]
print(sorted(nums,))
练习
test–1
将一个字符串转换成整型
- ‘12345’—12345
from functools import reduce
def str2int(s):
def char2int(ch):
c = {str(x): x for x in range(10)}
return c[ch]
def fun(n1, n2):
return n1 * 10 + n2
return reduce(fun, map(char2int, s))
num = str2int('24312412')
print(num,type(num))
li = ['123','456']
li.reverse()
print(li)
reverse() 函数
- 该方法没有返回值,但是会对列表的元素进行反向排序。
test–2
回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数。
from functools import reduce
def is_palindrome(n):
l = list(str(n)) #['1','0' ]
l.reverse() # ['0','1'] #
# 1*10+0 = 10
num = reduce(lambda x,y:int(x) * 10 + int(y),l)
return num == n
output = filter(is_palindrome,range(1,1000))
print('1~1000:',list(output))
test–3
利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。
capitalize()方法语法:
- str.capitalize()
- capitalize()将字符串的第一个字母变成大写,其他字母变小写。
def normalize(name):
return list(map(lambda x:x.capitalize(),name))
L = ['adam','LISA','TOM']
print(normalize(L))
test–4
利用map和reduce编写一个str2float函数,把字符串’123.456’转换成浮点数123.456。
from functools import reduce
def str2float(s):
ch = {str(x): x for x in range(10)}
# 先将字符串分割
l = s.split('.')
# 将整数部分
n1 = reduce(lambda x, y: x * 10 + y, map(lambda x: ch[x], l[0]))
# 将小数部分
n2 = reduce(lambda x, y: x * 10 + y, map(lambda x: ch[x], l[1]))
n2 *= 0.1 ** len(l[1]) # a *=1 a = a*1 n2 = n2 * 0.1**4
return n1 + n2
num = str2float('1234.4567')
print(num, type(num))
test–5
(2018-携程-春招题)题目需求:
给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;
在原始数组上进行移动操作, 勿创建新的数组;
- 输入:第一行是数组长度
- 输出:调整后数组的内容;
n = int(input())
li = [int(input()) for i in range(n)]
def move_zone(item):
if item == 0:
return 2
else:
return 1
for i in sorted(li,key=move_zone):
print(i)
test–6
有一个整数列表(10个元素),要求调整元素的顺序
把奇数放在前面 偶数放在后面
li = [int(input()) for i in range(10)]
def move_zone(item):
if item % 2==0:
return 2
else:
return 1
for i in sorted(li,key=move_zone):
print(i)