鱼C论坛

 找回密码
 立即注册
查看: 1524|回复: 10

[已解决]18讲最后一题求解

[复制链接]
发表于 2021-4-17 10:58:47 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Ginkwey 于 2021-4-17 11:01 编辑

请问一下各位鱼油

第18讲最后一题的这段代码

else里说的是什么意思?

看完代码感觉有点抽象,看不懂。

能帮忙解释或者注释下吗?


  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):      
  8.             if desStr[each1] == subStr[0]:
  9.                 if desStr[each1+1] == subStr[1]:
  10.                     count += 1
  11.                     
  12.         print('子字符串在目标字符串中共出现 %d 次' % count)

  13. desStr = input('请输入目标字符串:')
  14. subStr = input('请输入子字符串(两个字符):')
  15. findStr(desStr, subStr)
复制代码



还有问一下,怎么悬赏。。。
最佳答案
2021-4-17 11:36:33
  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):      #遍历字符串desStr的索引值each1,一直到倒数第二位(length-1)
  8.             if desStr[each1] == subStr[0]:  #判断desStr中第each1个字符与subStr的0个字符相同
  9.                 if desStr[each1+1] == subStr[1]: #如果上面的判断成立,再判断desStr中第each1+1个字符与subStr的1个字符相同
  10.                     count += 1  #统计次数+1次
  11.                      
  12.         print('子字符串在目标字符串中共出现 %d 次' % count)

  13. desStr = input('请输入目标字符串:')
  14. subStr = input('请输入子字符串(两个字符):')
  15. findStr(desStr, subStr)
复制代码


else中的整体逻辑是

遍历在字符串desStr的索引值-1

    判断字符串desStr索引位置对应的元素是否与subStr的第0个元素相同

        再判断desStr索引位置+1对应的元素是否与subStr的第1个元素相同

            如果以上两个条件都成立,证明目标字符串出现过,统计次数count就+1次

一直遍历到最后,目标字符串出现了几次,统计次数count就加几次

为什么要遍历在字符串desStr的索引值-1而非索引值本身呢

是因为如果desStr最后一个字符等于subStr[0]时,避免desStr的索引超出索引范围
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-17 11:36:33 | 显示全部楼层    本楼为最佳答案   
  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):      #遍历字符串desStr的索引值each1,一直到倒数第二位(length-1)
  8.             if desStr[each1] == subStr[0]:  #判断desStr中第each1个字符与subStr的0个字符相同
  9.                 if desStr[each1+1] == subStr[1]: #如果上面的判断成立,再判断desStr中第each1+1个字符与subStr的1个字符相同
  10.                     count += 1  #统计次数+1次
  11.                      
  12.         print('子字符串在目标字符串中共出现 %d 次' % count)

  13. desStr = input('请输入目标字符串:')
  14. subStr = input('请输入子字符串(两个字符):')
  15. findStr(desStr, subStr)
复制代码


else中的整体逻辑是

遍历在字符串desStr的索引值-1

    判断字符串desStr索引位置对应的元素是否与subStr的第0个元素相同

        再判断desStr索引位置+1对应的元素是否与subStr的第1个元素相同

            如果以上两个条件都成立,证明目标字符串出现过,统计次数count就+1次

一直遍历到最后,目标字符串出现了几次,统计次数count就加几次

为什么要遍历在字符串desStr的索引值-1而非索引值本身呢

是因为如果desStr最后一个字符等于subStr[0]时,避免desStr的索引超出索引范围
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-4-17 14:56:29 | 显示全部楼层
逃兵 发表于 2021-4-17 11:36
else中的整体逻辑是

遍历在字符串desStr的索引值-1

大神你好!
desStr[each1]这个索引为啥是each1,可以替换成其他的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-17 14:59:22 | 显示全部楼层
逃兵 发表于 2021-4-17 11:36
else中的整体逻辑是

遍历在字符串desStr的索引值-1

还是这个each1,是和each一样用法吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-17 15:13:55 | 显示全部楼层
这里each1只是个简单的变量名而已,可以替换为任何角色
在for each1 in range(length-1):这语句中定义的each1
我们可以修改成自己喜欢的变量名

