彩世界开奖app官网-彩世界平台官方网址(彩票平台)
做最好的网站
来自 计算机编程 2019-12-07 01:37 的文章
当前位置: 彩世界开奖app官网 > 计算机编程 > 正文

python基础——map/reduce【彩世界开奖app官网】

  1. 再看reduce的用法。reduce把三个函数成效在叁个系列[x1, x2, x3, ...]上,这些函数必需采纳多少个参数,reduce把结果再而三和连串的下三个元素做积存总括,其效果就是:

    reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
    
    比方说对一个序列求和,就可以用reduce实现:
    
    >>> from functools import reduce
    >>> def add(x, y):
    ...     return x   y
    ...
    >>> reduce(add, [1, 3, 5, 7, 9])
    25
    

    那几个例子本身没多大用途,然而,即使杜撰到字符串str也是一个队列,对地方的例子稍加改变,同盟map(),大家就能够写出把str转换为int的函数:

    >>> from functools import reduce
    >>> def fn(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]
    ...
    >>> reduce(fn, map(char2num, '13579'))
    13579
    

     

  2. ### 练习

    1. 利用map()函数,把顾客输入的不专门的学问的意大利共和国语名字,变为首字母大写,别的小写的科班名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']

      #-*- coding: utf-8 -*-
      def normalize(name):
          return name.capitalize()
      
      # 测试:
      L1 = ['adam', 'LISA', 'barT']
      L2 = list(map(normalize, L1))
      print(L2)
      

       

    2. Python提供的sum()函数能够采用二个list并求和,请编写一个prod()函数,能够承当一个list并选择reduce()求积

      # -*- coding: utf-8 -*-
      from functools import reduce
      
      def prod(L):
          def fn(x,y):
              return x*y
          return reduce(fn,L)
      
      print('3 * 5 * 7 * 9 =', prod([3, 5, 7, 9]))
      if prod([3, 5, 7, 9]) == 945:
          print('测试成功!')
      else:
          print('测试失败!')
      

       

    3. 利用mapreduce编排一个str2float函数,把字符串'123.456'转变来浮点数123.456

      # -*- coding: utf-8 -*-
      from functools import reduce
      
      def str2float(s):
          DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
          pos = len(s)-s.index(".")-1 #寻找小数位
      
          def char2num(my_str):
              if(my_str != "."):
                  return DIGITS[my_str]
      
          def fn(x,y):
              if y==None:
                  return x
              else:
                  return 10*x y
          return reduce(fn,map(char2num,s))/(10**pos)
      
      print('str2float('123.456') =', str2float('123.456'))
      if abs(str2float('123.456') - 123.456) < 0.00001:
          print('测试成功!')
      else:
          print('测试失败!')
      

       

       

 

