953211787 发表于 2020-4-2 20:20:27

我编写的零基础学python第20讲作业,答案不对。想求教鱼油问题在哪

本帖最后由 953211787 于 2020-4-2 21:26 编辑

小甲鱼的零基础学python第20讲动手作业最后一题





以下是我写的:
secret = '''这里面是一长串英文字符串'''
leng = len(secret)
last = leng -1
lie = []
for i in range(last):
    if secret == '\n':
      continue
    if secret.islower()and secret.isupper() and secret.isupper() and secret.islower() and secret.islower():
      lie.append(secret)
我想知道为什么得到的答案和小甲鱼的不一样。答案比他的多了两个字母。问题在哪里
思路:如果secret是小写并且i前面和后面三个都是大写,而且前面第四个和后面第四个都是小写,那么i就是密码。
感觉完全符合题目要求,但是得出来的答案为什么就不对。
具体题目可以去看零基础入门学习python(不是最新版那个)第20讲,动动手作业最后一题

永恒的蓝色梦想 发表于 2020-4-2 20:21:26

你这个代码是从html上爬来的?为什么还有html标签?

BngThea 发表于 2020-4-2 20:22:59

考虑一下越界的问题

953211787 发表于 2020-4-2 20:23:50

永恒的蓝色梦想 发表于 2020-4-2 20:21
你这个代码是从html上爬来的?为什么还有html标签?

我直接复制的我的,爬的意思就是复制?

953211787 发表于 2020-4-2 20:26:01

BngThea 发表于 2020-4-2 20:22
考虑一下越界的问题

没有,发帖子的时候我看到没有缩进,我就手动按空格了。第一次发帖

shatanzongcai 发表于 2020-4-2 20:28:03

953211787 发表于 2020-4-2 20:23
我直接复制的我的,爬的意思就是复制?

兄弟,你发的那个代码我有点看不懂。能不能稍微编辑一下,<p>这种标签能不能删掉,然后换行也整理一下

永恒的蓝色梦想 发表于 2020-4-2 20:28:48

953211787 发表于 2020-4-2 20:23
我直接复制的我的,爬的意思就是复制?

噗,不是,为什么你的代码前后各有一个<p></p>呢?{:10_277:}这个是html的标签

953211787 发表于 2020-4-2 20:38:16

shatanzongcai 发表于 2020-4-2 20:28
兄弟,你发的那个代码我有点看不懂。能不能稍微编辑一下,这种标签能不能删掉,然后换行也整理一下

改了 ,你看看

953211787 发表于 2020-4-2 20:38:46

永恒的蓝色梦想 发表于 2020-4-2 20:28
噗,不是,为什么你的代码前后各有一个呢?这个是html的标签

改了,你看看,我就是不知道问题在哪

txxcat 发表于 2020-4-2 21:33:09

判断的时候如果碰到\n会被分片当做1位字符加入到前后3个字符串里去,例如你多的第一个'u'是'IY\nuABN',=''IY\n',isupper()结果是True,所以就误判了。所以要判断大写要每个字符逐个判断才行,参考下面的代码:
lenth = len(str1)
for i in range(lenth-4):
    allupper=True                                 #定义一个标量标志全部是大写
    if str1.islower():
      for each in str1+str1:    #遍历前3个+后3个字符
            if not each.isupper():                #有1个不是大写就跳出判断,标志改为False
                allupper=False
                break
      if allupper and (str1.islower()) and (str1.islower()):
            print(str1,end="")

953211787 发表于 2020-4-2 21:39:36

txxcat 发表于 2020-4-2 21:33
判断的时候如果碰到\n会被分片当做1位字符加入到前后3个字符串里去,例如你多的第一个'u'是'IY\nuABN',='' ...

万分感谢,终于明白了

shatanzongcai 发表于 2020-4-2 21:52:54

本帖最后由 shatanzongcai 于 2020-4-2 21:55 编辑

