任务描述
函数是有使用范围的,在一个模块中,我们可以定义很多函数和变量,但我们希望有的函数和变量别人可以使用,有的函数和变量仅仅可以在模块内部使用。这就是Python作用域的相关问题。
本关的目标就是让读者了解并掌握函数的使用范围,即Python作用域的相关知识。
相关知识
在Python中,正常的函数和变量名是公开的(public
),都是可以被直接引用的,比如:abs()
、abc
、dir()
等。
类似__xxx__
这种格式的变量是特殊变量,允许被直接引用,但是会被用作特殊用途,比如__author__
、__name__
就是属于特殊变量。hello
模块定义的文档注释也可以用特殊变量__doc__
访问,我们自己编程定义的变量一般不会用这种变量名。
类似_xxx
和__xxx
这种格式的函数和变量就是非公开的(private
),不应该被直接引用。
补充:_xxx
的函数和变量是protected
,我们直接从外部访问不会产生异常。__xxx
的函数和变量是private
,我们直接从外部访问会报异常,我们要注意前缀符合的区别。
我们要注意用词的区别,我们说的是private
函数和变量是“不应该”被直接引用,而不是“不能”被直接引用,这是因为在Python种并没有一种方法可以真正完全限制访问private
函数或变量。但是我们为了养成良好的编程习惯,是不应该引用private
函数或变量的。
private
函数的作用是隐藏函数的内部逻辑,让函数有更好的封装性。
例如:
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
我们在上述程序块里公开了greeting()
函数,greeting()
函数需要使用_private_1()
和_private_2()
函数,读者并不需要知道greeting()
函数中的内部实现细节。所以我们可以将内部逻辑用private
函数隐藏起来。这是一种十分常用的代码封装的方法。
小结:为了让程序的封装性更好,我们一般都限定函数的使用范围,一般我们把外部需要使用的函数定义为public
函数,而把只在内部使用,而外部不需要引用的函数定义成private
函数。
编程要求
本关的编程任务是补全src/step3/scope.py
文件的代码,实现相应的功能。具体要求如下:
- 编写程序,功能是求两个正整数的最小公倍数;
- 要求实现方法:先定义一个
private
函数_gcd()
求两个正整数的最大公约数,再定义public
函数lcm()
调用_gcd()
函数求两个正整数的最小公倍数。 - 调用函数
lcm()
,并将输入的两个正整数的最小公倍数输出。
本关涉及的代码文件src/step3/scope.py
的代码框架如下:
#coding=utf-8
#输入两个正整数a,b
a = int(input())
b = int(input())
# 请在此添加代码,求两个正整数的最小公倍数
#********** Begin *********#
#********** End **********#
#调用函数,并输出a,b的最小公倍数
print(lcm(a,b))
测试说明
本关的测试文件是src/step3/scope.py
,测试过程如下:
- 平台自动编译生成
scope.exe
; - 平台运行
scope.exe
,并以标准输入方式提供测试输入; - 平台获取
scope.exe
输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。
以下是平台对src/step3/scope.py
的样例测试集:
测试输入:5
6
预期输出:30
测试输入:8
10
预期输出:40
测试输入:16
24
预期输出:48
测试输入:132
214
预期输出:14124
开始你的任务吧,祝你成功!
路程中会遇到很多很多麻烦困难,我们需要承受,更要去解决,俞敏洪说过一句话:坚持下去,不是我们有足够的坚强,而是我们已经无法选择。
如果你觉得这一关的内容对你有帮助,请你在下面点赞。
参考答案
注:两数之积 = 最大公约数 * 最小公倍数
#coding=utf-8
#输入两个正整数a,b
a = int(input())
b = int(input())
# 请在此添加代码,求两个正整数的最小公倍数
#********** Begin *********#
def _gcd(a, b):
if a < b:
smaller = a
else:
smaller = b
for i in range(1, smaller + 1):
if a % i == 0 and b % i == 0:
gcd = i
return gcd
def lcm(a, b):
gcd = _gcd(a, b)
lcm = int(a * b / gcd)
return lcm
#********** End **********#
#调用函数,并输出a,b的最小公倍数
print(lcm(a,b))