LZRoc 发表于 2021-11-11 12:37:25

all([str[x:z]])和all([str[x],str[y],str[z]])问题

本帖最后由 LZRoc 于 2021-11-11 16:45 编辑

问题来源:
第020讲:函数:内嵌函数和闭包的课后练习题:
请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:(文本见附件)
a) 每位密码为单个小写字母
b) 每位密码的左右两边均有且只有三个大写字母

当使用all(.isupper()]) 时(见代码1),最终输出的是“uilovefisdhc”
当使用all(.isupper(),string.isupper(),string.isupper()])时(见代码2),最终输出的是"ilovefishc"
当修改all(.isupper()])为all(.isupper(),string.isupper(),string.isupper()])并不改变输出结果

请问为什么出现这种差异?



代码1:
def crack(string):
    temp = []
    length = len(string)
    if length < 7:
      return temp
    elif length == 7 and string.islower() and all(.isupper()]) and all(.isupper()]):
      temp.append(string)
      return temp
    elif length > 7:
      for i in range(3,length-4):
            if string.islower() and all(.isupper()]) and string.islower() and all(.isupper()]) and string.islower():
                temp.append(string)
      if string[-4].islower() and all(.isupper()]) and all(.isupper()]) and string[-8].islower():
            temp.append(string[-4])
      return temp

password = open("string2.txt","r")
passwords = crack(password.read())
print("小甲鱼隐藏的密码是:","".join(k for k in passwords))
password.close()

结果1:
小甲鱼隐藏的密码是: uilovefisdhc

代码2:
def crack(string):
    temp = []
    length = len(string)
    if length < 7:
      return temp
    elif length == 7 and string.islower() and all(.isupper()]) and all(.isupper()]):
      temp.append(string)
      return temp
    elif length > 7:
      for i in range(3,length-4):
            if string.islower() and all(.isupper(),string.isupper(),string.isupper()]) and string.islower() and all(.isupper()]) and string.islower():
                temp.append(string)
      if string[-4].islower() and all(.isupper()]) and all(.isupper()]) and string[-8].islower():
            temp.append(string[-4])
      return temp

password = open("string2.txt","r")
passwords = crack(password.read())
print("小甲鱼隐藏的密码是:","".join(k for k in passwords))
password.close()

结果2:
小甲鱼隐藏的密码是: ilovefishc

duiguangbin 发表于 2021-11-11 12:37:26

ewf

LZRoc 发表于 2021-11-16 08:22:51

没人解答吗?{:10_266:}

LZRoc 发表于 2021-12-1 12:02:58

找到原因:空白字符{:10_247:}。字符串切片有风险!!!
字符串中包括空格,换行符,制表符等,用s.isupper()或s.islower()判断是会忽略空白字符,其他不会忽略,比如s.isdigit(){:10_247:}。
当分开切片时string,isupper(),string,isupper(),string.isupper(),会单独返回空白字符串,因此结果正确。

a="123 "
a.isdigit()
False
a="a a"
a.islower()
True
a="a\na"
a.islower()
True
a="a\ta"
a.islower()
True
a="AA AA"
a.isupper()
True
a="AAA\tA"
a.isupper()
True

切片:
a="ABC\nDEF"
a
'\nDEF'
a.isupper()
True
a
'\n'
a.isupper()
False
页: [1]
查看完整版本: all([str[x:z]])和all([str[x],str[y],str[z]])问题