您的位置:首页 > 编程语言 > Python开发

零基础学习Python 作业 第20章

2018-03-15 22:30 477 查看
============ CH20 homework ============

0 如果希望在函数中修改全局变量, 应该使用什么关键字?

Answer: global

1 在嵌套的函数中,如果希望在内部函数中修改外部函数的局部变量,应该使用什么关键字?

Answer: nonlocal

2 Python的函数可以嵌套,但要注意访问的作用域问题,请问以下代码存在什么问题?

def outside():
print('I am outside!')
def inside():
print('I am inside!)

inside()


Answer: 无法访问内部的嵌套函数inside(), 如果要访问, 这么写outside()

3 请问为什么代码A没有报错, 但代码B却报错了?应该如何修改?

代码A

def outside():
var = 5
def inside():
var = 3
print(var)

inside()
outside()


代码B

def outside():
var = 5
def inside():
print(var)
var = 3

inside()
outside()


Answer: 疑问代码B中print(var), var 是外部变量被屏蔽,找不到,而代码A中能找到。

B中的找不到的原因,因为outside的var被当做外部非全局局部变量。

改造方法

def outside():
var = 5
def inside():
nonlocal var
print(var)
var = 3

inside()
outside()


4 请问如何访问funIn()呢?

def funOut():
def funIn():
print('bingo!你成功访问我啦!')

return funIn()


Answer: funOut()

5 问如何访问funIn()呢?

def funOut():
def funIn():
print('bingo!你成功访问我啦!')

return funIn


Answer: funOut()()

6 以下是“闭包”的一个例子,请你目测会打印什么内容?

def funX():
x = 5
def funY():
nonlocal x
x += 1
return x
return funY

a = funX()
print(a())
print(a())
print(a())


Answer:

6

7

8

Practice

0 请用已经学过的知识编写程序,统计下面这个长字符串中各个字符出现的次数,

并找到小甲鱼送给大家的一句话。

str1 = '''Oh Good! If you like this,
Please give me enough money.
I think you are nice boy!'''

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)

print(list1)


1 请用已经学过的知识编写程序,找出小甲鱼藏在下边这个字符串中的密码,

密码埋藏点符合以下规律:

a) 每位密码为单个小写字母

b) 每位密码的左右两边均有有且只有三个大写字母

# 小甲鱼版本
# str = HonghuiSSKxUMB231JCCiTGZmn89KMLaYUIystrXWQoUUTjLMBiUYZaTYRhjhgUFDySADuYUIiSASsYYTsSHFbKLM
def findKey(str1):
# 大写字母计数
flagUp  = 0
# 标记小写字母
flag    = 0
# 计算小写字母后的大写字母
flagCount = 0

length = len(str1)

for i in range(length):
#if str1[i].isdigit():
#       continue
if str1[i] == '\n':
continue
if str1[i].isupper():
# 如果出现小写字母 flag = 1, 重置大写字母计数
# 这里说明已经满足前面的小写字母已经满足
if flag == 1:
# 如果第一个是小写字母,接下来的是大写字母则开始计数
flagCount += 1
flagUp = 0
else:
flagUp +=
4000
1
continue

if str1[i].islower() and flagUp == 3:
flag = 1
flagUp = 0
target = i
continue

if str1[i].islower() and flagCount == 3:
print(str1[target], end = ' ')

flagUp  = 0
flag    = 0
flagCount = 0


# 我的版本(效率低下)
def findKeyNew(str1):
length = len(str1)
add = 'aAaa'
str2 = add + str1 + add
leng = len(str2)
# Test:print(str2)
for i in range(4, leng-4):
if str2[i] == '\n':
continue
if str2[i].islower():
strF = str2[(i-3) : i]
strB = str2[(i+1) : (i+4)]
if strF.isupper() and strB.isupper():
if str2[i-4].isupper():
continue
elif str2[i+4].isupper():
continue
else:
print(str2[i], end = ' ')

# Result
# >>> str2 = 'sKKKyUUUoIIIuHHHaSSSaSSSMkMMMrAAAeXXXbEEEeQQQsAAAtXXX'
# >>> findKeyNew(str2)
# y o u a r e b e s t
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息