python第20课练习
2019-05-25 本文已影响0人
YoYoYoo
1、如果希望在函数中修改全局变量的值,应该用什么关键字?
答案:global关键字
举个例子:
def MyFun():
global count
count = 10
print(count)
MyFun()
print(count)
>>> 10
>>> 10
2、在嵌套的函数中,如果希望在内部函数修改外部函数的局部变量,应该使用什么关键字?
答案: nonlocal关键字
举个例子:
def Fun1():
x = 5
def Fun2():
nonlocal x
x *= x
return x
return Fun2()
print(Fun1())
>>> 25
3、如何访问到funIn()?
(1)题1
def funOut():
def funIn():
print('你成功访问到我啦!')
return funIn()
答案:只需要直接调用funOut()即可
funOut()
>>> 你成功访问到我啦!
(2)题2
def funOut():
def funIn():
print('你成功访问到我啦!')
return funIn # 这里与题1中return funIn() 相比少了一个()
答案:区别于上一题,这里需要funOut()()访问:
funOut()()
>>> 你成功访问到我啦!
3、以下是“闭包”的一个例子,目测会打印什么内容?
def funX():
x = 5
def funY():
nonlocal x
x += 1
return x
return funY
a = funX()
print(a())
print(a())
print(a())
会打印:
6
7
8
这......怎么跟全局变量一样了呢?局部变量x不是应该在每一次调用的时候就初始化了吗?!
其实大家仔细看看就明白了,当a=funX()
的时候,只要a变量没有被重新赋值,funX()
就没有被释放,也就是说局部变量x就没有被重新初始化。
所以当全局变量不适用的时候,可以考虑使用“闭包”更稳定和安全。
如下改动:
def funX():
x = 5
def funY():
nonlocal x
x += 1
return x
return funY
a = funX()
print(a())
a = funX()
print(a())
a = funX()
print(a())
输出为:
6
6
6
4、编写程序,统计一个长字符串中各个字符出现的次数。
答案:
str1 = '''一串自己定义的随便多长的字符串
aaa'''
list1 = []
for each in str1:
if each not in list1:
if each == '\n':
print('\\n',str1.count(each))
else:
print(each,str1.count(each))
list1.append(each)
输出:
一 1
串 2
自 1
己 1
定 1
义 1
的 2
随 1
便 1
多 1
长 1
字 1
符 1
\n 1
a 3
5、请用学过的知识,编写参在一个字符串中的密码,密码的埋藏点符合以下规律:
(1)每位密码为单个小写字母;
(2)每位密码的左右两边均有且只有三个大写字母。
答案:
str1 = '''ASDiDFGaaaDDDlJJJwwwDDDoNNNbGGGvHHHgSrGGGeKKK
bbbKKKyMMMuFFFoXXXmCCCuTTTj'''
countA = 0
countB = 0
countC = 0
length = len(str1)
for i in range(length):
if str1[i] == '\n':
continue
if str1[i].isupper(): # 判断当前字符为大写时
if countB == 1:
countC += 1 # 计算小写字母右边的大写字母个数
countA = 0
else:
countA += 1 # countA记录小写字符左边大写字母的个数
continue
if str1[i].islower() and countA == 3: # 判断当前字符为小写时且左边有三个大写字母
countB = 1
countA =0
target = i
continue
if str1[i].islower() and countC == 3: # 当右边也集满3个大写字母且下一个为小写时,把之前的小写密码输出
print(str1[target],end='')
countA = 0
countB = 0
countC = 0
输出:
iloveyou
这道题相当于循环查找AAAbCCC类型的字符串,且字符串与前后不能交替重合使用。