我编写的零基础学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讲,动动手作业最后一题
你这个代码是从html上爬来的?为什么还有html标签? 考虑一下越界的问题 永恒的蓝色梦想 发表于 2020-4-2 20:21
你这个代码是从html上爬来的?为什么还有html标签?
我直接复制的我的,爬的意思就是复制? BngThea 发表于 2020-4-2 20:22
考虑一下越界的问题
没有,发帖子的时候我看到没有缩进,我就手动按空格了。第一次发帖 953211787 发表于 2020-4-2 20:23
我直接复制的我的,爬的意思就是复制?
兄弟,你发的那个代码我有点看不懂。能不能稍微编辑一下,<p>这种标签能不能删掉,然后换行也整理一下 953211787 发表于 2020-4-2 20:23
我直接复制的我的,爬的意思就是复制?
噗,不是,为什么你的代码前后各有一个<p></p>呢?{:10_277:}这个是html的标签 shatanzongcai 发表于 2020-4-2 20:28
兄弟,你发的那个代码我有点看不懂。能不能稍微编辑一下,这种标签能不能删掉,然后换行也整理一下
改了 ,你看看 永恒的蓝色梦想 发表于 2020-4-2 20:28
噗,不是,为什么你的代码前后各有一个呢?这个是html的标签
改了,你看看,我就是不知道问题在哪 判断的时候如果碰到\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="") txxcat 发表于 2020-4-2 21:33
判断的时候如果碰到\n会被分片当做1位字符加入到前后3个字符串里去,例如你多的第一个'u'是'IY\nuABN',='' ...
万分感谢,终于明白了 本帖最后由 shatanzongcai 于 2020-4-2 21:55 编辑
我没有看懂楼主为什么要有last = leng -1 这一步,但是我大概可以解释为什么会有点出入。
楼主的这个方法并没有删除任何一个字符,每一个字符应该都会被使用,而小甲鱼的只要下一个字母不符合题意就清空前面所有操作,导致有些大写字母可能不满足前面的一组,而满足后面的那一组直接没能被再次使用而被清空了。
举个例子:
为了方便理解我们就只分大小写,在那一堆字符串里比方说有个字符串是这样的:‘aAAAaAAAaAAAaaAAAaAAaA’
如果使用小甲鱼的方法,得到的结果是这样的:a
使用l楼主的方法,得到的结果是:['a','a']
小甲鱼和楼主的结果不一样是因为,小甲鱼在经历第四个字符A时,发现它不符合题意,所以所有的count全都归零,也就等于这个代码切掉了不符合要求的前四个字符,变成了从‘aAAAaAAAaaAAAaA’这个字符串开始重新计算。那很明显,只有一个a是符合题意的。
总而言之,楼主的方法可以看成是切片,是允许两个7位字符串是有重合的,但是小甲鱼不是切片,小甲鱼的代码不存在两个合适的小写字符有大写字符重叠的可能。
个人的理解是这样的 shatanzongcai 发表于 2020-4-2 21:52
我没有看懂楼主为什么要有last = leng -1 这一步,但是我大概可以解释为什么会有点出入。
楼主的这个方法 ...
按照你说的这个‘aAAAaAAAaAAAaaAAAaAAaA’
答案应该是'aa',按照题目的意思也应该是aa
我的错误在于判别\n的时候会自动看成一个整体也就是换行符,所以造成的误判 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的时候才执行么
isupper后面漏了括号,返回值是对象信息,象这样:<built-in method isupper of str object at 0x0000019A9AE04F30>,if总会通过。
secret = 'AaAAaAA'
if secret.isupper():
print(111) 953211787 发表于 2020-4-3 16:35
按照你说的这个‘aAAAaAAAaAAAaaAAAaAAaA’
答案应该是'aa',按照题目的意思也应该是aa
我的错误在于判 ...
好的,那我再看一下 最佳答案似乎有个小问题:如果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]