1、map() / reduce()
map (函数,Iterable) :map将函数依次作用到Iterable每个元素上,把结果作为新的Iterable返回
#实现函数:f(x)=x*x
#作用在list[1,2,3,4,5,6,7,8,9]上
def f(x):
return x*x
r=list(map(f,[1,2,3,4,5,6,7,8,9]))
print(r)
reduce():把结果继续累积到下一运算中
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
2、
filter():把传入的函数依次作用于每个元素,返回True/False决定保留/丢弃该元素
3、sorted():可以对list进行排序,后加key=可以自定义排序,再加reverse=True 反向排序
#单纯排序
>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
#自定义排序
>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
【练习】
1、利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']:
def transform(name):
return name.capitalize()
s=list(map(transform,['adam', 'LISA', 'barT']))
print(s)
2、Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积:
#!/usr/bin/env python3
#coding=gbk
from functools import reduce
def prod(L):
def p(x,y):
return x*y
s=reduce(p,L)
return s
S=[1,3,5,2,5]
print(prod(S))
3、利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456:
#!/usr/bin/env python3
#coding=gbk
from functools import reduce
def str2float(L):
def char2num(L):
digits={'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9,',':0}
return digits[L]
def str2int(x,y):
return x*10+y
def str2dec(x,y):
return x/10+y
inte,dec=L.split('.',1) #split 符号分割符 遇到'.'符号 分割一次
return reduce(str2int,map(char2num,inte))+reduce(str2dec,map(char2num,dec[::-1]))*0.1
#[::-1]全部数由右末尾1位1位取
#*0.1 是因为最后一位还在小数点左侧
print(str2float('123.456'))
4、回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回数:
def findrl(s):
return str(s)==str(s)[::-1]
output=filter(findrl,range(1,1000))
print(list(output))
5、
假设我们用一组tuple表示学生名字和成绩:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
请用sorted()
对上述列表分别按名字排序:再按成绩从高到低排序:
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] #1 print(sorted(L)) #2 def transposition(t): return (t[1],t[0]) print(sorted(L,key=transposition,reverse=True))