马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 三与七之间 于 2017-10-16 12:24 编辑
下边是小甲鱼python如入门教程第20讲的一个课后题,我不太明白那个if countB是什么意思?如果是省略了后面的条件,难道是在说,如果countB为真的话countC就加个1?我总是理解不太好那种while啊,if啊后面把条件省略直接写while B:或者if B:这种东西......
str1 = '''ABSaDKSbRIHcRHGcdDIF'''
countA = 0 # 统计前边的大写字母
countB = 0 # 统计小写字母
countC = 0 # 统计后边的大写字母
length = len(str1)
for i in range(length):
if str1[i] == '\n':
continue
"""
|如果str1[i]是大写字母:
|-- 如果已经出现小写字母:
|-- -- 统计后边的大写字母
|-- 如果未出现小写字母:
|-- -- 清空后边大写字母的统计
|-- -- 统计前边的大写字母
"""
if str1[i].isupper():
if countB:
countC += 1
else:
countC = 0
countA += 1
"""
|如果str1[i]是小写字母:
|-- 如果小写字母前边不是三个大写字母(不符合条件):
|-- -- 清空所有记录,重新统计
|-- 如果小写字母前边是三个大写字母(符合条件):
|-- -- 如果已经存在小写字母:
|-- -- -- 清空所有记录,重新统计(出现两个小写字母)
|-- -- 如果该小写字母是唯一的:
|-- -- -- countB记录出现小写字母,准备开始统计countC
"""
if str1[i].islower():
if countA != 3:
countA = 0
countB = 0
countC = 0
else:
if countB:
countA = 0
countB = 0
countC = 0
else:
countB = 1
countC = 0
target = i
"""
|如果前边和后边都是三个大写字母:
|-- 如果后边第四个字母也是大写字母(不符合条件):
|-- -- 清空记录B和C,重新统计
|-- 如果后边仅有三个大写字母(符合所有条件):
|-- -- 打印结果,并清空所有记录,进入下一轮统计
"""
if countA == 3 and countC == 3:
if i+1 != length and str1[i+1].isupper():
countB = 0
countC = 0
else:
print(str1[target], end='')
countA = 3
countB = 0
countC = 0
本帖最后由 铁棍阿童木 于 2017-10-16 15:17 编辑
首先你要知道,在这段程序中是用逻辑推理的思路来定位密码的,共有三个推理模块:
一、从字符串中迭代出来的字符如果是大写字母则判断是位于密码的前面还是后面,并做标记 += 1;
二、如果是小写字母就看她前面有没有三个大写字母countA==3,如果有就要看是否已经出现小写字母(即countB是否非零)如果是就清空标记重新计数;
三、如果前面后面都是三个大写字母,但是后边第四个也是大写,重新标记;否则符合所有条件,打印结果。
所以一句话而言:
1、countA是用来标记密码前面有多少个大写字母;
2、countB是用来标记密码本身的;
3、countC是用来标记密码后面有多少个大写字母;
进入主题:
python中的if条件语句和while判断语句会把非零值认为是True,其他则是False
因此,在这段代码中如果str[i]是大写字母的话,就会进入第二个if语句
if countB: 等价于 if countB != 0:
在这里的意思是说,当检测到str是大写字母,同时countB不为零,那么就说明检测到的大写字母位于密码的后面,这个时候countC += 1(即小写字母后面有1个大写字母了,如果有3个就满足条件了)
然后就是else:
如果执行到这一步,就说明countB为零,那么就说明检测到的大写字母位于密码的前面,这个时候就是countA += 1了。
自己写代码的话,最好不要采用这种方式,保证程序代码的完整性非常重要,而且可读性比较强。[/i]
|