鱼C论坛

 找回密码
 立即注册
查看: 6998|回复: 18

零基础入门学习python-第20讲课后作业小甲鱼答案不正确,已修改,但存在欠缺

[复制链接]
发表于 2015-11-29 22:21:21 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zhang7324456 于 2015-11-29 22:37 编辑

零基础入门学习python-第20讲课后作业,动动手,最后一个题(找密码)
题目:
找字符串的密码。密码要求如下:
1.密码为1个小写字母
2.密码左右2边有且只有3个大写字母

小甲鱼的答案如下:
str1='ABCaABCbABC' #我自己修改的内容,小甲鱼的那个内容太多了

countA = 0
countB = 0
countC = 0
length = len(str1)
for i in range(length):
    if str1 == '\n':
        continue
    if str1.isupper():
        if countB == 1:
            countC += 1
            countA = 0
        else:
            countA += 1
        continue
    if str1.islower() and countA == 3:
        countB = 1
        countA = 0
        target = i
        continue
    if str1.isupper() == False and countC == 3:
    #if str1.islower() and countC == 3: 这句话小甲鱼写错了,若密码右边的第四个字符是数字,会导致无法得到正确结果
    #用上面修改后if即可。但是上面我自己修改过后的条件,存在一个问题,即:
    #若密码右边的3位大写字母刚好结束了,则这个密码不会被判断为密码。因为没有下一个字符来进入循环了,所以不
    #被认为是密码,请教如何修改代码

        print(str1[target])
    countA = 0
    countB = 0
    countC = 0
运行结果:
>>>
a
>>>
#b没有被认为是密码

我自己编写的代码如下:(我知道这种效率低下,但我们暂时不考虑效率问题,单纯从解决问题入手)
str1='ABCaABCbABCD' #比上面的内容多一个D

alphabet_lower='qwertyuiopasdfghjklzxcvbnm'
alphabet_upper='QWERTYUIOPASDFGHJKLZXCVBNM'
list1=[]
start = 3
for each in str1:
    list1.append(each)
length = len(list1)   
while start+3 < length:
    if list1[start] in alphabet_lower:

     

        if (str(list1[start-3]+list1[start-2]+list1[start-1]+list1[start+1]+list1[start+2]+list1[start+3])).isupper:
            #这种方法无法判断b不是密码,因为没办法判断最后一个D,只判断了密码左右3个字母是大写字母,而没有判断左右第四个字符
    #if (str(list1[start-3]+list1[start-2]+list1[start-1]+list1[start+1]+list1[start+2]+list1[start+3])).isupper\
    #    and (str(list1[start-4]+list1[start+4])).isupper == False:    我的本意是想用这种方法来判断密码左右第4个字符,但是若密码右边只有3个大
     #写字母,则判断右边第4个字符会造成列表序号超出范围
    # 求指导,如何修改代码?   

            print('密码是:%s' % list1[start])
    start+=1

运行结果如下:
>>>
密码是:a
密码是:b
>>>
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-6 19:45:45 | 显示全部楼层
你说的对....我也在纠结这个问题,用计算周边数字的方法,就会超出界限......
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-6 20:40:52 | 显示全部楼层
落殇飞羽 发表于 2016-1-6 19:45
你说的对....我也在纠结这个问题,用计算周边数字的方法,就会超出界限......

没懂你的意思...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-6 21:28:18 | 显示全部楼层
hldh214 发表于 2016-1-6 20:40
没懂你的意思...

