鱼C论坛

 找回密码
 立即注册
查看: 2835|回复: 25

[已解决]第020讲课后作业,似乎没有进入while循环

[复制链接]
发表于 2020-7-7 10:27:24 | 显示全部楼层 |阅读模式

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

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

x
题目是找字符串中的密码
    a) 每位密码为单个小写字母
    b) 每位密码的左右两边均有且只有三个大写字母
以下是我写的代码,注释是思路,不知道错在哪里,运行后没有输出

  1. str1 = '''ABSaDKSbRIHcRHGcdDIF'''

  2. a = len(str1)
  3. c1 = 0
  4. c2 = 0
  5. temp = []
  6. for i in range(a):

  7. #找开始的3个大写字母
  8.     if str1[i].isupper() == 1:
  9. #找到第一个大写字母时,进入while循环计数      
  10.         while str1[i].isupper == 1:
  11.             c1 +=1
  12.             i += 1
  13.     else:
  14.         break

  15.    
  16. #如果大写字母刚好有3个,就判断下一个字符是不是小写字母
  17.     if c1 == 3:
  18.         i = i+1
  19.         
  20. #如果是小写字母,就将小写字母写入一个列表temp
  21.         if str1[i].islower() == 1:
  22.             while str1[i].islower() == 1:
  23.                 temp.append(str1[i])
  24.                 i +=1
  25. #当不是小写字母时,跳出循环
  26.         else:
  27.             break


  28. #当temp不为空时,判断下一个字符是不是大写字母
  29.     if len(temp) > 0:
  30.         i = i+1
  31. #下一个字符是大写字母时,判断是不是刚好3个大写字母
  32.         if str1[i].isupper() == 1:
  33.             while str1[i].isupper == 1:
  34.             c2 +=1
  35.             i +=1
  36. #如果刚好是三个大写字母,就输出temp;否则就清空temp
  37.             if c2 == 3:
  38.                 print(str(temp))
  39.             else:
  40.                 temp =[]
  41.    
复制代码
最佳答案
2020-7-7 12:49:42
jiong_jiong 发表于 2020-7-7 12:32
真的非常感谢你的耐心

我其实能读懂课后答案,我纠结的是,我不知道自己错在哪里。




帮你大致改了下代码,很多多余的地方去掉了,比如 if 判断条件和 while 循环条件相同的,都说多余的

但是问题还是很多,至少不会报错了,建议你还是看看课后答案的思路,然后再重新写一遍你原本的思路比较好:

  1. str1 = '''ABSaDKSbRIHcRHGcdDIF'''

  2. a = len(str1)
  3. c1 = 0
  4. c2 = 0
  5. temp = ''
  6. for i in range(a):

  7.     # 找到第一个大写字母时,进入while循环计数
  8.     while str1[i].isupper() == 1  :
  9.         c1 += 1
  10.         i += 1
  11.         if i == a:
  12.             i -= 1
  13.             break


  14.     # 如果大写字母刚好有3个,就判断下一个字符是不是小写字母
  15.     if c1 == 3:
  16.         # 如果是小写字母,就将小写字母写入一个列表temp
  17.         if str1[i].islower() == 1:
  18.             temp += str1[i]
  19.             i += 1

  20.     # 当temp不为空时,判断下一个字符是不是大写字母
  21.     if len(temp) > 0:
  22.         # 下一个字符是大写字母时,判断是不是刚好3个大写字母
  23.         if i < a and str1[i].isupper() == 1:
  24.             while i < a and str1[i].isupper() == 1:
  25.                 c2 += 1
  26.                 i += 1
  27.             # 如果刚好是三个大写字母,就输出temp;否则就清空temp
  28.             if c2 == 3:
  29.                 print(temp,end=' ')
  30.                 temp = ''
  31.     c1 = 0
  32.     c2 = 0
复制代码


你代码最后 c1 和 c2 也忘记初始化了,还有我把你的列表换成字符串了,进行拼接,看上去舒服点

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

使用道具 举报

 楼主| 发表于 2020-7-7 10:37:42 | 显示全部楼层
如果能指出我思路上的问题也非常感谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 10:46:16 | 显示全部楼层
  1. for i in range(10):
  2.     #print (i)
  3.     i +=2
  4.     print(i)

  5. print('------------')
  6. a = 0
  7. while a != 10:
  8.     a += 2
  9.     print(a)
