鱼C论坛

 找回密码
 立即注册
查看: 2810|回复: 9

[已解决]课后作业第18讲

[复制链接]
发表于 2021-2-23 15:35:02 | 显示全部楼层 |阅读模式

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

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

x
编写一个函数 findstr(),该函数统计一个长度为 2 的子字符串在另一个字符串中出现的次数。例如:假定输入的字符串为“You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,子字符串为“im”,函数执行后打印“子字母串在目标字符串中共出现 3 次”。
def findStr(desStr, subStr):
    count = 0
    length = len(desStr)
    if subStr not in desStr:
        print('在目标字符串中未找到字符串!')
    else:
        for each1 in range(length-1):      
            if desStr[each1] == subStr[0]:
                if desStr[each1+1] == subStr[1]:
                    count += 1
                    
        print('子字符串在目标字符串中共出现 %d 次' % count)

desStr = input('请输入目标字符串:')
subStr = input('请输入子字符串(两个字符):')
findStr(desStr, subStr)


for each1 in range(length-1):
请问这个length-1怎么理解,麻烦大佬指教
最佳答案
2021-2-23 15:49:06
  1. def findStr(desStr, subStr):     
  2.     count = 0
  3.     length = len(desStr)
  4.     if subStr not in desStr:
  5.         print('在目标字符串中未找到字符串!')
  6.     else: #这里的条件是字串在目标字符串里
  7.         for each1 in range(length-1): #length为目标字符串的长度,减一刚好是目标串的索引范围
  8.             #而for...in range(n)的语法中,...只是一个循环变量名字而已,叫i,j,k,each,什么都可以,它的取值是range函数规定的,0到n-1;
  9.             # each1就是下面要用到的字符串索引值     
  10.             if desStr[each1] == subStr[0]:  #这里只不过是比较目标串的各个字符有没有和字串第一个字符相同的,如果相同,进入下一层判断
  11.                 if desStr[each1+1] == subStr[1]: #与字串第一个字符匹配后,移到后一位字符进行判断,索引值加一就是后移一位,没什么难理解的
  12.                     count += 1 #前两个条件都满足了,计数出现次数加一
  13.                     
  14.         print('子字符串在目标字符串中共出现 %d 次' % count)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-2-23 15:38:15 | 显示全部楼层
我试了下直接写for each1 in range(length):其结果是一样的,就有点搞不清楚什么意思了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 15:45:03 | 显示全部楼层
本帖最后由 jackz007 于 2021-2-23 15:47 编辑

        for each1 in range(length-1):      
            if desStr[each1] == subStr[0]:
                if desStr[each1+1] == subStr[1]:
        红字呼应蓝字,如果不这样约束 each1,那么,当 each1 = length-1 的时候,desStr[each1+1] = desStr[length]  就会导致下标越界。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 15:49:06 | 显示全部楼层    本楼为最佳答案   
  1. def findStr(desStr, subStr):     
  2.     count = 0
  3.     length = len(desStr)
  4.     if subStr not in desStr:
  5.         print('在目标字符串中未找到字符串!')
  6.     else: #这里的条件是字串在目标字符串里
  7.         for each1 in range(length-1): #length为目标字符串的长度,减一刚好是目标串的索引范围
  8.             #而for...in range(n)的语法中,...只是一个循环变量名字而已,叫i,j,k,each,什么都可以,它的取值是range函数规定的,0到n-1;
  9.             # each1就是下面要用到的字符串索引值     
  10.             if desStr[each1] == subStr[0]:  #这里只不过是比较目标串的各个字符有没有和字串第一个字符相同的,如果相同,进入下一层判断
  11.                 if desStr[each1+1] == subStr[1]: #与字串第一个字符匹配后,移到后一位字符进行判断,索引值加一就是后移一位,没什么难理解的
  12.                     count += 1 #前两个条件都满足了,计数出现次数加一
  13.                     
  14.         print('子字符串在目标字符串中共出现 %d 次' % count)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 15:52:53 | 显示全部楼层
jackz007 发表于 2021-2-23 15:45
for each1 in range(length-1):      
            if desStr[each1] == subStr[0]:
            ...

了解了,是我考虑不周了,多谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-23 16:11:26 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-23 16:16:46 | 显示全部楼层

问题解决了就把最佳答案设置了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-9 15:41:08 | 显示全部楼层
昨非 发表于 2021-2-23 16:16
问题解决了就把最佳答案设置了吧

大佬。length不应该是整个字符串的长度吗??为啥是目标字符串的长度,还有减一刚好是目标串的索引范围是什么意思,能麻烦大佬解答下吗,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-9 15:44:57 | 显示全部楼层
孤妓与酒 发表于 2021-3-9 15:41
大佬。length不应该是整个字符串的长度吗??为啥是目标字符串的长度,还有减一刚好是目标串的索引范围是 ...

索引值不是从零开始的吗
长度减一不就是最后一个元素的索引
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-9 15:52:48 | 显示全部楼层
昨非 发表于 2021-3-9 15:44
索引值不是从零开始的吗
长度减一不就是最后一个元素的索引

是哦,哈哈,没转过来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 04:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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