#coding=UTF-8 from functools import reduce alist = [1, 3, 5, 7, 9] # 1.map def mi(x): return x**2 print "map mi结果:",list(map(mi,alist)) # 1.2 map把元素为int的转化为字符串 print "元素类型为int的转为字符串:",list(map(str,alist)) # 2.reduce # 2.1 把序列[1, 3, 5, 7, 9]变换成整数13579 def test_reduce(x,y): return x*10+y a = reduce(test_reduce,alist) print "reduce结果为:",a # 练习 ''' 1.利用map()函数,把用户输入的不规范的英文名字,变为首字母大写, 其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']: ''' name = ['adam', 'LISA', 'barT'] print "用户输入的不规范的英文名字,变为首字母大写:",list(map(str.capitalize,name)) # 2.Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,可以接受一个list并利用reduce()求积: def prod(x,y): return x*y print "接受一个list并利用reduce()求积:",reduce(prod,alist) # 3.利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456 def str2float(s): dot = 0 num = 0 if "." in s: for i,x in enumerate(s): if x == ".": dot = len(s) - i - 1 s = s.replace('.','') break else: s = s print("s=",s) def fn(x,y): return x * 10 + y def char2num(s): return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s] return reduce(fn,map(char2num,s)) / (10**dot) A = str2float("123.456") print("练习3的结果:",A) # == > 练习3的结果: 123.456 # 3.filter:用于过滤序列和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。 def is_odd(x): return x%2 == 1 print "奇数有:",list(filter(is_odd,[1, 2, 4, 5, 6, 9, 10, 15])) # 3.1 把一个序列中的空字符串删掉,可以这么写: def not_empty(s): return s and s.strip() print "去掉空字符串后:",list(filter(not_empty,['A', '', 'B', None, 'C', ' '])) # 练习回数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()滤掉非回数: def is_pal(x): if str(x)==str(x)[::-1]: return x print "回数有:",list(filter(is_pal,[x for x in range(1,1000)])) print "回数有:",[x for x in range(1,1000) if str(x)==str(x)[::-1]] # 4.sorted 排序算法 s_l = [1,3,6,-20,34] s_l_1 = ["ABC","abc","D","d"] print "升序排列:",sorted(s_l) # 4.1 sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序 print"自定义排序:",sorted(s_l,key=abs) print"自定义反向排序:",sorted(s_l,key=abs,reverse=True) # 4.2 字符串排序依照ASCII print"字符串排序:",sorted(s_l_1) # 4.3 忽略大小写排序 print"忽略字符串大小写排序:",sorted(s_l_1,key=str.lower) # 4.4 要进行反向排序,不必改动key函数,可以传入第三个参数reverse=True: print"忽略字符串大小写反向排序:",sorted(s_l_1,key=str.lower,reverse=True) # 练习假设我们用一组tuple表示学生名字和成绩:L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)] 请用sorted()对上述列表分别按名字排序: L = [('Bob', 75),('Adam', 90), ('Adam', 92), ('Bart', 66), ('Lisa', 88),('Bart', 100), ('Bart', 88)] print "名字列表为:",L def top(t): return t[0] print "按照名字排序(默认升序,名字相同的情况下谁的名字在前谁排在前方):",sorted(L,key=top) # 扩展1:如果名字相同,按照分数排序(默认升序) def by_name_score(t): return (t[0],t[1]) print "名字相同,按照分数升序排序:",sorted(L,key=by_name_score) #待补充 print "名字相同,按照分数降序排列(答案待补充):",sorted(L,key=by_name_score,reverse=True) from operator import itemgetter,attrgetter