lotus8171213 发表于 2022-12-23 22:38:19

[课后作业] 第020讲:函数:内嵌函数和闭包




"""
自己按小甲鱼答案整理了思路写出来的答案

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

daA = 0 # 统计小写字母前面的大写字母数量
xiao = 0 # 统计小写字母数量
daB = 0 # 统计小写字母 后面的大写字母数量
lenth = len(str1) # 拿到字符串的长度

for i in range(lenth):
    if str1 == '\n': # 判断字符串为换行符的时候
      continue # 跳出循环体进入下一个循环内容

    if str1.isupper(): # 判断如果遍历的字符串是大写字母时候进入if判断体
      if xiao != 0: # 如果统计小写字母变量 != 0的时候进入循环体
            daB +=1 # 统计小写后面的大写字母变量加1


      else:# 如果统计小写字母变量 =0 的时候进入else
            daB =0 # 统计小写后面的大写字母统计清空
            daA +=1 # 统计小写前面的大写字母统计+1

    if str1.islower(): #判断如果遍历的字符串是小写的时候进入if判断体
      if daA !=3: # 如果统计小写字母前面的 大写字母非等于3个的时候,进入if判断
            # 是不符合要求的!所有统计清空,重新查找
            daA =0
            xiao =0
            daB = 0
      else:
            if xiao !=0: # 判断如果小写字母统计变量非等于0,则进入if判断体
                daA =0
                xiao =0
                daB = 0
            else: # 如果等于0则进入else
                xiao = 1 # 小写统计变量赋值1
                daB =0
                t = i


    if daA ==3 and daB == 3:
      if i+1 != lenth and str1.isupper():
            xiao =0
            daB =0
      else:
            print('打印符合的小写字母:',str1,end='\n')
            daA =3
            xiao =0
            daB = 0







代码逻辑详解:



[*]定义3个变量,分别统计:小写字母前面的大写字母数量、小写字母数量、小写字母后面的大写字母数量;
[*]for循环遍历整个字符串内容,当字符串内容是换行符的时候跳出本轮循环,进入下一轮循环,不是换行符的时候,不进入该if判断,到下一个if判断;




[*]如果字符串内容是大写的时候进入第一个if判断;
[*]if判断里面又判断了当统计小写字母变量!=0的时候进入if判断体把后面的统计大写字母变量数值+1;
[*]else否则统计小写字母变量等于0的时候进入else里面把后面的统计大写变量数值清空(因为这里统计小写字母变量等于0的时候说明没有出现过小写字母,就不存在统计小写字母后面的 大写字母数值了,没有出现过小写字母现在的大写字母只可能在后续要出现的小写字母前面),统计小写前面的大写字母变量数值+1;



[*]然后上面的if语句执行完毕后进入第二个if判断;
[*]当字符串是小写字母的时候进入if体,然后又进行了if判断当统计小写前面的大写字母数值非等于3的时候(不符合条件)所有统计清空;
[*]else如果等于3的话再一个if判断如果统计的小写字母非等于0(比如:字符串中出现了两个写字母 ab时,进入这个循环时就会进入上面的判断当统计的小写字母非等于0)的时候(不符合条件)所有统计清空;
[*]else统计小写变量数值=0的时候 统计小写的变量赋值1 ,统计小写字母后面的大写字母数值清空,把找到的小写字母下标给到一个变量接收



[*]第三个if判断:当小写字母前面、后面三个大写字母变量的数值都等于3的时候进入if判断体;
[*]进入后再一个判断当i+1(符合条件的字符串整体的下一位值,比如:ABSaDKS的下一位值,DKSbRIH的下一位值)非等于字符串长度时(比如:i+1比字符串长度小即没有循环完i+1就是小写字母后面的第4位) and 小写后面的第4位是大写时进入if体,统计小写字母清空、统计后面的大写字母数值清空(因为如果小写后面的第4位也是大写的话不符合条件,就清空了统计小写、以及小写后面的大写字母的数值,重新进入上面的循环体和判断);
[*]否则小写后面的第四位不是大写的话:
[*]打印找到的符合条件的小写字母;
[*]小写前面的大写字母数额还是等于(如果下一个循环体是小写的话直接进入第二个if判断);
[*]小写后面的大写字母清空(进入下一轮循环);


数据流转详解:

[*]当ABS进入第一个if判断时,满足条件进入if判断体;
[*]然后再一个if判断统计小写字母变量数值是否非等于0 (这时候 统计小写字母变量数值没有赋值过肯定是0);
[*]等于0进入else,把统计后面的大写字母变量数值清空,并且统计前面的大写字母数值+1,(ABS进入了3个大写字母正好+3);
[*]所以现在统计前面的大写字母变量数值 = 3;



[*]当a进入代码时是小写字母所以直接进入第二个if判断,满足小写字母判断进入if体;
[*]再一个判断 当前面的大写字母数值 !=3 的时候(比如前面有1、2、4个大写字母),进入if判断体,清空所有统计,满足了if就不会执行else了,所以代码就不会往下执行了;
[*]否则 前面的大写字母数值 =3 的时候进入else;
[*]进入else后再一个if判断统计小写变量数值是否 !=0(当前没有+过小写字母数值,肯定是0),所以直接进入这层的else(把统计小写字母变量赋值=1,统计后面的大写字母数值清空,并把找到的小写字母给到一个变量),至此a的代码执行完毕;





[*]当DKS 进入代码时,因为是大写字母,同上进入第一个if判断;
[*]再一个if判断统计小写字母数值是否 !=0(刚才a进入的时候给了值这时候是非等于0);
[*]非等于0统计后面的大写字母数值+1(DKS进入了3个大写字母正好+3);
[*]这时候满足了第三个if判断,当小写字母前面、后面三个大写字母变量的数值都等于3的时候进入if判断体;
[*]很显然S+1的下标对应是小写b,小写b的下标是7非等于字符串总长度 但 不是大写字母,所以进入else;
[*]打印找到的小写字母a、统计前面的大写字母变量数值改为3、统计小写字母以及后面的大写字母数额清空(至此完整的找到了一组符合条件的数据);



[*]当b进入代码时,因为是小写字母,同上进入第二个if判断;
[*]此时小写字母前面的大写字母数值等于3,进入else;
[*]进入else后再一个if判断统计小写变量数值是否 !=0(刚才我们找到一组的时候清空了小写字母的统计),所以直接进入这层的else(把统计小写字母变量赋值=1,统计后面的大写字母数值清空,并把找到的小写字母给到一个变量),至此b的代码执行完毕;



[*]当RIH进入代码时,因为是大写字母,同上进入第一个if判断;
[*]再一个if判断统计小写字母数值是否 !=0(刚才b进入的时候给了值这时候是非等于0);
[*]非等于0统计后面的大写字母数值+1(RIH进入了3个大写字母正好+3);
[*]这时候满足了第三个if判断,当小写字母前面、后面三个大写字母变量的数值都等于3的时候进入if判断体;
[*]很显然H+1的下标对应是小写C,小写C的下标是11非等于字符串总长度 但 不是大写字母,所以进入else;
[*]打印找到的小写字母b、统计前面的大写字母变量数值改为3、统计小写字母以及后面的大写字母数额清空(至此完整的找到了一组符合条件的数据);

页: [1]
查看完整版本: [课后作业] 第020讲:函数:内嵌函数和闭包