。。我想的就是说,答案的算法存在第一个问题就是如果这个字符的第四个字符是数字或者不存在,那么即使这个字符满足小写也不能被挑选出来,也就是po主第一段的黄色字体的内容;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-7 08:35:09 | 显示全部楼层
我把最后一位为空给加上了。不过有问题的是想AAAbCCCdEEE
像这种是不是bd是密码
  1. str1 = '''AAAbCCC#'''
  2. countA = 0
  3. countB = 0
  4. countC = 0
  5. target=0
  6. length = len(str1)
  7. for i in range(length):
  8.     if str1[i] == '\n':
  9.         continue
  10.     if str1[i].isupper():
  11.         if countB == 1:
  12.             countC += 1
  13.             countA = 0
  14.         else:
  15.             countA += 1
  16.         if i<length-1:
  17.             continue
  18.     if str1[i].islower() and countA == 3:
  19.         countB = 1
  20.         countA = 0
  21.         target = i
  22.         continue
  23.     if (str1[i].isupper()==False or i==length-1) and countC == 3:
  24.         print(str1[target], end='')
  25.    
  26.     countA = 0
  27.     countB = 0
  28.     countC = 0
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-7 13:33:18 | 显示全部楼层
lingtingliushen 发表于 2016-1-7 08:35
我把最后一位为空给加上了。不过有问题的是想AAAbCCCdEEE
像这种是不是bd是密码

bd应该是密码.....这个写法解决了第四位非大写就可以运行,但是如果是开头的前四位是密码,前三位大写,但是再往前还是空呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-7 13:36:04 | 显示全部楼层
冬雪雪冬 发表于 2016-1-6 22:37
我是这样写的:
1.判断0位为非大写,1~3位大写,4位小写,5~7位大写,8位非大写 ,则4位为密码。
2.向右 ...

也就是相当于把首位和尾部专门拿出来验证了一遍?我理解的对吗?那么这个不会出现out of range 的问题吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-7 14:00:12 | 显示全部楼层
落殇飞羽 发表于 2016-1-7 13:36
也就是相当于把首位和尾部专门拿出来验证了一遍?我理解的对吗?那么这个不会出现out of range 的问题吗?

不会出现越界了。
还有个更简单的办法,在字符串首尾各加入一个小写字符,就可只用for循环了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-7 14:20:41 | 显示全部楼层
冬雪雪冬 发表于 2016-1-7 14:00
不会出现越界了。
还有个更简单的办法,在字符串首尾各加入一个小写字符,就可只用for循环了。

对对,是的,谢谢你!!我明白了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-7 16:47:10 | 显示全部楼层
嘻嘻,感谢朋友指出,检查了一下确实存在逻辑漏洞

已经改正为以下代码:

  1. str1 = """ABCaABCbABC1"""

  2. countA = 0  # 统计前边的大写字母
  3. countB = 0  # 统计小写字母
  4. countC = 0  # 统计后边的大写字母
  5. length = len(str1)

  6. for i in range(length):
  7.     if str1[i] == '\n':
  8.         continue

  9.     """
  10.     |如果str1[i]是大写字母:
  11.     |-- 如果已经出现小写字母:
  12.     |-- -- 统计后边的大写字母
  13.     |-- 如果未出现小写字母:
  14.     |-- -- 清空后边大写字母的统计
  15.     |-- -- 统计前边的大写字母
  16.     """
  17.     if str1[i].isupper():
  18.         if countB:
  19.             countC += 1
  20.         else:
  21.             countC = 0
  22.             countA += 1

  23.     """
  24.     |如果str1[i]是小写字母:
  25.     |-- 如果小写字母前边不是三个大写字母(不符合条件):
  26.     |-- -- 清空所有记录,重新统计
  27.     |-- 如果小写字母前边是三个大写字母(符合条件):
  28.     |-- -- 如果已经存在小写字母:
  29.     |-- -- -- 清空所有记录,重新统计(出现两个小写字母)
  30.     |-- -- 如果该小写字母是唯一的:
  31.     |-- -- -- countB记录出现小写字母,准备开始统计countC
  32.     """
  33.     if str1[i].islower():
  34.         if countA != 3:
  35.             countA = 0
  36.             countB = 0
  37.             countC = 0
  38.         else:
  39.             if countB:
  40.                 countA = 0
  41.                 countB = 0
  42.                 countC = 0
  43.             else:
  44.                 countB = 1
  45.                 countC = 0
  46.                 target = i

  47.     """
  48.     |如果前边和后边都是三个大写字母:
  49.     |-- 如果后边第四个字母也是大写字母(不符合条件):
  50.     |-- -- 清空所有记录,重新统计
  51.     |-- 如果后边仅有三个大写字母(符合所有条件):
  52.     |-- -- 打印结果,并清空所有记录,进入下一轮统计
  53.     """
  54.     if countA == 3 and countC == 3:
  55.         if i+1 != length and str1[i+1].isupper():
  56.             countA = 0
  57.             countB = 0
  58.             countC = 0
  59.         else:
  60.             print(str1[target], end='')
  61.             countA = 3
  62.             countB = 0
  63.             countC = 0
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
hldh214 + 1 + 1 姜是老的辣!!!!!!!!!!!!!!!

