Peteryo01223 发表于 2021-1-12 09:48:02

第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:40

当满足某一特征的时候,这个变量就改变了。这个变量不就可以代表这一特征了吗?

Peteryo01223 发表于 2021-1-12 09:55:28

heidern0612 发表于 2021-1-12 09:52
当满足某一特征的时候,这个变量就改变了。这个变量不就可以代表这一特征了吗?

道理能理解,但是,我没看出来,标准答案里,这个意思,是怎么传达给 Python的。

heidern0612 发表于 2021-1-12 09:58:33

Peteryo01223 发表于 2021-1-12 09:55
道理能理解,但是,我没看出来,标准答案里,这个意思,是怎么传达给 Python的。

当条件满足(大写或者小写)的时候,变量就加了1.

这不就说明这个变量代表了这个条件吗?

Peteryo01223 发表于 2021-1-12 10:03:15

heidern0612 发表于 2021-1-12 09:58
当条件满足(大写或者小写)的时候,变量就加了1.

这不就说明这个变量代表了这个条件吗?

当条件满足(大写或者小写)的时候,写一个 if countB:, 这在做什么啊?

heidern0612 发表于 2021-1-12 10:05:00

if countB: 是个缩写,意思是ifcountB !=0:

Peteryo01223 发表于 2021-1-12 10:06:03

heidern0612 发表于 2021-1-12 10:05
if countB: 是个缩写,意思是ifcountB !=0:

哦 是吗?了解了!

jackz007 发表于 2021-1-12 10:12:29

本帖最后由 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)

Peteryo01223 发表于 2021-1-12 10:17:38

jackz007 发表于 2021-1-12 10:12
"标准答案" 太过繁琐,楼主试试这个代码

哇,不明觉厉。不过你这么“飞翔”起来,帮不到我们初学者,我们还是爬行动物呀。

jackz007 发表于 2021-1-12 10:48:06

Peteryo01223 发表于 2021-1-12 10:17
哇,不明觉厉。不过你这么“飞翔”起来,帮不到我们初学者,我们还是爬行动物呀。

         没有 "飞翔" 呀,str1 跨了多行,每行后面都有换行符 '\n',这个换行符的存在肯定会干扰判断,必须去掉。所以,第一步就是利用 '\n' 对 str1 进行分割,然后再拼接到一起,这样,拼接后的字符串就没有换行符了。
         根据条件每位密码的左右两边均有且只有三个大写字母,我们判断,如果密码字符两侧存在第 4 个字符,那就一定是小写字母。根据这个判断,我们准备按密码字符两侧各 4 个字符进行搜索,由于字符串的首尾没有这第 4 个字符,为了搜索条件一致起来,我们为字符串首尾各添加一个小写字母 'a',从而避免单独处理字符串的首尾。
         仅此而已,正如你所见,机械判断而已,没有任何玄妙之处。

Peteryo01223 发表于 2021-1-12 10:51:25

本帖最后由 Peteryo01223 于 2021-1-12 10:53 编辑

jackz007 发表于 2021-1-12 10:48
没有 "飞翔" 呀,str1 跨了多行,每行后面都有换行符 '\n',这个换行符的存在肯定会干扰判断, ...

好好好。这么说的话,原理,我能听得懂。谢谢!
你这个 str 前面加一个 ‘a’ 的技巧,有启发到我。
页: [1]
查看完整版本: 第20课:最后一题。读答案,问问题