我没有看懂楼主为什么要有last = leng -1 这一步,但是我大概可以解释为什么会有点出入。
楼主的这个方法并没有删除任何一个字符,每一个字符应该都会被使用,而小甲鱼的只要下一个字母不符合题意就清空前面所有操作,导致有些大写字母可能不满足前面的一组,而满足后面的那一组直接没能被再次使用而被清空了。
举个例子:
为了方便理解我们就只分大小写,在那一堆字符串里比方说有个字符串是这样的:‘aAAAaAAAaAAAaaAAAaAAaA’

如果使用小甲鱼的方法,得到的结果是这样的:a
使用l楼主的方法,得到的结果是:['a','a']

小甲鱼和楼主的结果不一样是因为,小甲鱼在经历第四个字符A时,发现它不符合题意,所以所有的count全都归零,也就等于这个代码切掉了不符合要求的前四个字符,变成了从‘aAAAaAAAaaAAAaA’这个字符串开始重新计算。那很明显,只有一个a是符合题意的。

总而言之,楼主的方法可以看成是切片,是允许两个7位字符串是有重合的,但是小甲鱼不是切片,小甲鱼的代码不存在两个合适的小写字符有大写字符重叠的可能。

个人的理解是这样的

953211787 发表于 2020-4-3 16:35:34

shatanzongcai 发表于 2020-4-2 21:52
我没有看懂楼主为什么要有last = leng -1 这一步,但是我大概可以解释为什么会有点出入。
楼主的这个方法 ...

按照你说的这个‘aAAAaAAAaAAAaaAAAaAAaA’
答案应该是'aa',按照题目的意思也应该是aa
我的错误在于判别\n的时候会自动看成一个整体也就是换行符,所以造成的误判

953211787 发表于 2020-4-3 16:39:49

txxcat 发表于 2020-4-2 21:33
判断的时候如果碰到\n会被分片当做1位字符加入到前后3个字符串里去,例如你多的第一个'u'是'IY\nuABN',='' ...

我还有个问题想请教一下,就是比如
secret = 'AaAAaAA'
if secret.isupper:
    print(111)


这个里面,我把secret改成secret为什么他还是会执行print(111)
if 不是只有在后面条件为True的时候才执行么

txxcat 发表于 2020-4-3 20:50:16

isupper后面漏了括号,返回值是对象信息,象这样:<built-in method isupper of str object at 0x0000019A9AE04F30>,if总会通过。
secret = 'AaAAaAA'
if secret.isupper():
    print(111)

shatanzongcai 发表于 2020-4-3 21:38:48

953211787 发表于 2020-4-3 16:35
按照你说的这个‘aAAAaAAAaAAAaaAAAaAAaA’
答案应该是'aa',按照题目的意思也应该是aa
我的错误在于判 ...

好的,那我再看一下

slieep 发表于 2020-4-9 16:25:13

最佳答案似乎有个小问题:如果i-4<0,或者i+4=length无法检测。
比如说,如果str1='ABCdEFG',按照str1.islower()是检测不到的。
所以,更复杂点,还得分类讨论i的取值:

这是我写的:length = len(str1)

for each in range(3, length-3):
    flag = 0                              #定义一个标量标志
    if str1 == '\n':
      continue
    elif str1.islower():
      if each == 3:                     #each==3,即前边只有三个字母
            if str1.isupper():      #判断后边第四个字母
                continue                  #如果第四个字母是大写,不符合题意,跳过后面进入下一轮循环
            else:
                for ea_ch in (str1 + str1):
                  if not ea_ch.isupper():
                        flag = 1
                        break               #用break,因为不用再判断其余前后三个字母,跳出上一级for循环

      elif each == length-4:            #即后面只有三个字母
            if str1.isupper():      #判断前面第四个字母
                continue
            else:
               for ea_ch in (str1 + str1):
                  if not ea_ch.isupper():
                        flag = 1
                        break

      else:
            if (str1.isupper()) or (str1.isupper()):
                continue
            else:
                for ea_ch in (str1 + str1):
                  if not ea_ch.isupper():
                        flag = 1
                        break

      if flag == 0:                        #最后判断flag值是否改变
            print(str1, end='')
如果有问题欢迎指正!
页: [1]
查看完整版本: 我编写的零基础学python第20讲作业,答案不对。想求教鱼油问题在哪