一个账号 发表于 2020-3-27 21:20:32

Python 重构 map() 函数

本帖最后由 zltzlt 于 2020-3-28 13:06 编辑

Python 重构 map() 函数

要求

实现 map() 函数

禁止使用 BIF map()

例子

>>> def factorial(num):
      if num == 1:
                return 1
      else:
                return num * factorial(num-1)

      
>>> factorial(3)
6
>>> factorial(4)
24
>>> map(factorial, )
<map object at 0x000001A1735AEB80>
>>> list(map(factorial, ))

>>> tuple(map(factorial, ))
(1, 2, 6, 24, 120, 720, 5040, 40320)
>>> for i in map(factorial, ):
      print(i)

      
1
2
6
24
120
720
5040
40320
>>> map(lambda x : x ** 3, )
<map object at 0x000001A1735AEAF0>
>>> tuple(map(lambda x : x ** 3, ))
(0, 1, 8, 27, 64, 125, 216, 343, 512, 729)
>>> map(list, zip(, ))
<map object at 0x000001A1735AEAF0>
>>> list((1, 2, 3))

>>> tuple(map(list, zip(, )))   # 将元组里面的元组转为列表
(, , )
>>> tuple(zip(, ))
((1, 4), (2, 5), (3, 6))

NOW,IT'S YOUR SHOWTIME ! {:10_256:}

qiuyouzhi 发表于 2020-3-27 21:23:15

本帖最后由 qiuyouzhi 于 2020-3-27 21:33 编辑

def map(func, iterators):
    for each in iterators:
      temp = func(each)
      yield temp
写好啦{:10_327:}

永恒的蓝色梦想 发表于 2020-3-27 21:30:23

本帖最后由 永恒的蓝色梦想 于 2020-3-27 21:35 编辑

class map:
    def __init__(self,func,/,*iterables):
      if iterables:
            self.__func=func
            self.__iterators=tuple((iter(i) for i in iterables))
      else:
            raise TypeError("map() must have at least two arguments.")

    def __reduce__(self):
      return self.__class__,self.__iterators

    def __iter__(self):
      return self

    def __next__(self):
      return self.__func(*)

永恒的蓝色梦想 发表于 2020-3-27 21:31:39

本帖最后由 永恒的蓝色梦想 于 2020-3-27 22:02 编辑

一次性把后面的也做了{:10_256:}None

qiuyouzhi 发表于 2020-3-27 21:33:44

永恒的蓝色梦想 发表于 2020-3-27 21:30


用函数不好吗?

永恒的蓝色梦想 发表于 2020-3-27 21:33:49

qiuyouzhi 发表于 2020-3-27 21:23
写好啦

出错啦{:10_327:}>>> def myMap(func, *iterators):
    for each in iterators:
      temp = func(each)
      yield temp

      
>>> myMap(float,range(5),range(5,11))
<generator object myMap at 0x000001CF33FAB660>
>>> list(_)
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
    list(_)
File "<pyshell#4>", line 3, in myMap
    temp = func(each)
TypeError: float() argument must be a string or a number, not 'range'

Anonymous 发表于 2020-3-27 21:34:58

本帖最后由 匿名 于 2020-3-28 08:05 编辑

qiuyouzhi 发表于 2020-3-27 21:23
写好啦

解答错误

输入:print(list(map(factorial, )))

输出:TypeError: unsupported operand type(s) for -: 'list' and 'int'

预期输出:

永恒的蓝色梦想 发表于 2020-3-27 21:37:44

qiuyouzhi 发表于 2020-3-27 21:33
用函数不好吗?

不喜欢while True

qiuyouzhi 发表于 2020-3-27 21:38:02

永恒的蓝色梦想 发表于 2020-3-27 21:33
出错啦

你手真快。。。
我刚改完,你就搞错。。
现在没问题了

qiuyouzhi 发表于 2020-3-27 21:39:02

永恒的蓝色梦想 发表于 2020-3-27 21:37
不喜欢while True

也没用到while True鸭

永恒的蓝色梦想 发表于 2020-3-27 21:41:30

本帖最后由 永恒的蓝色梦想 于 2020-3-27 21:43 编辑

qiuyouzhi 发表于 2020-3-27 21:38
你手真快。。。
我刚改完,你就搞错。。
现在没问题了

出错啦{:10_327:}>>> from operator import add
>>> def map(func, iterators):
    for each in iterators:
      temp = func(each)
      yield temp

      
>>> map(add,range(5),range(5))
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
    map(add,range(5),range(5))
TypeError: map() takes 2 positional arguments but 3 were given

qiuyouzhi 发表于 2020-3-27 21:45:33

永恒的蓝色梦想 发表于 2020-3-27 21:41
出错啦

说好的只给一个参数呢?
def myMap(func, iterators):
    for each in list(iterators):
      temp = func(each)
      yield temp

Anonymous 发表于 2020-3-27 21:46:38

本帖最后由 匿名 于 2020-3-28 08:05 编辑

qiuyouzhi 发表于 2020-3-27 21:45
说好的只给一个参数呢?

没说一个呀

qiuyouzhi 发表于 2020-3-27 21:47:24

一个账号 发表于 2020-3-27 21:46
没说一个呀

...
行,我改

永恒的蓝色梦想 发表于 2020-3-27 21:53:15

qiuyouzhi 发表于 2020-3-27 21:45
说好的只给一个参数呢?

没听说

qiuyouzhi 发表于 2020-3-27 21:53:56

永恒的蓝色梦想 发表于 2020-3-27 21:53
没听说

。。。
你用内置的map试试你写的能不能运行

永恒的蓝色梦想 发表于 2020-3-27 21:55:22

qiuyouzhi 发表于 2020-3-27 21:53
。。。
你用内置的map试试你写的能不能运行

怎么个意思?

永恒的蓝色梦想 发表于 2020-3-27 21:56:14

qiuyouzhi 发表于 2020-3-27 21:53
。。。
你用内置的map试试你写的能不能运行

测着没问题{:10_327:}

zltzlt 发表于 2020-3-28 08:05:10

def map(func, *iterables):
        for i in zip(*iterables):
                yield func(*i)

_2_ 发表于 2020-3-28 08:47:00

永恒的蓝色梦想 发表于 2020-3-27 21:37
不喜欢while True

应该用 while 1 {:10_256:}
页: [1] 2
查看完整版本: Python 重构 map() 函数