查看全部评分

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

使用道具 举报

发表于 2016-1-7 20:04:40 | 显示全部楼层
小甲鱼 发表于 2016-1-7 16:47
嘻嘻,感谢朋友指出,检查了一下确实存在逻辑漏洞

已经改正为以下代码:

。。。。又要重新理解算法了.//.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-7 20:20:53 | 显示全部楼层
小甲鱼 发表于 2016-1-7 16:47
嘻嘻,感谢朋友指出,检查了一下确实存在逻辑漏洞

已经改正为以下代码:

为甚么我把str1换成string2.txt的内容后,最后只能输出就一个 l,位置是3?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-8 01:52:28 | 显示全部楼层
落殇飞羽 发表于 2016-1-7 20:20
为甚么我把str1换成string2.txt的内容后,最后只能输出就一个 l,位置是3?


不好意思,已经纠正~~~

这次应该没什么问题了,为了方便理解,我把代码写的比较粗俗并做了注释~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-8 10:58:07 | 显示全部楼层
小甲鱼 发表于 2016-1-8 01:52
不好意思,已经纠正~~~

这次应该没什么问题了,为了方便理解,我把代码写的比较粗俗并做 ...

哈哈哈,小甲鱼老师认输了,谢谢你了,我继续研究
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-8 11:56:05 | 显示全部楼层
好帖子啊学习了,留个名感谢楼主
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-6 10:18:29 | 显示全部楼层
很不错的哦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-31 18:31:40 | 显示全部楼层

  1. a = 'FHGAaASDfhAFDoDAFDaFDSgFSAhoxnH'
  2. b = len(a)
  3. for c in range(3,b):
  4.     if c == 3 and a[c].islower()  \
  5.        and a[(c-3):c].isupper() and a[(c+1):(c+4)].isupper() \
  6.        and a[(c+4)].islower():
  7.         print(a[c])
  8.     elif a[c].islower() and a[(c-4)].islower() \
  9.        and a[(c-3):c].isupper() and a[(c+1):(c+4)].isupper() \
  10.        and a[(c+4)].islower():
  11.         print(a[c])
复制代码

我是这样写的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-26 19:52:10 | 显示全部楼层
  1. def strs(strs):
  2.      countA =0
  3.      length = len(strs)
  4.      for i in range(length):
  5.           if strs[i].isupper():
  6.                countA += 1
  7.                if countA ==3:
  8.                   return i
  9.                   break
  10. str1 = list(input('输入字符'))
  11. str2 = list(reversed(str1))
  12. start =int(strs(str1))+1
  13. end  =-int(strs(str2))-1
  14. str3 =str1[start:end]               
  15. length = len(str3)
  16. for i in range(length):
  17.    if str3[i].islower():
  18.       print(str3[i],end='')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-5 16:29:34 | 显示全部楼层
str1 = input('str1:')
length = len(str1)
countf = 0
countm = 0
countb = 0
for i in range(length):
    if str1[i].isupper():
        if countm == 0:
            countf += 1
        elif countm == 1:
            countb += 1
        continue
    if str1[i].islower():
        if countm == 0 and countf == 3:
            countm = 1
            target = i
        elif countm == 0 and countf != 3:
            countf = 0
            countm = 0
            countb = 0
        elif countm == 1 and countb == 3:
            print(str1[target])
            target = i
            countf = 0
            countm = 0
            countb = 0
            countm = 1
        elif countm == 1 and countb != 3:
            countf = 0
            countm = 0
            countb = 0
if countb == 3:
    print(str1[target])
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-18 13:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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