鱼C论坛

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

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

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

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

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

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

a = len(str1)
c1 = 0
c2 = 0
temp = []
for i in range(a):

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

    
#如果大写字母刚好有3个,就判断下一个字符是不是小写字母
    if c1 == 3:
        i = i+1
        
#如果是小写字母,就将小写字母写入一个列表temp
        if str1[i].islower() == 1:
            while str1[i].islower() == 1:
                temp.append(str1[i])
                i +=1
#当不是小写字母时,跳出循环
        else:
            break


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

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




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

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

a = len(str1)
c1 = 0
c2 = 0
temp = ''
for i in range(a):

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


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

    # 当temp不为空时,判断下一个字符是不是大写字母
    if len(temp) > 0:
        # 下一个字符是大写字母时,判断是不是刚好3个大写字母
        if i < a and str1[i].isupper() == 1:
            while i < a and str1[i].isupper() == 1:
                c2 += 1
                i += 1
            # 如果刚好是三个大写字母,就输出temp;否则就清空temp
            if c2 == 3:
                print(temp,end=' ')
                temp = ''
    c1 = 0 
    c2 = 0

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

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

使用道具 举报

 楼主| 发表于 2020-7-7 10:37:42 | 显示全部楼层
如果能指出我思路上的问题也非常感谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

print('------------')
a = 0
while a != 10:
    a += 2
    print(a)
以上代码输出内容:
2
3
4
5
6
7
8
9
10
11
------------
2
4
6
8
10

for 语句中你想通过增加 i 来跳过循环次数是实现不了的,只有while语句中才可以通过 i 的增加来跳过X次;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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


我就是那种半通不通的状态,麻烦您再给我讲讲呢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

版主求解一下我的代码问题!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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


我想跳到下一个字符去判断,直到不是大写字母了就跳出while循环。这里是不是错了,是不是多此一举了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你参考下我学习的时候改的代码吧...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

使用道具 举报

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

额,关键理解下for 和 while的区别。
顺便给个最佳吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我得找到自己的问题才行,哈哈。
我想回到我的办法上去,改正确。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

代码中两个
else:
    break

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

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

暂时看到这么多错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

代码中两个

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

尤其感谢 循环结束时 i 的位置这部分!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

= =你觉得在错误的思路上,能得到正确的结果么...?首先思路要正确,你的思路并没考虑循环到小写时,判断后方3位都为大写;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

我有考虑后3位的大写问题,在33行开始的。
我先判断temp是不是为空,不为空时,看下一个字符是不是大写。
如果是大写,又刚好是3位,就输出temp。不是就清空temp。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

使用道具 举报

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

真的非常感谢你的耐心

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

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

我感觉自己是几个循环哪里没有理解对。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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




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

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

a = len(str1)
c1 = 0
c2 = 0
temp = ''
for i in range(a):

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


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

    # 当temp不为空时,判断下一个字符是不是大写字母
    if len(temp) > 0:
        # 下一个字符是大写字母时,判断是不是刚好3个大写字母
        if i < a and str1[i].isupper() == 1:
            while i < a and str1[i].isupper() == 1:
                c2 += 1
                i += 1
            # 如果刚好是三个大写字母,就输出temp;否则就清空temp
            if c2 == 3:
                print(temp,end=' ')
                temp = ''
    c1 = 0 
    c2 = 0

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

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

使用道具 举报

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

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 10:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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