改成i
  1. def findStr(desStr, subStr):
  2.     count = 0
  3.     length = len(desStr)
  4.     if subStr not in desStr:
  5.         print('在目标字符串中未找到字符串!')
  6.     else:
  7.         for i in range(length-1):      
  8.             if desStr[i] == subStr[0]:
  9.                 if desStr[i+1] == subStr[1]:
  10.                     count += 1
  11.                     
  12.         print('子字符串在目标字符串中共出现 %d 次' % count)

  13. desStr = input('请输入目标字符串:')
  14. subStr = input('请输入子字符串(两个字符):')
  15. findStr(desStr, subStr)
复制代码


改成each

  1. def findStr(desStr, subStr):
  2.     count = 0
  3.     length = len(desStr)
  4.     if subStr not in desStr:
  5.         print('在目标字符串中未找到字符串!')
  6.     else:
  7.         for each in range(length-1):      
  8.             if desStr[each] == subStr[0]:
  9.                 if desStr[each+1] == subStr[1]:
  10.                     count += 1
  11.                     
  12.         print('子字符串在目标字符串中共出现 %d 次' % count)

  13. desStr = input('请输入目标字符串:')
  14. subStr = input('请输入子字符串(两个字符):')
  15. findStr(desStr, subStr)
复制代码


需要注意的是,在遍历的过程中,不要造成变量名的污染

比如下面这个实例
我们先给each定义为字符串'逃兵'
之后又将each作为遍历的变量名,造成变量名污染
再次打印each时,已经变为9了(因为range(10)最后一位为9,此时的each就变为9了)

  1. each = '逃兵'

  2. for each in range(10):
  3.     print('each遍历')

  4. print(each)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-17 15:24:55 | 显示全部楼层
逃兵 发表于 2021-4-17 15:13
这里each1只是个简单的变量名而已,可以替换为任何角色
在for each1 in range(length-1):这语句中定义的ea ...

感谢解答!
我想问一下第一段代码 each 改成 i 的话
不就和上面for i  in range(length-1)重复了吗?
这样不会影响吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-17 15:37:15 | 显示全部楼层
Ginkwey 发表于 2021-4-17 15:24
感谢解答!
我想问一下第一段代码 each 改成 i 的话
不就和上面for i  in range(length-1)重复了吗?

贴一下each和i重复的代码,我没有看到有出现重复的情况
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-17 15:47:10 | 显示全部楼层
逃兵 发表于 2021-4-17 15:37
贴一下each和i重复的代码,我没有看到有出现重复的情况
  1. def findStr(desStr, subStr):
  2.     count = 0
  3.     length = len(desStr)
  4.     if subStr not in desStr:
  5.         print('在目标字符串中未找到字符串!')
  6.     else:
  7.         for i in range(length-1):#这个i和下面的i一样吗?      
  8.             if desStr[i] == subStr[0]:
  9.                 if desStr[i+1] == subStr[1]:
  10.                     count += 1
  11.                     
  12.         print('子字符串在目标字符串中共出现 %d 次' % count)

  13. desStr = input('请输入目标字符串:')
  14. subStr = input('请输入子字符串(两个字符):')
  15. findStr(desStr, subStr)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-17 15:53:33 | 显示全部楼层
逃兵 发表于 2021-4-17 15:37
贴一下each和i重复的代码,我没有看到有出现重复的情况

else里面 for 我用“#”写的标注
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-17 16:24:40 | 显示全部楼层
Ginkwey 发表于 2021-4-17 15:53
else里面 for 我用“#”写的标注

下面的i就是调用的上面的那个i
第一次i=0
desStr[0]和desStr[1]
第二次i=1
desStr[1]和desStr[2]
...
第n次i=n-1
desStr[n-1]和desStr[n]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-17 16:34:21 | 显示全部楼层
逃兵 发表于 2021-4-17 16:24
下面的i就是调用的上面的那个i
第一次i=0
desStr[0]和desStr[1]

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 10:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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