第1关:模块的定义
任务描述
在 Python 程序的开发过程中,为了代码维护的方便,我们可以把函数进行分组,分别放到不同的.py
文件里。这样,每个文件包含的代码就相对较少,这个.py
文件就称之为一个模块(Module
)。本关的目标是让学习者了解并掌握 Python 模块定义的相关知识。
相关知识
模块能够让我们有逻辑地组织 Python 代码段,模块中能够定义函数、类和变量,模块里也可以包含可执行的代码。
模块的引入
Python 中要用关键字import
来引入某个模块。比如要引用模块math
,就要在文件的开头用import math
来引入。在调用math
模块中的函数时,引用格式为:
模块名.函数名
因为这种调用方式可以避免特殊情况的发生。比如在多个模块中可能含有相同名称的函数,这时如果只是通过函数名来调用,程序无法知道是要调用哪个函数。所以如果用上述方法引入模块的时候,调用函数必须加上模块名。例如:
import math
print(fabs(-2))
输出结果:
NameError: name 'fabs' is not defined
fabs()
必须加上math
前缀,例如:
import math
print(math.fabs(-2))
输出结果:
2
有些时候我们只需要用到模块中的某个函数,这时不需要导入整个模块,只需要导入该函数即可。语句格式如下:
from 模块名 import 函数名1,函数名2....
通过这种方式导入函数的时候,调用函数时就只能给出函数名,而不能给出模块名。这种导入函数的方式会有一种缺陷,就是当两个模块中含有相同名称函数的时候,后面一次导入的函数会覆盖前一次导入的函数。
例如,假如模块A
中有函数function()
,模块B
中也有函数function()
。如果先导入模块A
中的function()
,后导入模块B
中的function()
,那么当我们在后面调用function()
函数的时候,程序会去执行模块B
中的function()
函数。
如果想一次性引入模块math
中所有的函数,可以通过如下方式导入:
from math import *
自己定义模块
每个 Python 文件都可以看作一个模块,模块的名字就是 Python 文件的名字。所以我们完全可以自己写一个 Python 文件,作为自己定义的模块。例如,我们编写了my_module.py
文件,里面定义了plus()
函数:
# my_module.py
def plus(a,b):
return a+b
之后我们就可以在其他 Python 文件中先引入my_module
,然后通过my_module.plus(a,b)
来调用my_module.py
文件中的plus()
函数。我们也可以直接通过from my_module import plus
来导入plus()
函数。
小结
使用模块可以大大提高代码的可维护性,而且也增加了代码的利用率。当一个模块编写完毕之后,在其他 Python 文件中导入该模块,模块中的函数就可以被其他 Python 文件使用了。
编程要求
本关的编程任务是补全src/step1/module.py
文件的代码,实现相应的功能。具体要求如下:
- 输入直角三角形的两个直角边的边长
a
和b
,要求计算出其斜边边长; - 要求使用
math
模块,并输出计算结果,结果保留小数点后三位小数。
本关涉及的代码文件src/step1/module.py
的代码框架如下:
import math# 输入正整数a和ba = int(input())b = int(input())# 请在此添加代码,输入直角三角形的两个直角边的边长a和b,计算出其斜边边长########## Begin #################### End ##########
测试说明
本关的测试文件是src/step1/module.py
,测试过程如下:
- 平台自动编译生成
module.exe
; - 平台运行
module.exe
,并以标准输入方式提供测试输入; - 平台获取
module.exe
输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。
以下是平台对src/step1/module.py
的样例测试集:
测试输入:
3
4
预期输出:
5.000
测试输入:
1.5
3.9
预期输出:
4.179
测试输入:
9
12
预期输出:
15.000
测试输入:
3.71
4.26
预期输出:
5.649
参考代码
# coding=utf-8
import math
# 输入正整数a和b
a = float(input())
b = float(input())
# 请在此添加代码,输入直角三角形的两个直角边的边长a和b,计算出其斜边边长
########## Begin ##########
c = math.sqrt(a**2+b**2)
print("%.3f"%c)
########## End ##########
第2关:内置模块中的内置函数
任务描述
我们在安装好了 Python 配置文件后,也将 Python 本身带有的库也安装好了, Python 自带的库也叫做 Python 的内置模块。Python 的内置模块是 Python 编程的重要组织形式,内置模块中的内置函数也极大方便了编程过程中对函数等功能的使用。本关的目标是让学习者了解并掌握 Python 内置模块和内置函数的相关知识。
相关知识
内置模块
Python 中常见的内置模块如下:
-
os
模块:文件和目录,用于提供系统级别的操作; -
sys
模块:用于提供对解释器相关的操作; -
json
模块:处理JSON
字符串; -
logging
: 用于便捷记录日志且线程安全的模块; -
time&datetime
模块:时间相关的操作,时间有三种表示方式; -
hashlib
模块:用于加密相关操作,代替了md5
模块,主要是提供SHA1
、SHA224
、SHA256
、SHA384
、SHA512
和MD5
算法; -
random
模块:提供随机数。
内置模块中的内置函数
Python 的内置模块中也有很多使用十分方便的内置函数。
dir()
函数
dir()
函数是一个排好序的字符串列表,其内容是一个模块里定义过的名字,包含在一个模块里定义的所有模块、变量和函数。例如:
# 导入内置math模块
import math
# 调用math模块中的dir()函数
content = dir(math)
# 输出math模块中所有模块、函数和变量的名字
print(content)
输出结果:
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs','factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin','sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
程序输出了math
模块中所有模块、函数和变量的名字。特殊字符串变量__name__
是指向模块的名字,变量__file__
是指向该模块的导入文件名。
globals()
和locals()
函数
globals()
和locals()
函数可被用来返回全局和局部命名空间里的名字。如果在函数内部调用的是globals()
函数,那么返回的是所有在该函数里能够访问的全局名字。如果在函数内部调用的locals()
函数,返回的是能够在该函数里访问的局部命名。globals()
函数和locals()
函数的返回类型都是字典,所以名字们能用keys()
函数摘取。
reload()
函数
当一个模块被导入到一个脚本中后,程序只会将模块顶层部分的代码执行一次。因此,如果我们想再次执行模块顶层部分的代码,可以用reload()
函数。该函数便会重新将之前导入过的模块导入。格式如下:
reload(module_name)
在这里,module_name
要直接放模块名,而不能是一个字符串形式。例如,我们想重载hello
模块:
reload(hello)
小结
Python 中的内置模块和内置函数可以帮助程序员快速完成编程功能,使他们不必重复开发已存在的常用代码,因此极大的提高了办事效率和代码质量。Python 中的内置模块和内置函数的应用也十分广泛,希望学习者在接下来的学习生活中有更加深刻的体会。
编程要求
本关的编程任务是补全src/step2/built-module.py
文件的代码,实现相应的功能。具体要求如下:
- 输入两个正整数
a
和b
,要求判断是否存在两个整数,它们的和为a
,积为b
; - 如果存在,则输出
Yes
,若不存在,则输出No
。
本关涉及的代码文件src/step2/built-module.py
的代码框架如下:
# coding=utf-8# 导入math模块import math# 输入两个整数a和ba = int(input())b = int(input())# 请在此添加代码,要求判断是否存在两个整数,它们的和为a,积为b########## Begin #################### End ##########
测试说明
本关的测试文件是src/step2/built-module.py
,测试过程如下:
- 平台自动编译生成
built-module.exe
; - 平台运行
built-module.exe
,并以标准输入方式提供测试输入; - 平台获取
built-module.exe
输出,并将其输出与预期输出对比。如果一致则测试通过,否则测试失败。
以下是平台对src/step2/built-module.py
的样例测试集:
测试输入:
9
15
预期输出:
No
测试输入:
9
20
预期输出:
Yes
测试输入:
20
36
预期输出:
Yes
测试输入:
18
40
预期输出:
No
参考答案
# coding=utf-8
# 导入math模块
import math
# 输入两个整数a和b
a = int(input())
b = int(input())
# 请在此添加代码,要求判断是否存在两个整数,它们的和为a,积为b
########## Begin ##########
def isExist(x, y):
c1 = x + math.sqrt(pow(x, 2) - 4 * y) > 0 and (x + math.sqrt(pow(x, 2) - 4 * y)) % 2 == 0
c2 = x - math.sqrt(pow(x, 2) - 4 * y) > 0 and (x - math.sqrt(pow(x, 2) - 4 * y)) % 2 == 0
if c1 and c2:
return "Yes"
else:
return "No"
print(isExist(a, b))
########## End ##########