鱼C论坛

 找回密码
 立即注册
查看: 1939|回复: 1

[学习笔记] L20 函数和闭包(1) 课后作业

[复制链接]
发表于 2020-3-31 18:49:14 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 foxdai 于 2020-4-1 18:56 编辑

1. 全局变量
a.全局变量屏蔽
b.函数适合调用全局变量,而不要去修改全局变量
c.关键字global

2. 内嵌函数=内部函数

3. 闭包(closere))
关键字nonlocal(注意与global的差异)

list语言

global
nonlocal

*动动手,就按字符串中每个字符的数量
(**0**)
#1.字符串含每个字符的个数
#2.长字符串中,拆成每一行为一个字符串,然后单独计算每个字符串中包含每个字符的个数;
'''
1.定义变量:字符串集合、字符串计数
  1.1 字符串集合,每次查询有不同的,则将其加入,并且给与新的变量,且数量+1;
2.自定义函数2个函数,
  (1)一个字符串时候在原有的字符集中,如果没有则加入,字符集变量用列表
  (2)字符计数,变量存储用列表
3 长字符串拆解
  (1)将长字符串,拆成更小的字符串;
  (2)对小字符串,进行步骤2的操作
4.用思维导图先拆解
'''

动动手#Start 字符串计数
#字符太多,示例如下,能说明问题
str1 = '''%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+$&[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^{*
@##&{#&{&)*%(]{{([*}@[@&]+!!*{)!}{%+{))])[!^})+)$]#{*+^((@^@}$[**$&^{$!@#$%)!@(&
+^!{%_$&@^!}$_${)$_#)!({@!)(^}!*^&!$%_&&}&_#&@{)]{+)%*{&*%*&@%$+]!*__(#!*){%&@++
!_)^$&&%#+)}!@!)&^}**#!_$([$!$}#*^}$+&#[{*{}{((#$]{[$[$$()_#}!@}^@_&%^*!){*^^_$^
]@}#%[%!^[^_})+@&}{@*!(@$%$^)}[_!}(*}#}#___}!](@_{{(*#%!%%+*)^+#%}$+_]#}%!**#!^_
'''

#定义字符集列表变量,存放不同字符的集合
#定义字符累计数列表变量,记录每个字符的数量
strbox = []
countlst = []
#Function defining
def strcheck(x):
    global strbox, countlst
    if x in strbox:
        countlst[strbox.index(x)] += 1
    else:
        strbox.append(x)
        countlst.append(0)
        countlst[-1] += 1

#Main process
#拆解长字符为短字符串
strlst = str1.split()
strcount = len(strlst)
for i in range(strcount):
    strnew = strlst[i].strip()
    for a in strnew:
        strcheck(a)

#显示统计结果
length=len(strbox)
for i in range(length):
    print('字符 ',strbox[i],'个数: ',countlst[i],end=' , ')
    if ((i+1) % 3) == 0:
        print('\n')
for i in range(length):
    if strbox[i].isalpha():
        for b in range(countlst[i]):
            print(strbox[i],end='')

****
[b]动动手,查找字符串中的密码[/b]
str2= '''小甲鱼老师给的字符串string2.txt'''

strlst = str2
length = len(str2)
keybox = []
for i in range(4,length-3):
    if strlst[i].isalpha() and strlst[i].islower:
        prestr = strlst[i-3:i]
        endstr = strlst[i+1:i+4]
        if '\n' in prestr+endstr:
            continue
#下面的判断,对回车符'\n'未能判断出,判断大写和字母时不能区分,小甲鱼加了去重复字符,不理解了吧
        if strlst[i].isalpha() and strlst[i].islower() and \
           prestr.isupper() and endstr.isupper() and strlst[i] not in keybox:
            keybox.extend([strlst[i],i])
        else:
            continue
    else:
        continue


'''
#计算正确,单个字符计算,代码较长
        for x in range(i-1,i-4,-1):
            if strlst[x].isalpha() and strlst[x].isupper():
                prebig = True
            else:
                prebig = False
                break
        if prebig != True:
            continue
        else:
            for x in range(i+1,i+4):
                if strlst[x].isalpha() and strlst[x].isupper():
                    endbig = True
                else:
                    endbig = False
                    break
            if endbig:
                keybox.extend(strlst[i])
            else:
                continue
'''


#key display 验证密码,小甲鱼老师的代码,知道其原理,但是逻辑没看懂
print('key is: ')
#for i in keybox:
#    print(i,end='')

a = 0
for i in keybox:
        if type(i) == int:
                print(strlst[i],'=',strlst[i-3:i],' ',strlst[i],' ',strlst[i+1:i+4],end=' ; ')
                a += 1
                if a % 3 ==0:
                    print('\n')





        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-31 19:35:16 | 显示全部楼层
我也学到这了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 23:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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