鱼C论坛

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

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

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

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

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

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

Python 重构 map() 函数


要求

实现 map() 函数

禁止使用 BIF map()


例子

  1. >>> def factorial(num):
  2.         if num == 1:
  3.                 return 1
  4.         else:
  5.                 return num * factorial(num-1)

  6.         
  7. >>> factorial(3)
  8. 6
  9. >>> factorial(4)
  10. 24
  11. >>> map(factorial, [1, 2, 3, 4, 5, 6, 7, 8])
  12. <map object at 0x000001A1735AEB80>
  13. >>> list(map(factorial, [1, 2, 3, 4, 5, 6, 7, 8]))
  14. [1, 2, 6, 24, 120, 720, 5040, 40320]
  15. >>> tuple(map(factorial, [1, 2, 3, 4, 5, 6, 7, 8]))
  16. (1, 2, 6, 24, 120, 720, 5040, 40320)
  17. >>> for i in map(factorial, [1, 2, 3, 4, 5, 6, 7, 8]):
  18.         print(i)

  19.         
  20. 1
  21. 2
  22. 6
  23. 24
  24. 120
  25. 720
  26. 5040
  27. 40320
  28. >>> map(lambda x : x ** 3, [i for i in range(10)])
  29. <map object at 0x000001A1735AEAF0>
  30. >>> tuple(map(lambda x : x ** 3, [i for i in range(10)]))
  31. (0, 1, 8, 27, 64, 125, 216, 343, 512, 729)
  32. >>> map(list, zip([1, 2, 3], [4, 5, 6]))
  33. <map object at 0x000001A1735AEAF0>
  34. >>> list((1, 2, 3))
  35. [1, 2, 3]
  36. >>> tuple(map(list, zip([1, 2, 3], [4, 5, 6])))   # 将元组里面的元组转为列表
  37. ([1, 4], [2, 5], [3, 6])
  38. >>> tuple(zip([1, 2, 3], [4, 5, 6]))
  39. ((1, 4), (2, 5), (3, 6))
复制代码


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

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-27 21:23:15 | 显示全部楼层
本帖最后由 qiuyouzhi 于 2020-3-27 21:33 编辑
  1. def map(func, iterators):
  2.     for each in iterators:
  3.         temp = func(each)
  4.         yield temp
复制代码

写好啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:30:23 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-3-27 21:35 编辑
  1. class map:
  2.     def __init__(self,func,/,*iterables):
  3.         if iterables:
  4.             self.__func=func
  5.             self.__iterators=tuple((iter(i) for i in iterables))
  6.         else:
  7.             raise TypeError("map() must have at least two arguments.")

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

  10.     def __iter__(self):
  11.         return self

  12.     def __next__(self):
  13.         return self.__func(*[next(i) for i in self.__iterators])
复制代码

点评

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

一次性把后面的也做了None
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-27 21:33:44 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

出错啦
  1. >>> def myMap(func, *iterators):
  2.     for each in iterators:
  3.         temp = func(each)
  4.         yield temp

  5.         
  6. >>> myMap(float,range(5),range(5,11))
  7. <generator object myMap at 0x000001CF33FAB660>
  8. >>> list(_)
  9. Traceback (most recent call last):
  10.   File "<pyshell#6>", line 1, in <module>
  11.     list(_)
  12.   File "<pyshell#4>", line 3, in myMap
  13.     temp = func(each)
  14. TypeError: float() argument must be a string or a number, not 'range'
复制代码
小甲鱼最新课程 -> https://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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你手真快。。。
我刚改完,你就搞错。。
现在没问题了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

也没用到while True鸭
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


出错啦
  1. >>> from operator import add
  2. >>> def map(func, iterators):
  3.     for each in iterators:
  4.         temp = func(each)
  5.         yield temp

  6.         
  7. >>> map(add,range(5),range(5))
  8. Traceback (most recent call last):
  9.   File "<pyshell#2>", line 1, in <module>
  10.     map(add,range(5),range(5))
  11. TypeError: map() takes 2 positional arguments but 3 were given
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

说好的只给一个参数呢?
  1. def myMap(func, iterators):
  2.     for each in list(iterators):
  3.         temp = func(each)
  4.         yield temp
复制代码
小甲鱼最新课程 -> https://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 | 显示全部楼层

...
行,我改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

没听说
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

。。。
你用内置的map试试你写的能不能运行
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

怎么个意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

测着没问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

应该用 while 1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 03:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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