鱼C论坛

 找回密码
 立即注册
查看: 1752|回复: 6

[已解决]《零基础入门python》第18讲动动手2

[复制链接]
发表于 2018-4-3 19:54:33 | 显示全部楼层 |阅读模式
4鱼币

  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)
复制代码


请问各位大佬这个代码从这里开始是什么意思呢?
  1. for each1 in range(length-1):
复制代码


最佳答案
2018-4-3 19:54:34
本帖最后由 a690089735 于 2018-4-3 21:21 编辑

desStr = '0123456' => 假如desStr = '0123456'
length = len(desStr) => length = 7,因为desStr有7个成员
for each1 in range(length-1): => 左侧相当于range(7-1),然后each =0到6,用for迭代,每次都执行一次他下面的代码
if desStr[each1] == subStr[0]: => 如果desStr中的第each个字符和subStr的第0个(首个,第一个)字符一样,那么向下判断
if desStr[each1+1] == subStr[1]: => 这里each+1,就相当于是下一个字符了,如果这个字符和subStr的第1个(第二个)字符一样,向下行
count += 1 => 如果两个判断都通过了,就是subStr在desStr中出现了,那么计数加1



建议写成
if desStr[each1:each1+2] == subStr:
        count += 1
更容易理解

最佳答案

查看完整内容

desStr = '0123456' => 假如desStr = '0123456' length = len(desStr) => length = 7,因为desStr有7个成员 for each1 in range(length-1): => 左侧相当于range(7-1),然后each =0到6,用for迭代,每次都执行一次他下面的代码 if desStr[each1] == subStr[0]: => 如果desStr中的第each个字符和subStr的第0个(首个,第一个)字符一样,那么向下判断 if desStr[each1+1] == subStr[1]: => 这里each+1,就相当于是下一个字符了,如果这个 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-3 19:54:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 a690089735 于 2018-4-3 21:21 编辑

desStr = '0123456' => 假如desStr = '0123456'
length = len(desStr) => length = 7,因为desStr有7个成员
for each1 in range(length-1): => 左侧相当于range(7-1),然后each =0到6,用for迭代,每次都执行一次他下面的代码
if desStr[each1] == subStr[0]: => 如果desStr中的第each个字符和subStr的第0个(首个,第一个)字符一样,那么向下判断
if desStr[each1+1] == subStr[1]: => 这里each+1,就相当于是下一个字符了,如果这个字符和subStr的第1个(第二个)字符一样,向下行
count += 1 => 如果两个判断都通过了,就是subStr在desStr中出现了,那么计数加1



建议写成
if desStr[each1:each1+2] == subStr:
        count += 1
更容易理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-4-3 19:57:16 | 显示全部楼层
for each1 in range(length-1):
for循环头,each1指向0到查找字符串长度-2

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +1 收起 理由
drwyatt + 2 + 2 + 1

查看全部评分

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

使用道具 举报

发表于 2018-4-7 14:04:49 | 显示全部楼层
range(7-1)应该是[0,1,2,3,4,5],不包含6的呀,那不是应该range(7)吗,为什么要减1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-17 17:18:50 | 显示全部楼层
一生暖暖 发表于 2018-4-7 14:04
range(7-1)应该是[0,1,2,3,4,5],不包含6的呀,那不是应该range(7)吗,为什么要减1

因为for each1 in range(length-1): 中的each1取值范围是字符串的索引的范围,length是整个字符串的长度它是从1开始计数的,而索引是从0开始的,所以比整个字符串的长度小1。比如‘0123’,length=4,但是他的索引是0~3,所以each1的取值范围是range(length-1) 即 0~length-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-17 17:23:08 | 显示全部楼层
G.North 发表于 2022-3-17 17:18
因为for each1 in range(length-1): 中的each1取值范围是字符串的索引的范围,length是整个字符串的长度 ...

上面回复错了,不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-17 17:37:55 | 显示全部楼层
G.North 发表于 2022-3-17 17:23
上面回复错了,不好意思

因为each1 是subStr的第一个元素的索引,所以说each1的范围最多只能到desStr倒数第二个,也就是range(length-1)的这个范围,然后就经过if desStr[each1] == subStr[0]:判断,判断each1和subStr[0]:是不是一致的,一致就进入下一个判断if desStr[each1+1] == subStr[1]: ,此时each+1,就代表着each1的下一位字符串,如果each1的取值范围是range(length)即全字符串的长度,那这里的each+1就会报错,因为当each1取到字符串的最后一个元素时,each+1就超过了索引范围了,所以each1的范围是range(length-1),即取不到最后一个字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-18 10:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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