第20课:最后一题。读答案,问问题
本帖最后由 Peteryo01223 于 2021-1-12 10:14 编辑试过了我的笨办法,要好好学习一下标准答案。
原题:
1. 请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
a) 每位密码为单个小写字母;
b) 每位密码的左右两边均有且只有三个大写字母。
标准答案:
str1 = '''ABSaDKSbRIHcRHGcdDIF'''
countA = 0# 统计前边的大写字母
countB = 0# 统计小写字母
countC = 0# 统计后边的大写字母
length = len(str1)
for i in range(length):
if str1 == '\n':
continue
if str1.isupper(): # 如果str1是大写字母:
if countB: # 如果已经出现小写字母:
countC += 1 # 统计后边的大写字母
else: # 如果未出现小写字母:
countC = 0 # 清空后边大写字母的统计
countA += 1 # 统计前边的大写字母
if str1.islower(): # 如果str1是小写字母:
if countA != 3: # 如果小写字母前边不是三个大写字母(不符合条件):
countA = 0 # 清空所有记录,重新统计
countB = 0 #
countC = 0 #
else:# 如果小写字母前边是三个大写字母(符合条件):
if countB: # 如果已经存在小写字母:
countA = 0 # 清空所有记录,重新统计(出现两个小写字母)
countB = 0 #
countC = 0 #
else: # 如果该小写字母是唯一的:
countB = 1 # countB记录出现小写字母,准备开始统计countC
countC = 0 #
target = i #
if countA == 3 and countC == 3: # 如果前边和后边都是三个大写字母:
if i+1 != length and str1.isupper():# 如果后边第四个字母也是大写字母(不符合条件):
countB = 0 # 清空记录B和C,重新统计
countC = 0 #
else: # 如果后边仅有三个大写字母(符合所有条件):
print(str1, end='') # 打印结果,并清空所有记录,进入下一轮统计
countA = 3 #
countB = 0 #
countC = 0 #
我的问题:
1.
if str1.isupper(): # 如果str1是大写字母:
if countB: # 如果已经出现小写字母:
countC += 1 # 统计后边的大写字母
这里,if countB,看上去什么也条件也没给出来, 是怎么告诉了Python “如果已经出现小写字母“ 的意思呢??
2.
countA = 0# 统计前边的大写字母
countB = 0# 统计小写字母
countC = 0# 统计后边的大写字母
countA, countB 和 countC 是三个数值,但没看到对它们进行定义,python是怎么理解这三个数值的意义的呢?
我没看出 str1 是如何与 countA, countB 和 countC 是三个数值发生关系的。
3. print(str1, end='') 这里的target,英文是目标的意思,也没听小甲鱼老师提到过。
谢谢。 当满足某一特征的时候,这个变量就改变了。这个变量不就可以代表这一特征了吗? heidern0612 发表于 2021-1-12 09:52
当满足某一特征的时候,这个变量就改变了。这个变量不就可以代表这一特征了吗?
道理能理解,但是,我没看出来,标准答案里,这个意思,是怎么传达给 Python的。 Peteryo01223 发表于 2021-1-12 09:55
道理能理解,但是,我没看出来,标准答案里,这个意思,是怎么传达给 Python的。
当条件满足(大写或者小写)的时候,变量就加了1.
这不就说明这个变量代表了这个条件吗? heidern0612 发表于 2021-1-12 09:58
当条件满足(大写或者小写)的时候,变量就加了1.
这不就说明这个变量代表了这个条件吗?
当条件满足(大写或者小写)的时候,写一个 if countB:, 这在做什么啊? if countB: 是个缩写,意思是ifcountB !=0: heidern0612 发表于 2021-1-12 10:05
if countB: 是个缩写,意思是ifcountB !=0:
哦 是吗?了解了! 本帖最后由 jackz007 于 2021-1-12 10:13 编辑
"标准答案" 太过繁琐,楼主试试这个代码
str1 = '''ABSaDKSbRIHcRHGcdDIF'''
s , p = 'a' + '' . join(str1 . split('\n')) + 'a' , ''
for k in range(4 , len(s) - 4):
if s . islower() and s . isupper() and s . islower() and s . isupper() and s . islower():
p += s
print(p) jackz007 发表于 2021-1-12 10:12
"标准答案" 太过繁琐,楼主试试这个代码
哇,不明觉厉。不过你这么“飞翔”起来,帮不到我们初学者,我们还是爬行动物呀。 Peteryo01223 发表于 2021-1-12 10:17
哇,不明觉厉。不过你这么“飞翔”起来,帮不到我们初学者,我们还是爬行动物呀。
没有 "飞翔" 呀,str1 跨了多行,每行后面都有换行符 '\n',这个换行符的存在肯定会干扰判断,必须去掉。所以,第一步就是利用 '\n' 对 str1 进行分割,然后再拼接到一起,这样,拼接后的字符串就没有换行符了。
根据条件每位密码的左右两边均有且只有三个大写字母,我们判断,如果密码字符两侧存在第 4 个字符,那就一定是小写字母。根据这个判断,我们准备按密码字符两侧各 4 个字符进行搜索,由于字符串的首尾没有这第 4 个字符,为了搜索条件一致起来,我们为字符串首尾各添加一个小写字母 'a',从而避免单独处理字符串的首尾。
仅此而已,正如你所见,机械判断而已,没有任何玄妙之处。 本帖最后由 Peteryo01223 于 2021-1-12 10:53 编辑
jackz007 发表于 2021-1-12 10:48
没有 "飞翔" 呀,str1 跨了多行,每行后面都有换行符 '\n',这个换行符的存在肯定会干扰判断, ...
好好好。这么说的话,原理,我能听得懂。谢谢!
你这个 str 前面加一个 ‘a’ 的技巧,有启发到我。
页:
[1]