鱼C论坛

 找回密码
 立即注册
查看: 3013|回复: 12

[学习笔记] P19 018函数:灵活即强大 课后题 动动手2.编写函数findstr()统计子字符串出现的次数

[复制链接]
发表于 2020-1-16 15:47:57 | 显示全部楼层 |阅读模式

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

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

x
题目:
编写一个函数 findstr(),该函数统计一个长度为 2 的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为“You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,子字符串为“im”,函数执行后打印“子字母串在目标字符串中共出现 3 次”。


我自己写的代码:
str1 = input('请输入目标字符串:')
tar = input('请输入需要查找的子字符串(两个字符):')
def findstr():
    return str1.count(tar)   # count(sub[, start[, end]]) 返回 sub 在字符串里边出现的次数,start 和 end 参数表示范围,可选。

print('子字符串再目标字符串中共出现', findstr(), '次')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-1-16 15:49:19 | 显示全部楼层
如下结果证明上述代码有bug:
请输入目标字符串:aaaaa
请输入需要查找的子字符串(两个字符):aa
子字符串再目标字符串中共出现 2 次

从标准答案的严格角度看,aa实际出现了4次。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-16 15:52:37 | 显示全部楼层
直接在IDLE交互界面使用count方法,发现结果也是2次。
>>> str1 = 'aaaaa'
>>> tar = 'aa'
>>> str1.count(tar)
2
>>>
我个人的理解是count方法,对于'aaaaa'这样重复字符的统计不够严格。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-16 16:18:20 | 显示全部楼层
本帖最后由 WilsonWolf2333 于 2020-1-16 16:19 编辑

标准答案 和 我自己的思考过程(注释部分)如下。注释里?????是当前存在的疑问。
下方的函数文档是我自己加的,哈哈哈。
def findStr(desStr, subStr):
    '逐位核对原始字符串来从严格意义上确认子字符串出现的次数,比count方法更严格2333'
    count = 0
    length = len(desStr)
    if subStr not in desStr:
        print('在目标字符串中未找到字符串!')
    else:
        for each1 in range(length-1):      #例如有5个字符的字符串'aaaaa',那么检查第[0],[1],[2],[3]这四个字符
            if desStr[each1] == subStr[0]: #对于单层循环,例如当each1 = 0时,比较原字符串第[0]位和子字符串第[0]位
                if desStr[each1+1] == subStr[1]: #相当于and的关系,这层循环中,比较原字符串下一位和子字符串第[1]位
                    count += 1  #同时符合上述两个if条件的话,计数器加1
                    
        print('子字符串在目标字符串中共出现 %d 次' % count)  #复习到%d的作用是格式化整数,我觉得这样写的目的是比('出现',count,'次')代码更简洁

desStr = input('请输入目标字符串:') #????? 我觉得这行代码没有缩进,就不属于函数体了吧,为啥调用函数还是会打印这行代码
subStr = input('请输入子字符串(两个字符):')
findStr(desStr, subStr)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-16 16:27:18 | 显示全部楼层
WilsonWolf2333 发表于 2020-1-16 16:18
标准答案 和 我自己的思考过程(注释部分)如下。注释里?????是当前存在的疑问。
下方的函数文档是我自己 ...

我觉得这个疑问解决了。确认代码中第15、16行无缩进的内容不属于函数体。
例如去掉第17行代码,运行,仍然会打印“请输入目标字符串”,但是不会打印结果。
另外也测试了打印出函数属性(访问函数文档字符串)的两个方法, IDLE交互界面分析的结果如下:
请输入目标字符串:ab
请输入子字符串(两个字符):ab
>>>
>>> findStr(desStr, subStr)
子字符串在目标字符串中共出现 1 次
>>> findStr.__doc__
'逐位核对原始字符串来从严格意义上确认子字符串出现的次数,比count方法更严格2333'
>>> help(findStr)
Help on function findStr in module __main__:

findStr(desStr, subStr)
    逐位核对原始字符串来从严格意义上确认子字符串出现的次数,比count方法更严格2333

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

使用道具 举报

 楼主| 发表于 2020-1-16 16:52:57 | 显示全部楼层
尝试自己重新按答案思路敲一遍代码,发现自己对格式化掌握得不够扎实。
遇到的问题是第13行代码我自己敲成了  print('子字符串在目标字符串中共出现 %d 次',  % count)
多了一个逗号,就一直报错 invalid syntax。

我觉得重敲代码的方法挺好用的,有时候看代码觉得没问题,自己敲就是另一回事了,往往能暴露出自己薄弱的环节。

我自己现阶段正在应用如下笨方法,这个方法我给别人的回帖中也提到过。 以后学习笔记我用这个作为大纲吧,看起来能更有条理些。
"1.先不看答案自己尝试写代码 加注释
2.如果实在想不出来,看答案。给答案代码尝试自己加注释
3.完全理解代码后,重新尝试默写敲一遍代码(不是背)
4.回头看自己的代码当时思路卡在哪里了,或者自己的思路有什么问题
好处是能对答案代码加深理解,坏处是太占用时间。"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-16 16:54:54 | 显示全部楼层
本帖最后由 WilsonWolf2333 于 2020-1-17 10:19 编辑

那么应用上述大纲,
4.回看自己的代码--
虽然自己复习找到了count的方法,但是未严格考虑到'aaaaa'这种代码的情况。

这一道题的学习笔记做完了,这道题就算过去啦哈哈。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-28 01:27:33 | 显示全部楼层
学习方法很赞,的确很费时间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-2 00:28:18 | 显示全部楼层
我做了加强版不限子串的长度,没有那个aaaa和aa出现两次的bug
def findstr(str1,str2):
    len1 = len(str1)
    len2 = len(str2)
    times = 0
    for i in range(0,len2-len1+1):
        flag = 1
        for j in range(0,len1):
            if str1[j] != str2[i+j]:
                flag = 0
                break
            else:
                continue
        if flag:
            times += 1
    return times

while 1:
    str1 = input('请输入子字符串:')
    str2 = input('请输入目标字符串:')
    if len(str1)>len(str2):
        print('输入错误!子字符串的长度不能大于目标字符串!')
    else:
        print('子字符串在目标字符串中一共出现了:',findstr(str1,str2),'次')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 12:58:47 | 显示全部楼层
shawnz 发表于 2020-2-28 01:27
学习方法很赞,的确很费时间

谢谢回复。可能有更快的学习方法,比如先不去深究这些细枝末节,先笼统过一遍基础知识再回头慢慢看。
不知道哪种方法更适合我,我先坚持下来再说吧。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-19 17:40:54 | 显示全部楼层
233倔强不秃 发表于 2020-3-2 00:28
我做了加强版不限子串的长度,没有那个aaaa和aa出现两次的bug

谢谢!真棒!看你运用break contrinue ‘for range’都这么熟练。
说实话我大概2个月没接触Python了都有些生疏了,没别的办法,像我这样的笨鸟要么花更多的时间,要么放弃,就这两条路..
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-19 21:04:23 | 显示全部楼层
WilsonWolf2333 发表于 2020-3-19 17:40
谢谢!真棒!看你运用break contrinue ‘for range’都这么熟练。
说实话我大概2个月没接触Python了都有 ...

学习任何东西都是坚持最重要,加油吧,不要放弃!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-20 17:12:22 | 显示全部楼层
233倔强不秃 发表于 2020-3-19 21:04
学习任何东西都是坚持最重要,加油吧,不要放弃!

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 03:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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