鱼C论坛

 找回密码
 立即注册
查看: 1703|回复: 8

[技术交流] Python 课后作业详解 016:序列!序列!

[复制链接]
发表于 2020-4-18 20:38:52 | 显示全部楼层 |阅读模式

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

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

x
Python 课后作业详解 016:序列!序列!


0. 猜想一下 min() 这个BIF的实现过程

其实很简单的,只要设置一个变量(这里方便称呼,设为x)用于存放最小值,

然后遍历列表,如果遍历到的值比x小,则x = 遍历到的值(x默认为列表第一个元素)

BUT,当时我是怎么想的呢?

直接排个序,然后返回第一个就好:

  1. def min(seq):
  2.     # 万一是元组就不好说了,这里先转换为列表
  3.     temp = list(seq)
  4.     temp.sort()
  5.     return temp[0]

  6. print(min((5,7,9,3,2,1,6)))
复制代码


1. 视频中我们说 sum() 这个BIF有个缺陷,就是如果参数里有字符串类型的话就会报错,
请写出一个新的实现过程,自动“无视”参数里的字符串并返回正确的计算结果。


这个咋子弄呢?

直接遍历给的参数,然后判断类型(type或isinstance)就好了。

  1. def Sum(seq):
  2.     res = 0
  3.     for each in seq:
  4.         if type(each) == str:
  5.             continue
  6.         res += each
  7.     return res

  8. print(Sum([1,2,3,"4",5,6,7,8,9]))
复制代码


本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-4-18 20:54:12 | 显示全部楼层
def min(seq):
    # 万一是元组就不好说了,这里先转换为列表
    temp = list(seq)
    min_v = temp[0]
    for i in temp:
        min_v = i if min_v > i else  min_v

    return min_v

一上来就排序不好吧,毕竟遍历一边才O(n),排序的复杂度不一定是O(n)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-18 20:57:34 | 显示全部楼层
0.一个实现比较完整的 min():
  1. _no_arg=object()

  2. def min(iterable,/,*vars,key=None,default=_no_arg):
  3.     if vars:
  4.         if default is _no_arg:
  5.             least=iterable
  6.         
  7.         else:
  8.             raise TypeError("Cannot specify a default for min() with multiple positional arguments")

  9.     else:
  10.         vars=iter(iterable)

  11.         try:
  12.             least=next(vars)

  13.         except StopIteration:
  14.             if default is None:
  15.                 raise ValueError("min() arg is an empty sequence")

  16.             else:
  17.                 return default

  18.     if key is None:
  19.         for var in vars:
  20.             if var<least:
  21.                 least=var

  22.     else:
  23.         flag=key(least)

  24.         for var in vars:
  25.             temp=key(var)

  26.             if temp<flag:
  27.                 flag=temp
  28.                 least=var

  29.     return least
复制代码


1.sum() 那个不是缺陷,那个是故意设计的,因为 sum() 用于 str,bytes,bytearray 时很捞……于是就禁止使用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2020-4-18 21:01:29 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-4-18 20:57
0.一个实现比较完整的 min():

1.sum() 那个不是缺陷,那个是故意设计的,因为 sum() 用于 str,bytes,by ...

这个min写的好丰富啊,,,涨姿势了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-18 21:02:24 | 显示全部楼层
jkluoling1992 发表于 2020-4-18 20:54
def min(seq):
    # 万一是元组就不好说了,这里先转换为列表
    temp = list(seq)

我并不认为做这个作业的鱼油会考虑到这一点
而且,只要实现就好,为啥要考虑这些复杂度?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-18 21:05:42 | 显示全部楼层
qiuyouzhi 发表于 2020-4-18 21:02
我并不认为做这个作业的鱼油会考虑到这一点
而且,只要实现就好,为啥要考虑这些复杂度?

写代码不考虑时间复杂度和空间复杂度吗?现在是练习没错的,可以实现就好,但以后工作了,这些东西都是自然而然要考虑的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-18 21:08:09 | 显示全部楼层
jkluoling1992 发表于 2020-4-18 21:05
写代码不考虑时间复杂度和空间复杂度吗?现在是练习没错的,可以实现就好,但以后工作了,这些东西都是自 ...

你都说了现在是练习,就不要考虑时间,空间复杂度什么的了
后面慢慢会学,那就是后面的事情了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-18 21:16:30 | 显示全部楼层
qiuyouzhi 发表于 2020-4-18 21:08
你都说了现在是练习,就不要考虑时间,空间复杂度什么的了
后面慢慢会学,那就是后面的事情了

您说的对,,交流贴嘛,看看就好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-18 21:17:09 | 显示全部楼层
jkluoling1992 发表于 2020-4-18 21:01
这个min写的好丰富啊,,,涨姿势了

跟 builtins 功能完全一样哦~不过效率辣鸡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-28 17:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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