Python入门之函数结构——第3关:函数的使用范围:Python作用域

Posted YLeee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python入门之函数结构——第3关:函数的使用范围:Python作用域相关的知识,希望对你有一定的参考价值。

任务描述

函数是有使用范围的,在一个模块中,我们可以定义很多函数和变量,但我们希望有的函数和变量别人可以使用,有的函数和变量仅仅可以在模块内部使用。这就是Python作用域的相关问题。

本关的目标就是让读者了解并掌握函数的使用范围,即Python作用域的相关知识。

相关知识

在Python中,正常的函数和变量名是公开的(public),都是可以被直接引用的,比如:abs()abcdir()等。

类似__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,测试过程如下:

  1. 平台自动编译生成scope.exe;
  2. 平台运行scope.exe,并以标准输入方式提供测试输入;
  3. 平台获取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))

 

以上是关于Python入门之函数结构——第3关:函数的使用范围:Python作用域的主要内容,如果未能解决你的问题,请参考以下文章

Python入门之函数结构——第2关:函数的返回值 - 可有可无的return

Python入门之函数调用——第3关:函数与函数调用 - 分清主次

Python入门之经典函数实例——第3关:Map-Reduce - 映射与归约的思想

Python入门之经典函数实例——第3关:Map-Reduce - 映射与归约的思想

Python入门之经典函数实例——第2关:Lambda函数 - 匿名函数的使用

Python入门之经典函数实例——第2关:Lambda函数 - 匿名函数的使用