鱼C论坛

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

麻烦厉害的哥哥帮忙看下for if语句~

[复制链接]
发表于 2019-1-28 00:01:49 | 显示全部楼层 |阅读模式

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

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

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():
    print('请输入目标字符串:',end='')
    temp = input()
    print('请输入子字符串(两个字符):',end='')
    comp = input()
    count = 0
    i = 0
    for i in range(len(temp)):
        if temp[i] == comp[0] and temp[i+1] == comp[1]:
            count += 1
            i += 1
        else:
            i += 1

    count = int(count)
    print('子字符串在目标字符串中总共出现 %d 次'%count)
findstr()

我的想法是红色加粗部分可以去掉,因为 for语句已经实现i的循环,可是实际去掉后会出现超出索引的报错,为什么呢!!???
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-1-28 02:31:10 | 显示全部楼层
“for i in range(len(temp)):”这句改成
“for i in range(len(temp) - 1):”
否则当 i 等于 temp 字符串的最后一个索引值时, temp[i + 1] 就会超出索引范围 (虽然不是所有的情况都会报错)
还有“if temp == comp[0]”应该改成
“if temp[i] == comp[0]”
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-28 03:08:41 | 显示全部楼层
想想你for到末尾  temp[i+1]   这里出现什么情况?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-28 09:43:47 | 显示全部楼层
  1. temp == comp[0] and temp[i+1] == comp[1]
复制代码

假设i是从0到10,当i=10时,会产生temp[11],就超了朋友
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-1-28 10:36:22 | 显示全部楼层
TaR丶Eterno 发表于 2019-1-28 02:31
“for i in range(len(temp)):”这句改成
“for i in range(len(temp) - 1):”
否则当 i 等于 temp 字符 ...

range是左闭右开的呀 那个是笔误sorry。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-30 10:27:05 From FishC Mobile | 显示全部楼层
leonrampage 发表于 2019-1-28 10:36
range是左闭右开的呀 那个是笔误sorry。。。

但是长度为n的字符串最后一个字符也是n-1啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-30 20:42:59 | 显示全部楼层
你给的例子不管有没有i+=1都不会报错
真正报错的原因是当最后一个字符串是i时你的 if temp == comp[0] and temp[i+1] == comp[1]:语句第一项是真但是当判断第二项时temp字符串中并没有i+1位字符串(你的例子里就是temp[100])所以就报错超出范围
所以如果你一定要按你这个思路写的话建议每次循环结束时判断剩余字符串长度是否为2 少于2时跳出循环就不会报错了。
  1.         if len(temp[i:])==2:
  2.             break
复制代码
用这个语句判定这一轮循环是最后一组循环接着就跳出循环。不用继续循环了免得报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-13 16:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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