**注意:**调用reduce前要加一句from functools import reduce
补充:lambda用法:lambda 变量:表达式
练习练习1
利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:[‘adam’, ‘LISA’, ‘barT’],
输出:[‘Adam’, ‘Lisa’, ‘Bart’]:
def normalize(name):
name=name[0].upper()+name[1:].lower()
return name
练习练习2
Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积:
def prod(L):
def fn(x,y):
return x*y
return reduce(fn,L)
练习练习3
利用map和reduce编写一个str2float函数,把字符串’123.456’转换成浮点数123.456:
def str2num(s):
D={'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'0':0,'.':'.'}
def digits(x):
return D[x] I=list(map(digits,s))
d=I.index('.')
I.remove('.')
def fn(x,y):
return x*10+y
return reduce(fn,I[:d])+reduce(fn,I[d:len(I)])*10**(-1*(len(I)-d))
其中:** 表示幂次
filter
和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返
回值是True还是False决定保留还是丢弃该元素。
用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。
e.g:
def is_odd(n):
return n % 2 == 1 #删除偶数
def not_empty(s):
return s and s.strip() #删除序列中的空字符串
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
list(filter(not_empty, ['A', '', 'B', None, 'C', ' '])) #调用
strip() :用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列
filter()函数返回的是一个Iterator,也就是一个惰性序列
用用filter求素数求素数
# 构造一个从3开始的奇数序列
def _odd_iter():
n = 1
while True:
n = n + 2
yield n
# 定义一个筛选函数
def _not_divisible(n):
return lambda x: x % n > 0 #返回取余大于零的x,此时n为一个序列的首元素,x是序列中的全部元素
# 定义一个生成器,不断返回下一个素数
def primes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter(_not_divisible(n), it) # 构造新序列,此时会去掉序列的第一个数
评论0
最新资源