Python编程基础12:函数和模块
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python编程基础12:函数和模块相关的知识,希望对你有一定的参考价值。
文章目录
一、函数和模块概述
(一)函数概述
函数可以看成是语句的集合,通过函数调用来执行其包含的语句。函数可以返回一个计算结果,根据每次函数调用的参数,可以返回不同的计算结果。Python利用函数提高代码的重用率,减少了代码冗余。
- 执行
dir(__builtin__)
可以查看Python所有内置对象
['ArithmeticError',
'AssertionError',
'AttributeError',
'BaseException',
'BlockingIOError',
'BrokenPipeError',
'BufferError',
'BytesWarning',
'ChildProcessError',
'ConnectionAbortedError',
'ConnectionError',
'ConnectionRefusedError',
'ConnectionResetError',
'DeprecationWarning',
'EOFError',
'Ellipsis',
'EnvironmentError',
'Exception',
'False',
'FileExistsError',
'FileNotFoundError',
'FloatingPointError',
'FutureWarning',
'GeneratorExit',
'IOError',
'ImportError',
'ImportWarning',
'IndentationError',
'IndexError',
'InterruptedError',
'IsADirectoryError',
'KeyError',
'KeyboardInterrupt',
'LookupError',
'MemoryError',
'ModuleNotFoundError',
'NameError',
'None',
'NotADirectoryError',
'NotImplemented',
'NotImplementedError',
'OSError',
'OverflowError',
'PendingDeprecationWarning',
'PermissionError',
'ProcessLookupError',
'RecursionError',
'ReferenceError',
'ResourceWarning',
'RuntimeError',
'RuntimeWarning',
'StopAsyncIteration',
'StopIteration',
'SyntaxError',
'SyntaxWarning',
'SystemError',
'SystemExit',
'TabError',
'TimeoutError',
'True',
'TypeError',
'UnboundLocalError',
'UnicodeDecodeError',
'UnicodeEncodeError',
'UnicodeError',
'UnicodeTranslateError',
'UnicodeWarning',
'UserWarning',
'ValueError',
'Warning',
'WindowsError',
'ZeroDivisionError',
'__IPYTHON__',
'__build_class__',
'__debug__',
'__doc__',
'__import__',
'__loader__',
'__name__',
'__package__',
'__spec__',
'abs',
'all',
'any',
'ascii',
'bin',
'bool',
'breakpoint',
'bytearray',
'bytes',
'callable',
'cell_count',
'chr',
'classmethod',
'compile',
'complex',
'copyright',
'credits',
'debugcell',
'debugfile',
'delattr',
'dict',
'dir',
'display',
'divmod',
'enumerate',
'eval',
'exec',
'filter',
'float',
'format',
'frozenset',
'get_ipython',
'getattr',
'globals',
'hasattr',
'hash',
'help',
'hex',
'id',
'input',
'int',
'isinstance',
'issubclass',
'iter',
'len',
'license',
'list',
'locals',
'map',
'max',
'memoryview',
'min',
'next',
'object',
'oct',
'open',
'ord',
'pow',
'print',
'property',
'range',
'repr',
'reversed',
'round',
'runcell',
'runfile',
'set',
'setattr',
'slice',
'sorted',
'staticmethod',
'str',
'sum',
'super',
'tuple',
'type',
'vars',
'zip']
- 演示Python内置函数
(二)模块概述
模块是程序代码和数据的封装。模块中定义的变量、函数或类等可导入到其他文件中使用。Python正是通过模块提供各种功能,例如,在前面用到的sys、os、math、random等都是模块。
1、sys模块
- 查看sys模块包含的对象(属性和方法)
- 使用sys模块的path
2、os模块
- 导入os模块
- 获取当前工作目录
3、math模块
4、random模块
二、函数
- 在编写程序时,往往会遇到在多处使用的类似代码。这时,可将重复代码提取出来,定义为函数。从而简化编程工作量,也使代码结构简化。
- 函数有三要素:函数名(function name)、参数列表(parameter list)、返回值(return value)
- 参数有两种类型:位置参数(positional parameter)、键参数(key parameter)
(一)定义函数
1、语法格式
- def: define
def 函数名(参数表):
函数体(语句组)
return 返回值
- 如果我们定义一个函数,没有写return语句,系统会自动给它添加一个return None
2、函数类型
- 无参函数
- 单参函数
- 多参函数
3、案例演示
-
定义无参函数
-
定义单参函数(调用时可以用位置参数,也可以用键参数)
-
定义多参函数
-
说明:定义函数时的参数叫做形式参数(formal paramter),简称形参(虚参);调用函数时的参数叫做实际参数(actual parameter),简称实参。调用函数,就是将实参传递给形参,进行处理之后,得到返回值。
-
定义有返回值的函数
-
课堂练习:定义一个求差函数
(二)调用函数
1、简要说明
- 函数通过函数名加上一组圆括号进行调用,参数放在圆括号内,多个参数之间用逗号分隔。
- 在Python中,所有的语句都是实时执行的,不像C/C++存在编译过程。def也是一条可执行语句,定义一个函数。所以函数的调用必须在函数定义之后。
- 在Python中,函数名也是一个变量,它引用return语句返回的值,没有返回值时,函数值为None。
2、案例演示
- 编写并调用阶乘函数 - factorial(n)
- 运行程序,查看结果
课堂练习:编程计算1! + 2! + 3! + … + 10!
(三)函数参数
在定义函数时,参数表中的各个参数称为形式参数,简称形参。调用函数时,参数表中提供的参数称为实际参数,简称实参。在Python中,变量保存的是对象的引用,类似C/C++中的指针。实参传递给形参就是将对象的引用赋值给形参。
1、参数的多态性
多态是面向对象的一个特点,指多一个行为针对不同对象可能会得到不同的结果。Python中的变量无类型属性,变量可引用各种不同类型的对象。同一个函数,传递的实际参数类型不同时,可获得不同的结果,体现了多态性。
2、参数赋值传递
通常,函数调用时按参数的先后顺序,将实参传递给形参。例如:调用add(1, 2.5)时,1传递给a,2.5传递给b。Python允许以形参赋值的方式,指定将实参传递给形参。
三、利用函数实现模块化
1、创建一级菜单
2、登录之后,实现二级菜单
3、运行程序,查看结果
4、将登录功能代码提取出来构建一个login()函数,实现模块化
5、按照自顶向下设计的原则,将二级菜单里的功能通过函数模块化
6、查看全部源代码
# -*- coding: utf-8 -*-
"""
功能:可进可退的多级菜单系统
作者:华卫
日期:2021年12月16日
"""
# 添加记录
def add_record():
print('添加记录功能模块尚待开发~')
# 查询记录
def find_record():
print('查询记录功能模块尚待开发~')
# 修改记录
def modify_record():
print('修改记录功能模块尚待开发~')
# 删除记录
def delete_record():
print('删除记录功能模块尚待开发~')
def login():
while True:
print(' 主菜单')
print('=' * 12)
print('1. 添加记录')
print('2. 查询记录')
print('3. 修改记录')
print('4. 删除记录')
print('5. 返回上级')
print('=' * 12)
mc2 = int(input('输入菜单号:'))
if mc2 == 1:
add_record()
elif mc2 == 2:
find_record()
elif mc2 == 3:
modify_record()
elif mc2 == 4:
delete_record()
elif mc2 == 5:
break
else:
print('输入的菜单号有误!')
while True:
print('=' * 10)
print('1. 登录')
print('2. 退出')
print('=' * 10)
mc1 = int(input('输入菜单号:'))
if mc1 == 1:
login()
elif mc1 == 2:
print('谢谢使用!')
break
else:
print('输入的菜单号有误!')
四、模块与包
(一)模块(Module)
- 模块是一种以.py为后缀的文件,在.py文件中定义了一些常量和函数。一般来说,这些常量和函数组合在一起能够满足某种特定的功能。
- 查看内置的math模块 - math.py
(二)包(Package)
- 包体现了模块的结构化管理思想,包由模块文件构成,将众多具有相关联功能的模块文件结构化组合形成包。
- 从编程开发的角度来看,两个开发人员A和B有可能把各自开发的不同模块文件取了相同的名称,比如PriceAnalysis模块。如果第三个开发人员导入PriceAnalysis模块,则无法确认导入的是哪一个PriceAnalysis模块。为此,开发人员A和B分别构造一个包,将模块放在包文件下面,通过“包.模块名”来指定模块。假设开发人员A创建一个stocks文件夹(包),将PriceAnalysis文件(模块)放入其中,开发人员B创建一个futures文件夹(包),将PriceAnalysis文件(模块)放入其中,这样就可以通过stocks.PriceAnalysis和futures.PriceAnalysis区分两个同名模块。不同包里可以存放同名模块。
- 一个包文件一般由
__init__.py
和其它.py文件构成。Python通过一个文件夹里是否有__init__.py
文件来识别此文件夹是否是包文件。__init__.py
文件可以为空,也可以写入一些包执行时的初始化代码。 - 包里不仅可以存放模块文件,还可以包含子包。比如,stocks包和futures包作为investment包的子包。这样PriceAnalysis模块就要指定两层包名:investment.stocks.PriceAnalysis和investment.futures.PriceAnalysis。
(三)案例演示
1、创建目录结构与相关文件
- 在D:\\python_work里创建202112目录,在里面再创建investment目录,然后在investment目录里再创建stocks目录,最后在stocks目录里创建一个初始化文件和两个模块文件,如下图所示:
(1)pmath.py
- 在pmath模块里定义了两个函数:findMax()和findMin()
(2)PriceAnalysis.py
2、设置当前目录,以便正确导入模块
- 通过View菜单调出Files面板
- 显示当前目录
- 导入价格分析模块 - PriceAnalysis,会报错 - 模块未找到错误(ModuleNotFoundError)
- 重新设置当前目录
3、导入价格分析模块,调用函数,查看结果
以上是关于Python编程基础12:函数和模块的主要内容,如果未能解决你的问题,请参考以下文章
Python全栈自动化系列之Python编程基础(模块和包)