鱼C论坛

 找回密码
 立即注册
查看: 1869|回复: 10

第20课:最后一题。读答案,问问题

[复制链接]
发表于 2021-1-12 09:48:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

试过了我的笨办法,要好好学习一下标准答案。

原题:
1. 请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
    a) 每位密码为单个小写字母;
    b) 每位密码的左右两边均有且只有三个大写字母。

标准答案:
  1. str1 = '''ABSaDKSbRIHcRHGcdDIF'''

  2. countA = 0  # 统计前边的大写字母
  3. countB = 0  # 统计小写字母
  4. countC = 0  # 统计后边的大写字母
  5. length = len(str1)

  6. for i in range(length):
  7.     if str1[i] == '\n':
  8.         continue

  9.     if str1[i].isupper(): # 如果str1[i]是大写字母:
  10.         if countB: # 如果已经出现小写字母:
  11.             countC += 1 # 统计后边的大写字母
  12.         else: # 如果未出现小写字母:
  13.             countC = 0 # 清空后边大写字母的统计
  14.             countA += 1 # 统计前边的大写字母

  15.     if str1[i].islower(): # 如果str1[i]是小写字母:
  16.         if countA != 3: # 如果小写字母前边不是三个大写字母(不符合条件):
  17.             countA = 0 # 清空所有记录,重新统计
  18.             countB = 0 #
  19.             countC = 0 #
  20.         else:  # 如果小写字母前边是三个大写字母(符合条件):
  21.             if countB: # 如果已经存在小写字母:
  22.                 countA = 0 # 清空所有记录,重新统计(出现两个小写字母)
  23.                 countB = 0 #
  24.                 countC = 0 #
  25.             else: # 如果该小写字母是唯一的:
  26.                 countB = 1 # countB记录出现小写字母,准备开始统计countC
  27.                 countC = 0 #
  28.                 target = i #

  29.     if countA == 3 and countC == 3: # 如果前边和后边都是三个大写字母:
  30.         if i+1 != length and str1[i+1].isupper():# 如果后边第四个字母也是大写字母(不符合条件):
  31.             countB = 0 # 清空记录B和C,重新统计
  32.             countC = 0 #
  33.         else: # 如果后边仅有三个大写字母(符合所有条件):
  34.             print(str1[target], end='') # 打印结果,并清空所有记录,进入下一轮统计
  35.             countA = 3 #
  36.             countB = 0 #
  37.             countC = 0 #
复制代码


我的问题:
1.
  1.     if str1[i].isupper(): # 如果str1[i]是大写字母:
  2.         if countB: # 如果已经出现小写字母:
  3.             countC += 1 # 统计后边的大写字母
复制代码

这里,if countB,看上去什么也条件也没给出来, 是怎么告诉了Python “如果已经出现小写字母“ 的意思呢??

2.
  1. countA = 0  # 统计前边的大写字母
  2. countB = 0  # 统计小写字母
  3. countC = 0  # 统计后边的大写字母
复制代码

countA, countB 和 countC 是三个数值,但没看到对它们进行定义,python是怎么理解这三个数值的意义的呢?
我没看出 str1[i] 是如何与 countA, countB 和 countC 是三个数值发生关系的。

3. print(str1[target], end='') 这里的target,英文是目标的意思,也没听小甲鱼老师提到过。
谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-12 09:52:40 | 显示全部楼层
当满足某一特征的时候,这个变量就改变了。这个变量不就可以代表这一特征了吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-12 09:55:28 | 显示全部楼层
heidern0612 发表于 2021-1-12 09:52
当满足某一特征的时候,这个变量就改变了。这个变量不就可以代表这一特征了吗?

道理能理解,但是,我没看出来,标准答案里,这个意思,是怎么传达给 Python的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

这不就说明这个变量代表了这个条件吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-12 10:03:15 | 显示全部楼层
heidern0612 发表于 2021-1-12 09:58
当条件满足(大写或者小写)的时候,变量就加了1.

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

当条件满足(大写或者小写)的时候,写一个 if countB:, 这在做什么啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-12 10:05:00 | 显示全部楼层
if countB: 是个缩写,意思是  if  countB !=0:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-12 10:06:03 | 显示全部楼层
heidern0612 发表于 2021-1-12 10:05
if countB: 是个缩写,意思是  if  countB !=0:

哦 是吗?了解了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-12 10:12:29 | 显示全部楼层
本帖最后由 jackz007 于 2021-1-12 10:13 编辑

        "标准答案" 太过繁琐,楼主试试这个代码
  1. str1 = '''ABSaDKSbRIHcRHGcdDIF'''
  2. s , p = 'a' + '' . join(str1 . split('\n')) + 'a' , ''
  3. for k in range(4 , len(s) - 4):
  4.     if s[k - 4] . islower() and s[k - 3 : k] . isupper() and s[k] . islower() and s[k + 1 : k + 4] . isupper() and s[k + 4] . islower():
  5.         p += s[k]
  6. print(p)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-12 10:17:38 | 显示全部楼层
jackz007 发表于 2021-1-12 10:12
"标准答案" 太过繁琐,楼主试试这个代码

哇,不明觉厉。不过你这么“飞翔”起来,帮不到我们初学者,我们还是爬行动物呀。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

 楼主| 发表于 2021-1-12 10:51:25 | 显示全部楼层
本帖最后由 Peteryo01223 于 2021-1-12 10:53 编辑
jackz007 发表于 2021-1-12 10:48
没有 "飞翔" 呀,str1 跨了多行,每行后面都有换行符 '\n',这个换行符的存在肯定会干扰判断, ...


好好好。这么说的话,原理,我能听得懂。谢谢!
你这个 str 前面加一个 ‘a’ 的技巧,有启发到我。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 15:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表