复制代码

以上代码输出内容:
2
3
4
5
6
7
8
9
10
11
------------
2
4
6
8
10

for 语句中你想通过增加 i 来跳过循环次数是实现不了的,只有while语句中才可以通过 i 的增加来跳过X次;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 10:51:39 | 显示全部楼层
yhhpf 发表于 2020-7-7 10:46
以上代码输出内容:
2
3

你的意思我完全收到了的。所以,我只在开头用for语句,就是不想跳过循环。后面判断才用的while,通过i的增加来跳出。


我就是那种半通不通的状态,麻烦您再给我讲讲呢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 10:56:30 | 显示全部楼层
jiong_jiong 发表于 2020-7-7 10:51
你的意思我完全收到了的。所以,我只在开头用for语句,就是不想跳过循环。后面判断才用的while,通过i的 ...
我就是那种半通不通的状态,麻烦您再给我讲讲呢。
讲啥呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 11:00:26 | 显示全部楼层

版主求解一下我的代码问题!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 11:07:37 | 显示全部楼层
jiong_jiong 发表于 2020-7-7 11:00
版主求解一下我的代码问题!
所以,我只在开头用for语句,就是不想跳过循环
那么,14行的
  1. i += 1
复制代码
是要干什么呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 11:11:46 | 显示全部楼层
本帖最后由 jiong_jiong 于 2020-7-7 11:21 编辑
永恒的蓝色梦想 发表于 2020-7-7 11:07
那么,14行的是要干什么呢?


我想跳到下一个字符去判断,直到不是大写字母了就跳出while循环。这里是不是错了,是不是多此一举了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 11:11:53 | 显示全部楼层
jiong_jiong 发表于 2020-7-7 10:51
你的意思我完全收到了的。所以,我只在开头用for语句,就是不想跳过循环。后面判断才用的while,通过i的 ...
  1. str1 = '''ABSaDKSbRIHcRHGcdDIFzAAA'''
  2. list1 = []
  3. for i in range(len(str1)):
  4.     if not str1[i].isupper() and i > 2 and i < (len(str1)-3) :#如果出现小写,且位置至少在第3位与倒数第3位之间;
  5.         x = 0
  6.         while x != 4 :#左右各判断3次
  7.             x += 1
  8.             if not str1[i-x].isupper():#判断左边3位是否为小写,是则直接跳出
  9.                 x = 4
  10.                 break
  11.             if not str1[i+x].isupper():#判断右边3位是否为小写,是则直接跳出
  12.                 x = 4
  13.                 break
  14.             if x == 3 :
  15.                 list1.append(str1[i])
  16. print(list1)

复制代码


你参考下我学习的时候改的代码吧...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 11:15:24 | 显示全部楼层
yhhpf 发表于 2020-7-7 11:11
你参考下我学习的时候改的代码吧...

真心好懂,你的代码!!很棒啊!!!

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

使用道具 举报

发表于 2020-7-7 11:21:27 | 显示全部楼层
jiong_jiong 发表于 2020-7-7 11:15
真心好懂,你的代码!!很棒啊!!!

额,关键理解下for 和 while的区别。
顺便给个最佳吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 11:24:36 | 显示全部楼层
yhhpf 发表于 2020-7-7 11:21
额,关键理解下for 和 while的区别。
顺便给个最佳吧

我得找到自己的问题才行,哈哈。
我想回到我的办法上去,改正确。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 11:26:58 | 显示全部楼层

12行 38 行的 isupper 都忘记加括号了

代码中两个
  1. else:
  2.     break
复制代码


你还没 for 循环遍历结束,就直接退出外面的 for 循环了

还有:
if c1 == 3:
       i = i+1
这里也应该去掉 i = i + 1 ,因为你判断 大写字母时候 循环结束时候已经 i += 1 表示下一位字母的位置参数了

暂时看到这么多错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 11:32:14 | 显示全部楼层
Twilight6 发表于 2020-7-7 11:26
12行 38 行的 isupper 都忘记加括号了

代码中两个

您提到的三个地方确实都是问题,我先改一下,谢谢!!

尤其感谢 循环结束时 i 的位置这部分!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 11:45:58 | 显示全部楼层
jiong_jiong 发表于 2020-7-7 11:24
我得找到自己的问题才行,哈哈。
我想回到我的办法上去,改正确。

