qiuyouzhi 发表于 2020-4-18 20:38:52

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

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

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

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

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

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

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

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

print(min((5,7,9,3,2,1,6)))

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


这个咋子弄呢?

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

def Sum(seq):
    res = 0
    for each in seq:
      if type(each) == str:
            continue
      res += each
    return res

print(Sum())

jkluoling1992 发表于 2020-4-18 20:54:12

def min(seq):
    # 万一是元组就不好说了,这里先转换为列表
    temp = list(seq)
    min_v = temp
    for i in temp:
      min_v = i if min_v > i elsemin_v

    return min_v

一上来就排序不好吧,毕竟遍历一边才O(n),排序的复杂度不一定是O(n)

永恒的蓝色梦想 发表于 2020-4-18 20:57:34

0.一个实现比较完整的 min():_no_arg=object()

def min(iterable,/,*vars,key=None,default=_no_arg):
    if vars:
      if default is _no_arg:
            least=iterable
      
      else:
            raise TypeError("Cannot specify a default for min() with multiple positional arguments")

    else:
      vars=iter(iterable)

      try:
            least=next(vars)

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

            else:
                return default

    if key is None:
      for var in vars:
            if var<least:
                least=var

    else:
      flag=key(least)

      for var in vars:
            temp=key(var)

            if temp<flag:
                flag=temp
                least=var

    return least

1.sum() 那个不是缺陷,那个是故意设计的,因为 sum() 用于 str,bytes,bytearray 时很捞……于是就禁止使用{:10_327:}

jkluoling1992 发表于 2020-4-18 21:01:29

永恒的蓝色梦想 发表于 2020-4-18 20:57
0.一个实现比较完整的 min():

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

这个min写的好丰富啊,,,涨姿势了{:10_256:}

qiuyouzhi 发表于 2020-4-18 21:02:24

jkluoling1992 发表于 2020-4-18 20:54
def min(seq):
    # 万一是元组就不好说了,这里先转换为列表
    temp = list(seq)


我并不认为做这个作业的鱼油会考虑到这一点
而且,只要实现就好,为啥要考虑这些复杂度?

jkluoling1992 发表于 2020-4-18 21:05:42

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

写代码不考虑时间复杂度和空间复杂度吗?现在是练习没错的,可以实现就好,但以后工作了,这些东西都是自然而然要考虑的啊

qiuyouzhi 发表于 2020-4-18 21:08:09

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

你都说了现在是练习,就不要考虑时间,空间复杂度什么的了
后面慢慢会学,那就是后面的事情了

jkluoling1992 发表于 2020-4-18 21:16:30

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

您说的对,,交流贴嘛,看看就好

永恒的蓝色梦想 发表于 2020-4-18 21:17:09

jkluoling1992 发表于 2020-4-18 21:01
这个min写的好丰富啊,,,涨姿势了

跟 builtins 功能完全一样哦~不过效率辣鸡{:10_262:}
页: [1]
查看完整版本: Python 课后作业详解 016:序列!序列!