鱼C论坛

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

[技术交流] P17 016序列!序列!课后题动动手1 自己的学习过程

[复制链接]
发表于 2019-12-26 17:24:28 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 WilsonWolf2333 于 2019-12-27 14:33 编辑

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

自己的作答----
解:
方法一
list1 = [1,2,3,4,5,'a','b','c',6,7]         #设置一个同时带有数字和字符串的列表
member = ''                                 #目的是使用append语句不报错,把每个元素先转换成字符串
list2 = []                                 #设置空列表,目的是为了把所有数字内容放进这个新列表里
total = 0                                 #为了循环求和,设置这个和的初始值
for each in list1:                         #对于列表中的每个元素,开始循环
    member = str(each)                         #把列表中的每个元素都变成字符串格式
    if member.isdecimal():                 #当转换成字符串的元素只包含十进制数字
        list2.append(member)                 #把这个元素添加进list2列表中
        total = total + int(member)         #开始累加求和
print(total)                                 #最终打印出列表中所有数字的和

上述代码的缺点:
1.如果将第0个元素从1改成1.5,那么求和时不会加上1.5的值,也就是说求和时不会包含浮点型元素,败笔
2.如果将5个元素从'a'改成'1',那么求和时仍然会加入这个'1'的值,也就是说求和时会包含可以转化成整型的字符串的内容的数值,和题目要求不符合,败笔

正在尝试修改代码然后再看答案。

------------------
更新于2019年12月27日14:32:00:
核对答案后,发现方法一新增一个列表的这个思路多余
使用判断整型、浮点型条件,和 total += each就可以解决。

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

 楼主| 发表于 2019-12-26 17:38:34 | 显示全部楼层
本帖最后由 WilsonWolf2333 于 2019-12-27 14:36 编辑

方法二
list1 = [1,2,3,4,5,'a','b','c',6,7]         #设置一个同时带有数字和字符串的列表
member = ''                                 #目的是使用append语句不报错,把每个元素先转换成字符串
list2 = []                                 #设置空列表,目的是为了把所有数字内容放进这个新列表里
total = 0                                 #为了循环求和,设置这个和的初始值
for each in list1:                         #对于列表中的每个元素,开始循环
    if (type(each) == int) or (type(each) == float):    #如果某个元素为整型或者浮点型数据
        total = total + float(each) #把这个数据的值加入到总和中,选择float是因为如果是整型也可以用float不影响求和的数值大小
print(total)

上述代码的缺点:
求和结果为浮点数,而sum这个BIF,如果所有元素都为整型,那么结果为整型

---------------------
更新于2019年12月27日14:33:35:
方法二也是不需要list2空列表,
而且,把倒数第二行语句去掉float就可以,就是改成 total = total + each,
原因我理解是整型或者浮点型元素可以直接用+进行计算。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-26 18:02:53 | 显示全部楼层
答案:
def sum(x):
    result = 0
    
    for each in x:
        if (type(each) == int) or (type(each) == float):
            result += each
        else:
            continue

    return result

print(sum([1, 2.1, 2.3, 'a', '1', True]))

正在思考为什么要加入else: continue,是为了节省内存吗?如果不加入貌似也可以啊..
明天再继续思考这个问题,还有核对自己的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-26 20:42:15 | 显示全部楼层

这里的 else: continue 没有任何作用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-26 23:17:35 | 显示全部楼层
本帖最后由 hrp 于 2019-12-26 23:21 编辑

def sum(x):
    result = 0
    
    for each in x:
        if (type(each) == int) or (type(each) == float):
            result += each
        else:
            continue
        print('hahaha') # 这里加一句用以体现 continue 的作用

    return result

print(sum([1, 2.1, 2.3, 'a', '1', True]))

当 continue 后面 与 if else 同级还有代码的时候,continue 就有用了,如果通过 if 条件通过,执行完 if 分支,print('hahaha') 就会被执行,如果条件没通过,执行了 else 分支,continue 会直接结束本轮循环直接开始下一轮循环,后面的 print('hahaha') 就不会被执行。
对于不需要人为结束本轮循环的,continue 就不需要有。

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

 楼主| 发表于 2019-12-27 08:08:21 | 显示全部楼层
zltzlt 发表于 2019-12-26 20:42
这里的 else: continue 没有任何作用。

好的 谢谢!
非常感谢给出的评分,第一次被人评分haha...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-27 08:28:25 | 显示全部楼层
hrp 发表于 2019-12-26 23:17
当 continue 后面 与 if else 同级还有代码的时候,continue 就有用了,如果通过 if 条件通过,执 ...

明白了,非常感谢详细讲解和提供的实例!
我在网上也搜索了一下continue的用法,加深了印象:“continue 语句用来告诉Python跳过当前循环的剩余语句,然后继续进行下一轮循环”。

想给你最佳答案来给你增加鱼币,但是这个版块下好像没有“最佳答案”的选项,可惜了。。
如果有什么办法可以利用这个帖子给你增加鱼币,请再留言告诉我吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-27 14:28:48 | 显示全部楼层
对答案的代码想到了一个疑问,就是如果答案中的def函数x中包含子列表,而且子列表中包含整型元素1怎么办。自己通过修改代码、加注释和添加if 、print的方法解答了这个疑问。
结论是:即使答案代码中x含有子列表,而且子列表中包含整型元素,那么也这个整型元素也不会被用来计算求和。
分析的代码如下:
list1 = [1,2,3,4,'a','b','c','1',True,[1,'1']]
print('测试的列表为',list1)
def sum(x):
    result = 0      #求和初始值
    time = 0        #统计for循环进行的次数,来确认for循环是否历遍子列表的元素
    for each in x:  #通过for循环历遍列表中的所有元素
        time += 1
        if (type(each) == int) or (type(each) == float):    #如果元素的数据类型为整型或者浮点型
            print('大列表中可以用来求和的元素有:', each)  #每次if条件成立,打印出符合条件的元素
            result += each      #求和
        if time == 10: #目的是看循环到子列表时的具体信息,即第10次循环时
            print('当前for循环中的each为:', each) #打印出第10次循环时, each是什么
            print('此时each的类型为:', type(each))  #打印出第10次循环时, each的类型是什么
    print('for循环进行的总次数为:', time)    #通过次数来确定each是否历遍了子列表的两个元素,结果为否。从上两行代码中也能分辨出。
    return result
print(sum([1,2,3,4,'a','b','c','1',True,[1,'1']]))

IDLE中运行的结果为:
测试的列表为 [1, 2, 3, 4, 'a', 'b', 'c', '1', True, [1, '1']]
大列表中可以用来求和的元素有: 1
大列表中可以用来求和的元素有: 2
大列表中可以用来求和的元素有: 3
大列表中可以用来求和的元素有: 4
当前for循环中的each为: [1, '1']
此时each的类型为: <class 'list'>
for循环进行的总次数为: 10
10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-27 14:37:25 | 显示全部楼层
这一课的课后习题就算过去啦,谢谢版主把这个帖子留下。继续看下一个视频喽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-28 23:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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