python入门

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类型的字符串,且字符串与前后不能交替重合使用。

上一篇下一篇

猜你喜欢

热点阅读