鱼C论坛

 找回密码
 立即注册
查看: 1116|回复: 26

[已解决]Python 重构 map() 函数

[复制链接]
发表于 2020-3-27 21:20:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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, [1, 2, 3, 4, 5, 6, 7, 8])
<map object at 0x000001A1735AEB80>
>>> list(map(factorial, [1, 2, 3, 4, 5, 6, 7, 8]))
[1, 2, 6, 24, 120, 720, 5040, 40320]
>>> tuple(map(factorial, [1, 2, 3, 4, 5, 6, 7, 8]))
(1, 2, 6, 24, 120, 720, 5040, 40320)
>>> for i in map(factorial, [1, 2, 3, 4, 5, 6, 7, 8]):
        print(i)

        
1
2
6
24
120
720
5040
40320
>>> map(lambda x : x ** 3, [i for i in range(10)])
<map object at 0x000001A1735AEAF0>
>>> tuple(map(lambda x : x ** 3, [i for i in range(10)]))
(0, 1, 8, 27, 64, 125, 216, 343, 512, 729)
>>> map(list, zip([1, 2, 3], [4, 5, 6]))
<map object at 0x000001A1735AEAF0>
>>> list((1, 2, 3))
[1, 2, 3]
>>> tuple(map(list, zip([1, 2, 3], [4, 5, 6])))   # 将元组里面的元组转为列表
([1, 4], [2, 5], [3, 6])
>>> tuple(zip([1, 2, 3], [4, 5, 6]))
((1, 4), (2, 5), (3, 6))

NOW,IT'S YOUR SHOWTIME !
最佳答案
2020-3-28 08:05:10
def map(func, *iterables):
        for i in zip(*iterables):
                yield func(*i)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
写好啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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(*[next(i) for i in self.__iterators])

点评

用函数写一个  发表于 2020-3-28 08:51

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
一个账号 + 2 + 2 + 2 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-27 21:31:39 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-3-27 22:02 编辑

一次性把后面的也做了None
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:33:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:33:49 | 显示全部楼层

出错啦
>>> 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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2020-3-27 21:34:58
本帖最后由 匿名 于 2020-3-28 08:05 编辑


解答错误

输入:print(list(map(factorial, [1, 2, 3, 4, 5, 6, 7, 8])))

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

预期输出:[1, 2, 6, 24, 120, 720, 5040, 40320]

点评

我很赞同!: 5.0
我很赞同!: 5
已改  发表于 2020-3-27 21:38
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:37:44 | 显示全部楼层

不喜欢while True
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:38:02 | 显示全部楼层

你手真快。。。
我刚改完,你就搞错。。
现在没问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:39:02 | 显示全部楼层

也没用到while True鸭
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:41:30 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-3-27 21:43 编辑
qiuyouzhi 发表于 2020-3-27 21:38
你手真快。。。
我刚改完,你就搞错。。
现在没问题了


出错啦
>>> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:45:33 | 显示全部楼层

说好的只给一个参数呢?
def myMap(func, iterators):
    for each in list(iterators):
        temp = func(each)
        yield temp
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2020-3-27 21:46:38
本帖最后由 匿名 于 2020-3-28 08:05 编辑
qiuyouzhi 发表于 2020-3-27 21:45
说好的只给一个参数呢?


没说一个呀
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:47:24 | 显示全部楼层

...
行,我改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:53:15 | 显示全部楼层
qiuyouzhi 发表于 2020-3-27 21:45
说好的只给一个参数呢?

没听说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:53:56 | 显示全部楼层

。。。
你用内置的map试试你写的能不能运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:55:22 | 显示全部楼层
qiuyouzhi 发表于 2020-3-27 21:53
。。。
你用内置的map试试你写的能不能运行

怎么个意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:56:14 | 显示全部楼层
qiuyouzhi 发表于 2020-3-27 21:53
。。。
你用内置的map试试你写的能不能运行

测着没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 08:05:10 | 显示全部楼层    本楼为最佳答案   
def map(func, *iterables):
        for i in zip(*iterables):
                yield func(*i)

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
一个账号 + 2 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-28 08:47:00 From FishC Mobile | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-27 21:37
不喜欢while True

应该用 while 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 10:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表