第3关:函数的使用范围:Python 作用域

任务描述
相关知识
编程要求
测试说明
任务描述
函数是有使用范围的,在一个模块中,我们可以定义很多函数和变量。但我们希望有的函数和变量别人可以使用,有的函数和变量仅仅可以在模块内部使用,这就是 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:
        x=a
    else:
        x=b 
    for i in range(1,x+1):
        if a%i==0 and b%i==0:
            res=i
    return res
def lcm(a,b):
    gcd=_gcd(a,b)
    lcm=int(a*b/gcd)
    return lcm
########## End ##########

# 调用函数,并输出a,b的最小公倍数
print(lcm(a,b))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别是个逗比吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值