jiong_jiong 发表于 2020-7-7 10:27:24

第020讲课后作业,似乎没有进入while循环

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

str1 = '''ABSaDKSbRIHcRHGcdDIF'''

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

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

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


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

jiong_jiong 发表于 2020-7-7 10:37:42

如果能指出我思路上的问题也非常感谢!!!

yhhpf 发表于 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次;

jiong_jiong 发表于 2020-7-7 10:51:39

yhhpf 发表于 2020-7-7 10:46
以上代码输出内容:
2
3


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


我就是那种半通不通的状态,麻烦您再给我讲讲呢。

永恒的蓝色梦想 发表于 2020-7-7 10:56:30

jiong_jiong 发表于 2020-7-7 10:51
你的意思我完全收到了的。所以,我只在开头用for语句,就是不想跳过循环。后面判断才用的while,通过i的 ...

我就是那种半通不通的状态,麻烦您再给我讲讲呢。讲啥呢?

jiong_jiong 发表于 2020-7-7 11:00:26

永恒的蓝色梦想 发表于 2020-7-7 10:56
讲啥呢?

版主求解一下我的代码问题!

永恒的蓝色梦想 发表于 2020-7-7 11:07:37

jiong_jiong 发表于 2020-7-7 11:00
版主求解一下我的代码问题!

所以,我只在开头用for语句,就是不想跳过循环那么,14行的i += 1是要干什么呢?

jiong_jiong 发表于 2020-7-7 11:11:46

本帖最后由 jiong_jiong 于 2020-7-7 11:21 编辑

永恒的蓝色梦想 发表于 2020-7-7 11:07
那么,14行的是要干什么呢?

我想跳到下一个字符去判断,直到不是大写字母了就跳出while循环。这里是不是错了,是不是多此一举了?

yhhpf 发表于 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.isupper() and i > 2 and i < (len(str1)-3) :#如果出现小写,且位置至少在第3位与倒数第3位之间;
      x = 0
      while x != 4 :#左右各判断3次
            x += 1
            if not str1.isupper():#判断左边3位是否为小写,是则直接跳出
                x = 4
                break
            if not str1.isupper():#判断右边3位是否为小写,是则直接跳出
                x = 4
                break
            if x == 3 :
                list1.append(str1)
print(list1)



你参考下我学习的时候改的代码吧...

jiong_jiong 发表于 2020-7-7 11:15:24

yhhpf 发表于 2020-7-7 11:11
你参考下我学习的时候改的代码吧...

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

yhhpf 发表于 2020-7-7 11:21:27

jiong_jiong 发表于 2020-7-7 11:15
真心好懂,你的代码!!很棒啊!!!

额,关键理解下for 和 while的区别。
顺便给个最佳吧{:9_219:}

jiong_jiong 发表于 2020-7-7 11:24:36

yhhpf 发表于 2020-7-7 11:21
额,关键理解下for 和 while的区别。
顺便给个最佳吧

我得找到自己的问题才行,哈哈。
我想回到我的办法上去,改正确。

Twilight6 发表于 2020-7-7 11:26:58


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

代码中两个
else:
    break

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

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

暂时看到这么多错误

jiong_jiong 发表于 2020-7-7 11:32:14

Twilight6 发表于 2020-7-7 11:26
12行 38 行的 isupper 都忘记加括号了

代码中两个


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

尤其感谢 循环结束时 i 的位置这部分!!

yhhpf 发表于 2020-7-7 11:45:58

jiong_jiong 发表于 2020-7-7 11:24
我得找到自己的问题才行,哈哈。
我想回到我的办法上去,改正确。

= =你觉得在错误的思路上,能得到正确的结果么...?首先思路要正确,你的思路并没考虑循环到小写时,判断后方3位都为大写;

jiong_jiong 发表于 2020-7-7 11:50:25

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

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

我有考虑后3位的大写问题,在33行开始的。
我先判断temp是不是为空,不为空时,看下一个字符是不是大写。
如果是大写,又刚好是3位,就输出temp。不是就清空temp。

yhhpf 发表于 2020-7-7 11:54:05

jiong_jiong 发表于 2020-7-7 11:50
您说得对,如果思路错了就完蛋。

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


那我就说你说的这思路问题,首先temp输出是否正确我不说了。
就算正确了,temp输出的应该是列表,那你对着列表有进行循环么?不循环你咋们去判断列表内每个元素的后3位???你循环的还是最外层的i。

jiong_jiong 发表于 2020-7-7 12:32:28

yhhpf 发表于 2020-7-7 11:54
那我就说你说的这思路问题,首先temp输出是否正确我不说了。
就算正确了,temp输出的应该是列表,那你对 ...

真的非常感谢你的耐心

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

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

我感觉自己是几个循环哪里没有理解对。

Twilight6 发表于 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.isupper() == 1:
      c1 += 1
      i += 1
      if i == a:
            i -= 1
            break


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

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


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

yhhpf 发表于 2020-7-7 13:07:14

jiong_jiong 发表于 2020-7-7 12:32
真的非常感谢你的耐心

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


你24-27循环的是把列表得出来,我上面说了,你列表输出是否正确我们先不看了。
得出列表temp后,按你的思路,咋们temp现在是不是应该记录的是:‘前面是连续3个大写字母后碰到的第一个小写字母’?
那继续的思路不是应该循环这个temp列表,把每个元素在str1所在的位置拿到,再判断该位置后面是否也是刚好连续3位大写?
页: [1] 2
查看完整版本: 第020讲课后作业,似乎没有进入while循环