鱼C论坛

 找回密码
 立即注册
查看: 800|回复: 4

[已解决]while循环的一个小问题。

[复制链接]
发表于 2019-1-9 23:32:13 | 显示全部楼层 |阅读模式

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

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

x
为了统计一段话中,所有关键字出现的位置,我发现别人打出了这样的代码:
line='这是一行字,一行用来测试的字,共有3个行字'
key='行'
storage=[]
a=line.find(key)
while a != -1:
        storage.append(a+1)
        a=line.find(key,a+1)
        print(a)
在这个while循环中,只有a==1时,才会停止。
我的困惑:a是在递增的啊,什么时候才会a==-1呢?
所以我一直以为这是不能达到的条件。
于是我
while 1:
        print(a)了一下,
发现:
7
19
-1
3
7
19
-1
3
7
19
-1
请问各位大佬,-1是怎么出现的,其中是什么原理?
如果有资料,希望给指个路。
最佳答案
2019-1-10 11:20:50
本帖最后由 sunrise085 于 2019-1-10 11:25 编辑

先解答你的疑问,然后在说一下你的这段程序的问题。

要弄明白这段程序的意思,首先理解find()函数,find()函数返回值是key在字符串中的位置,若没有找到,则返回-1。函数的第二个参数是查询的起点位置,默认为0 。所以在while循环外的时候find函数没写第二个参数,吃为了从字符串的第一个字符开始查询。在while循环中,find函数从查找到key字符的下一个字符开始继续查询,查询一次输出一个位置数a,查到最后肯定会有一次find返回值为-1,那时while循环结束。

再来说说你的程序的问题,这段程序的意思应该是照吃key在字符串中的各个位置,而你的这段程序输出结果是7,19,-1 。正常输出结果应该是3,7,19 。程序的问题是第一次查询的时候没有输出位置近开始了第二次查询,而且最后查询不到的时候仍然进行了位置输出,所以最后输出了一个-1

我帮你改了一下程序,实际上就懂了一下print的位置。
  1. line='这是一行字,一行用来测试的字,共有3个行字'
  2. key='行'
  3. storage=[]
  4. a=line.find(key)
  5. while a != -1:
  6.     print(a)
  7.     storage.append(a+1)
  8.     a=line.find(key,a+1)
复制代码


修改后的程序中,在while循环之前先查询一次,若是查到关键字,则会进入循环,先输出第一次查询的结果(3),之后进行第二次查询,每次循环都是先输出上一次查询的结果,然后在进行查询,这样的好处就是最后一次查询无果的时候不会进行输出
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-1-10 08:28:58 | 显示全部楼层
本帖最后由 heidern0612 于 2019-1-10 08:39 编辑

a为啥不能等于-1呢?

搜索完毕了,查找不到的时候find不就返回-1么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-10 08:35:49 | 显示全部楼层
本帖最后由 heidern0612 于 2019-1-10 08:38 编辑

举例下你的程序吧。

  1. line='这是一行字,一行用来测试的字,共有3个行字'
  2. key='行'
  3. storage=[]
  4. a=line.find(key)
  5. while a != -1:
  6.         storage.append(a+1)
  7.         a=line.find(key,a+1)
  8.         print(a)
复制代码


循环体外,a=3(第一个“行”字下标为3,字符串总体长度21.

1、第一次循环 a =line.find("行",4),也就是说从第5个下标开始往后查找"行"字,在第8个下标找到。; a = 7

2、第二次循环 a =line.find("行",8),也就是说从第9个下标开始往后查找"行"字,在第20个下标找到。; a = 19

3、第三次循环 a =line.find("行",20),也就是说从第20个下标开始往后查找"行"字,找到第21个字符结束,没找到,所以返回-1,while循环结束。

这也就是程序print(a)的结果,分别为7,19, -1。


你要是while 1的话,程序就永远不会退出了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-10 08:46:19 | 显示全部楼层
a获取的是find的返回值,当find函数找不到你的key的时候就返回-1,找到了就返回对应的index
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-10 11:20:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2019-1-10 11:25 编辑

先解答你的疑问,然后在说一下你的这段程序的问题。

要弄明白这段程序的意思,首先理解find()函数,find()函数返回值是key在字符串中的位置,若没有找到,则返回-1。函数的第二个参数是查询的起点位置,默认为0 。所以在while循环外的时候find函数没写第二个参数,吃为了从字符串的第一个字符开始查询。在while循环中,find函数从查找到key字符的下一个字符开始继续查询,查询一次输出一个位置数a,查到最后肯定会有一次find返回值为-1,那时while循环结束。

再来说说你的程序的问题,这段程序的意思应该是照吃key在字符串中的各个位置,而你的这段程序输出结果是7,19,-1 。正常输出结果应该是3,7,19 。程序的问题是第一次查询的时候没有输出位置近开始了第二次查询,而且最后查询不到的时候仍然进行了位置输出,所以最后输出了一个-1

我帮你改了一下程序,实际上就懂了一下print的位置。
  1. line='这是一行字,一行用来测试的字,共有3个行字'
  2. key='行'
  3. storage=[]
  4. a=line.find(key)
  5. while a != -1:
  6.     print(a)
  7.     storage.append(a+1)
  8.     a=line.find(key,a+1)
复制代码


修改后的程序中,在while循环之前先查询一次,若是查到关键字,则会进入循环,先输出第一次查询的结果(3),之后进行第二次查询,每次循环都是先输出上一次查询的结果,然后在进行查询,这样的好处就是最后一次查询无果的时候不会进行输出

评分

参与人数 1鱼币 +5 收起 理由
康小泡 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-11 06:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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