Python3 学习笔记20_函数式编程-高阶函数-map/reduce_20180312

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 学习网站:www.liaoxuefeng.com

#****************************************************
#       Python3 函数式编程-高阶函数-map/reduce       *
#****************************************************
print ("--------------------分割线------------------")

#============
# map()
#============
'''
map()函数接收两个参数,一个是函数,一个是Iterable。map将传入的函数依次
作用到序列的每个元素,并把结果作为新的Iterator返回。
'''
# 例:函数func(x)=x的平方,要把这个函数在一个list上,就可以用map实现
from collections import Iterator

def func(x):
    return x * x

list_a = [ x for x in range(1,8) ]
print( list_a )                         # [1, 2, 3, 4, 5, 6, 7]

map_t = map( func, list_a ) 
print( isinstance(map_t, Iterator) )    # True

print( next(map_t), next(map_t) )       # 1 4

for val in map_t:
    print( val, end=' ' )               # 9 16 25 36 49 
print()

'''
map()传入的第一个参数是func,即函数对象本事。由于结果map_t是一个
Iterator,Iterator是惰性序列,因此通过next()函数和for循环把整个序列
计算出来

for循环也可以实现整个列表的平方,但没有map()简单清晰明了。map作为高阶
函数,事实上它把运算规则抽象了。
'''
# 将列表中所有数字转为字符串
print( list( map(str, [1,2,3]) ) )      # ['1', '2', '3']
print ("--------------------分割线------------------")

#============
#  reduce()
#============
'''
reduce 把一个函数作用在一个序列[1, 2, 3]上,这个函数必须接收两个参数
reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(func, [x1, x2, x3]) = func(func(x1, x2), x3)
'''
# 序列求和计算,reduce版本
from functools import reduce
def func_add(x, y):
    return x + y

print( reduce(func_add, [1, 2, 3, 4]) )         # 10

# 字符串str转换为int函数
from functools import reduce
def func2(x, y):
    return x*10 + y

def char2num(s):
    digits={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
    return digits[s]

print( reduce(func2, map(char2num, '13456')) )  # 13456

# 整理成一个str2int的函数
from functools import reduce

DIGITS = {'0':0,'1':1,'2':2,'3':3,'4':4,\
            '5':5,'6':6,'7':7,'8':8,'9':9}

def str2int(s):
    def func3(x, y):
        return x*10 + y
    def char2num(s):
        return DIGITS[s]
    return reduce(func3, map(char2num, s))

print( str2int('120030') )                      # 120030

# 使用lambda函数进一步简化:
def Str2Int(s):
    return reduce(lambda x,y:x*10+y, map(char2num,s))

print( Str2Int('120030') )                      # 120030
print ("--------------------分割线------------------")


#利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他
#小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']
L1 = ['adam', 'LISA', 'barT']

def normalize(s):   
    return s[0].upper()+s[1:].lower()

L2 = list(map(normalize, L1))
print(L2)                               # ['Adam', 'Lisa', 'Bart']


# Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,
# 可以接受一个list并利用reduce()求积
from functools import reduce

def prod(L):
    return reduce(lambda x, y:x*y, L)

print( prod([2,3,6]) )                  # 36


# 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456
def str2float(s):
    return reduce(lambda x,y:x*10+y,map(int,s.replace('.','')))/10**s.find('.')

print( str2float('123.456') )           # 123.456
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值