设若, python未有提供 int(卡塔尔(英语:State of Qatar) 函数, 大家完全能够仁慈写三个把字符串转变为证件的函数, 并且只须求几行代码. 

其风度翩翩剧情小编是参照廖雪峰的博客,摘抄在那之中一些剧情而来的,附带撤消他最后的题目代码。

python基础——map/reduce

  

  Python内建了map()reduce()函数。

  假诺你读过谷歌的那篇惹人注目的舆论“MapReduce: Simplified Data Processing on Large Clusters”,你就能够大致精通map/reduce的定义。

  大家先看map。map()函数选择四个参数,三个是函数,叁个是Iterablemap将盛传的函数依次成效到行列的种种成分,并把结果作为新的Iterator返回

  举个例子说明,比方大家有八个函数f(x卡塔尔=x2,要把那么些函数功效在三个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就能够用map()贯彻如下:

 

彩世界开奖app官网 1

  将来,大家用Python代码达成:

>>> def f(x):
...     return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

map()传播的第三个参数是f,即函数对象自笔者。由于结果r是一个IteratorIterator是惰性体系,因而通过list()函数让它把任何系列都总计出来并赶回多个list

  你大概会想,无需map()函数,写叁个循环,也得以测算出结果:

L = []
for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:
    L.append(f(n))
print(L)

  的确能够,不过,从地点的循环代码,能一眼看明白“把f(x卡塔尔国成效在list的每二个要素并把结果生成多个新的list”吗?

  所以,map()用作高阶函数,事实上它把运算准绳抽象了,由此,大家不但能够测算轻便的f(x卡塔尔国=x2,还是能总计大肆复杂的函数,比方,把这么些list全体数字转为字符串:

>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

  只需求风度翩翩行代码。

  再看reduce的用法。reduce把多个函数作用在三个连串[x1, x2, x3, ...]上,那个函数必得选用三个参数,reduce把结果一连和种类的下八个成分做积累计算,其功效正是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

  举例说对三个队列求和,就足以用reduce实现:

>>> from functools import reduce
>>> def add(x, y):
...     return x   y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25

  当然求和平运动算能够平素用Python内建函数sum(),没供给运用reduce

  可是倘诺要把类别[1, 3, 5, 7, 9]调换来整数13579reduce就足以派上用项:

>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10   y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579

  那几个例子本人没多大用途,但是,假设假造到字符串str也是三个连串,对地点的事例稍加改换,合营map(),大家就能够写出把str转换为int的函数:

>>> from functools import reduce
>>> 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]
...
>>> reduce(fn, map(char2num, '13579'))
13579

  收拾成叁个str2int的函数就是:

from functools import reduce

def str2int(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))

  还足以用lambda函数进一层简化成:

from functools import reduce

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]

def str2int(s):
    return reduce(lambda x, y: x * 10   y, map(char2num, s))

  也正是说,如若Python没有提供int()函数,你一丝一毫能够本身写四个把字符串转变为整数的函数,而且只须求几行代码!

  lambda函数的用法在背后介绍。

只要求一条代码

  1.  那是自家在C/C 中平素不见过的语法(只怕是自身学艺未精卡塔尔国,精通它真的花了十来十九分钟。它提供了一条google的散文链接:“MapReduce: Simplified Data Processing on Large Clusters",据书上说是蓬蓬勃勃篇很牛逼的小说。当自家精通了那几个定义后,认为真的很有益于。
  2. 先看map。map()函数选取多少个参数,贰个是函数,叁个是Iterablemap将盛传的函数依次功效到行列的每一个成分,并把结果作为新的Iterator返回。

    比如表明,举个例子大家有三个函数f(x卡塔尔国=x2,要把那个函数成效在贰个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就能够用map()达成如下:

练习

  1、利用map()函数,把客商输入的不专门的学问的俄语名字,变为首字母大写,别的小写的正规名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']

#练习一:
'''
利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。
输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']:
'''
def normalize(name):    #name为一个字符串
    name=name[0].upper() name[1:].lower()    #name[0]表示字符串的首字符
    return name


res=map(normalize,['lINdA','TOM','pAUlA','iSelYONA'])    #将normalize()函数依次作用于'lINdA'
#'TOM' 'pAUlA' 和'iSelYONA'
print(list(res))

  

  运作结果:

  彩世界开奖app官网 2

  

  2、Python提供的sum()函数能够承担七个list并求和,请编写二个prod()函数,能够肩负三个list并利用reduce()求积:

#练习二:
'''
Python提供的sum()函数可以接受一个list并求和,请编写一个prod()函数,
可以接受一个list并利用reduce()求积
'''

def prod(L):    #L为一个list
    def Mult(x,y):
        return x *y

    return reduce(Mult,L)

L1=[3,5,7,9]
print(prod(L1))

  

  运行结果:

      彩世界开奖app官网 3

 

  3、利用mapreduce编写制定一个str2float函数,把字符串'123.456'调换到浮点数123.456

#练习三:
'''
利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456:
'''

def str2float(s):
    s=s.split('.')            #以'.'分割字符串

    def f_int(x,y):            #计算整数部分
        return x*10  y

    def f_dec(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(f_int,map(char2num,s[0]))   reduce(f_dec,list(map(char2num,s[1]))[::-1])/10
    #[::-1]翻转list 注意最后还得除以10,因为reduce处理完之后是4.56,还得将小数点往前移一位
print(str2float('123.456'))

 

 

  运作结果:

     彩世界开奖app官网 4

 

 

                f(x) = x * x

                      │
                      │
      ┌────────────--------───┐
      │   │   │   │   │   │   │   │   │
      ▼   ▼   ▼   ▼   ▼   ▼   ▼   ▼   ▼

    [ 1    2    3    4    5    6    7    8    9 ]

      │   │   │   │   │   │   │   │   │
      │   │   │   │   │   │   │   │   │
      ▼   ▼   ▼   ▼   ▼   ▼   ▼   ▼   ▼

    [ 1    4    9   16    25   36   49   64   81 ]

现在,我们用Python代码实现:

    1 >>> def f(x):
    2 ...     return x * x
    3 ...
    4 >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    5 >>> list(r)
    6 [1, 4, 9, 16, 25, 36, 49, 64, 81]

`map()`传入的第一个参数是`f`,即函数对象本身。由于结果`r`是一个`Iterator`,`Iterator`是惰性序列,因此通过`list()`函数让它把整个序列都计算出来并返回一个list。

 

(1卡塔尔国 reduce把叁个函数功能在三个连串[x1,x2,x3, ...]上, 那么些函数必得选用四个参数, reduce把结果三番五次和种类的写二个要素做储存总计:

>>> def f(x):
...     return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

输入 ['adam', 'LISA', 'barT'] , 输出 ['Adam', 'Lisa', 'Bart']

 

 

(1卡塔尔 filter(卡塔尔 的法力是从叁个体系中挑选出相符条件的因素, 过滤系列

python提供的sum(卡塔尔 函数可以承担贰个list并求和, 请编写一个prod(卡塔尔(قطر‎函数, 能够接收一个list并行使reduce(卡塔尔国求积: 

from functools import reduce

def str2int(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))

 

 

  1. filter

使用map和reduce编写八个str2float函数, 把字符串'123.456'转换来浮点数123.456

用filter(卡塔尔国 求素数, 总计素数的四个形式是艾氏筛法

 

1. map

 

 

def normalize(name):
    return name[:1].upper()   name[1:].lower()

L1 = ['adam', 'LISA', 'baarT']
L2 = list(map(normalize, L1))
print(L2)

 

(6卡塔尔国 filter(卡塔尔(英语:State of Qatar) 函数重回的是三个Iterator, 也便是一个惰性连串, 所以要强迫filter(卡塔尔(قطر‎ 实现总结结果, 须求用list(卡塔尔(قطر‎函数拿到全体结果并重回list.

 

 

from functools import reduce
def prod(L):
    def func(x, y):
        return x * y
    return reduce(func, L)

L = [3, 5, 7, 9]
print(prod(L))

2. reduce

 

 

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
>>> from functools import reduce
>>> def add(x, y):
...     return x   y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
def is_palindrome(num):
    n=str(num)
    if(n==n[::-1]):
        return num

output = filter(is_palindrome, range(1, 100000))
print(list(output))

(2卡塔尔 和map(卡塔尔(قطر‎ 近似, filter(卡塔尔(英语:State of Qatar)也收到二个函数和叁个行列, 和map(卡塔尔(英语:State of Qatar)不一致的是, filter(卡塔尔(英语:State of Qatar)把传播的函数依次成效于种种元素, 然后基于重临值是true依旧false决定封存照旧扬弃该成分.

(4) 练习

回数是指从左向右读和从右向左读没什么不肖似的数, 比如12321, 909. 请利用filter(卡塔尔国滤掉非回数:

 

#生成器, 生成从3开始的奇数序列
def _old_iter():
    n = 1
    while True:
        n = n   2
        yield n

#筛选函数
def _not_divisible(n):
    return lambda x:x % n > 0

#生成器, 不断的返回下一个素数
def primes():
    yield 2
    it = _old_iter()
    while True:
        n = next(it)
        yield n
        it = filter(_not_divisible(n), it)
#循环打印
for n in primes():
    if n < 200:
        print(n)
    else:
        break

(2) reduce配合map, 把str转换为int

 

采用map(卡塔尔(قطر‎ 函数, 把客商输入的不标准的阿尔巴尼亚语名字, 变为首字母大写, 别的小写的正儿八经名字

>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

(7) 例子: 

 

再例如对叁个队列求和, 就能够用reduce完毕:

(1卡塔尔(英语:State of Qatar) map(卡塔尔(قطر‎函数接纳七个参数, 二个时函数, 二个时Iterable, map将盛传的函数贰回成效到薛烈的各种成分, 并把结果作为新的Iterator重返.

(3卡塔尔国 举个例子, 在一个list中, 删掉偶数, 只保留奇数, 能够如此写:

(5卡塔尔(英语:State of Qatar) 用filter(卡塔尔(英语:State of Qatar) 这一个高阶函数, 关键在方岚确贯彻两个筛选函数.

from functools import reduce
def str2float(s):      
    def str2num(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))
    a,b=s.split('.') 
    return str2num(a) 0.1**len(b)*str2num(b)
print(str2float('123.456'))
def is_odd(n):
    return n % 2 == 1

list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]
def not_empty(s):
    return s and s.strip()

list(filter(not_empty, ['A', '', 'B', None, 'C', '  ']))
# 结果: ['A', 'B', 'C']

(5) 练习

(2卡塔尔国 map(卡塔尔(قطر‎ 作为高阶函数, 事实上它把运算准绳抽象了, 因而, 大家不但能够总结轻便的f(x卡塔尔=x^2, 还足以测算任性复杂的函数, 举例, 把这几个list全部数字转为字符串:

(8) 练习:

(3) 练习

 

(4卡塔尔(英语:State of Qatar) 举例, 把三个队列中的空字符串删掉, 能够如此写: 

本文由彩世界开奖app官网发布于计算机编程,转载请注明出处:python基础——map/reduce【彩世界开奖app官网】

关键词: Python map&amp;amp reduce [py