WilsonWolf2333 发表于 2020-1-16 15:47:57

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

题目:
编写一个函数 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(), '次')

WilsonWolf2333 发表于 2020-1-16 15:49:19

如下结果证明上述代码有bug:
请输入目标字符串:aaaaa
请输入需要查找的子字符串(两个字符):aa
子字符串再目标字符串中共出现 2 次

从标准答案的严格角度看,aa实际出现了4次。

WilsonWolf2333 发表于 2020-1-16 15:52:37

直接在IDLE交互界面使用count方法,发现结果也是2次。
>>> str1 = 'aaaaa'
>>> tar = 'aa'
>>> str1.count(tar)
2
>>>
我个人的理解是count方法,对于'aaaaa'这样重复字符的统计不够严格。

WilsonWolf2333 发表于 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',那么检查第,,,这四个字符
            if desStr == subStr: #对于单层循环,例如当each1 = 0时,比较原字符串第位和子字符串第位
                if desStr == subStr: #相当于and的关系,这层循环中,比较原字符串下一位和子字符串第位
                  count += 1#同时符合上述两个if条件的话,计数器加1
                  
      print('子字符串在目标字符串中共出现 %d 次' % count)#复习到%d的作用是格式化整数,我觉得这样写的目的是比('出现',count,'次')代码更简洁

desStr = input('请输入目标字符串:') #????? 我觉得这行代码没有缩进,就不属于函数体了吧,为啥调用函数还是会打印这行代码
subStr = input('请输入子字符串(两个字符):')
findStr(desStr, subStr)

WilsonWolf2333 发表于 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

>>>

WilsonWolf2333 发表于 2020-1-16 16:52:57

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

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

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

WilsonWolf2333 发表于 2020-1-16 16:54:54

本帖最后由 WilsonWolf2333 于 2020-1-17 10:19 编辑

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

这一道题的学习笔记做完了,这道题就算过去啦哈哈。{:5_109:}

shawnz 发表于 2020-2-28 01:27:33

学习方法很赞,的确很费时间

233倔强不秃 发表于 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 != str2:
                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),'次')

WilsonWolf2333 发表于 2020-3-19 12:58:47

shawnz 发表于 2020-2-28 01:27
学习方法很赞,的确很费时间

谢谢回复。可能有更快的学习方法,比如先不去深究这些细枝末节,先笼统过一遍基础知识再回头慢慢看。
不知道哪种方法更适合我,我先坚持下来再说吧。。

WilsonWolf2333 发表于 2020-3-19 17:40:54

233倔强不秃 发表于 2020-3-2 00:28
我做了加强版不限子串的长度,没有那个aaaa和aa出现两次的bug

谢谢!真棒!看你运用break contrinue ‘for range’都这么熟练。
说实话我大概2个月没接触Python了都有些生疏了,没别的办法,像我这样的笨鸟要么花更多的时间,要么放弃,就这两条路..

233倔强不秃 发表于 2020-3-19 21:04:23

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

学习任何东西都是坚持最重要,加油吧,不要放弃!

WilsonWolf2333 发表于 2020-3-20 17:12:22

233倔强不秃 发表于 2020-3-19 21:04
学习任何东西都是坚持最重要,加油吧,不要放弃!

好的, 谢谢!
页: [1]
查看完整版本: P19 018函数:灵活即强大 课后题 动动手2.编写函数findstr()统计子字符串出现的次数