= =你觉得在错误的思路上,能得到正确的结果么...?首先思路要正确,你的思路并没考虑循环到小写时,判断后方3位都为大写;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 11:50:25 | 显示全部楼层
yhhpf 发表于 2020-7-7 11:45
= =你觉得在错误的思路上,能得到正确的结果么...?首先思路要正确,你的思路并没考虑循环到小写时,判断 ...

您说得对,如果思路错了就完蛋。

我有考虑后3位的大写问题,在33行开始的。
我先判断temp是不是为空,不为空时,看下一个字符是不是大写。
如果是大写,又刚好是3位,就输出temp。不是就清空temp。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 11:54:05 | 显示全部楼层
jiong_jiong 发表于 2020-7-7 11:50
您说得对,如果思路错了就完蛋。

我有考虑后3位的大写问题,在33行开始的。

那我就说你说的这思路问题,首先temp输出是否正确我不说了。
就算正确了,temp输出的应该是列表,那你对着列表有进行循环么?不循环你咋们去判断列表内每个元素的后3位???你循环的还是最外层的i。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 12:32:28 | 显示全部楼层
yhhpf 发表于 2020-7-7 11:54
那我就说你说的这思路问题,首先temp输出是否正确我不说了。
就算正确了,temp输出的应该是列表,那你对 ...

真的非常感谢你的耐心

我其实能读懂课后答案,我纠结的是,我不知道自己错在哪里。

有对temp列表进行循环,在24~27行,最后输出的时候,格式化为字符串。

我感觉自己是几个循环哪里没有理解对。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 12:49:42 | 显示全部楼层    本楼为最佳答案   
jiong_jiong 发表于 2020-7-7 12:32
真的非常感谢你的耐心

我其实能读懂课后答案,我纠结的是,我不知道自己错在哪里。




帮你大致改了下代码,很多多余的地方去掉了,比如 if 判断条件和 while 循环条件相同的,都说多余的

但是问题还是很多,至少不会报错了,建议你还是看看课后答案的思路,然后再重新写一遍你原本的思路比较好:

  1. str1 = '''ABSaDKSbRIHcRHGcdDIF'''

  2. a = len(str1)
  3. c1 = 0
  4. c2 = 0
  5. temp = ''
  6. for i in range(a):

  7.     # 找到第一个大写字母时,进入while循环计数
  8.     while str1[i].isupper() == 1  :
  9.         c1 += 1
  10.         i += 1
  11.         if i == a:
  12.             i -= 1
  13.             break


  14.     # 如果大写字母刚好有3个,就判断下一个字符是不是小写字母
  15.     if c1 == 3:
  16.         # 如果是小写字母,就将小写字母写入一个列表temp
  17.         if str1[i].islower() == 1:
  18.             temp += str1[i]
  19.             i += 1

  20.     # 当temp不为空时,判断下一个字符是不是大写字母
  21.     if len(temp) > 0:
  22.         # 下一个字符是大写字母时,判断是不是刚好3个大写字母
  23.         if i < a and str1[i].isupper() == 1:
  24.             while i < a and str1[i].isupper() == 1:
  25.                 c2 += 1
  26.                 i += 1
  27.             # 如果刚好是三个大写字母,就输出temp;否则就清空temp
  28.             if c2 == 3:
  29.                 print(temp,end=' ')
  30.                 temp = ''
  31.     c1 = 0
  32.     c2 = 0
复制代码


你代码最后 c1 和 c2 也忘记初始化了,还有我把你的列表换成字符串了,进行拼接,看上去舒服点

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

使用道具 举报

发表于 2020-7-7 13:07:14 | 显示全部楼层
jiong_jiong 发表于 2020-7-7 12:32
真的非常感谢你的耐心

我其实能读懂课后答案,我纠结的是,我不知道自己错在哪里。

你24-27循环的是把列表得出来,我上面说了,你列表输出是否正确我们先不看了。
得出列表temp后,按你的思路,咋们temp现在是不是应该记录的是:‘前面是连续3个大写字母后碰到的第一个小写字母’?
那继续的思路不是应该循环这个temp列表,把每个元素在str1所在的位置拿到,再判断该位置后面是否也是刚好连续3位大写?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-27 09:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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