1.概述
本节主要讲一下Python中的函数与模块,python之所以闻名于此,一个点便在于此它有大量并且丰富第三方库,
库说到底其实也是一个人为编写的函数所构成的文件包。
2.python函数定义
函数是程序中的一个重要部分, Python系统中已经定义了一些系统函数,但是我们也可以通过函数的用法来自定义属于自己的函数。
函数定义
def 函数名称(参数1,参数2,......):
函数体
函数名称是用户自己定义的,函数中的参数可以有多个,他们每一个都有自己的名称,函数体是函数的具体代码。
函数可以拥有返回值也可以没有返回值,在函数中用return返回值
如下:
def output():
print('hello world')
output()
其结果是:
hello world
寻找最大值案例如下:
# 寻找最大值
def max(a,b):
c = a
if c < b:
c = b
return c
print(max(5,7))
print(max(6,3))
其结果是:
7
6
3.函数的默认参数
在Python程序中,我们写函数时可以事先规定参数的默认值,如果实际调用时没有传入参数的值,就使用默认值。
如果实际调用时没有提供这个参数的实际值,就使用默认的参数值。
函数的参数在调用时,参数可以按名称指定,不得出现重复值,不过在调用时键值参数一定要在位置参数的后面。
同时在定义函数时,默认参数必须在函数中一般位置参数后面。
默认参数的案例:
def fun(a,b=2,c=5):
print(a,b,c)
fun(0,1,2)
fun(0)
fun(0,3)
print('----------')
fun(0,c=4,b=7)
# fun(c=4,b=7) # 这个是错误的
# fun(b=4,o) # 这个是错误的
# fun(a=0,2,c=4) # 这个是错误的
print('----------')
# 以下函数定义是错的
# def fun(a=2,b,c=9):
# print(a,b,c)
其结果是:
0 1 2
0 2 5
0 3 5
----------
0 7 4
----------
4.函数的变量类型
我们可以看到在主程序中包括了函数,主程序中有自己的变量,函数也有自己的变量,那么变量与变量之间的关系又是什么呢?
在Python中将变量分为全局变量与局部变量:
局部变量:在函数内部使用,其影响及作用域仅限于函数内,在函数外使用局部变量是非法的。
全局变量:全局变量的作用域是整个程序,是相对于函数的外部定义。
但局部变量也可以通过'global 变量'内部声明将其变为全局变量,这样子函数内部的变量的变化也会影响到整个程序的全局变量。
有时灵活利用全局与局部变量,可以让我们编写程序变得更加方便。
全局变量与局部变量的案例:
def fun1():
global counter
for i in range(3,8):
counter +=i
print(counter)
def fun2():
global counter
for i in range(9,15):
counter +=i
print(counter)
def fun3(counter):
for i in range(9,15):
counter +=i
print(counter)
def fun4(counter):
for i in range(9,15):
counter +=i
print(counter)
# 全局变量
# 内部变量的变化也会影响到外部变量的变化
counter = 0
fun1()
print(counter)
fun2()
print(counter)
print('----------')
# 局部变量
# 函数内部变量的变化对外部的变量并无实际影响
counter = 0
fun3(counter)
print(counter)
fun4(counter)
print(counter)
其结果是:
25
25
94
94
----------
69
0
69
0
5.函数的调用
在Python中,函数在定义上是平行的,函数之间允许相互调用,我们要做的就是把握主函数与被调用函数的关系,掌握参数传递的规则。
函数的调用有一种特殊形式,就是嵌套调用,是一个函数调用另一个函数,被调用函数又进一步调用另外一个函数,形成一层层地嵌套关系,
一个复杂的程序存在多层的函数调用。
函数的嵌套调用:
def fun(x):
x = x*x
print(x)
return x
def sum(i):
s = 0
for j in range(i+1):
s = s + j
print(s)
return s
def fun2(n):
y = sum(fun(n))
print(y)
# 将传入的值扩大两倍,然后计算从0-n的累计和
fun2(4)
其结果是:
16
136
136
6.函数的异常
在程序设计中,我们应该考虑各个方面的因素,设计好程序的异常处理,使程序自行处理异常,让程序的运行更加健壮.
Python程序的异常处理主张:谁捕捉谁报错,报错会在程序中进行传递,如果没有捕捉到最后程序会中断程序进行报错。
捕捉异常情况一:
# 函数的异常扑捉
def fun():
print('start')
m = 10/0
print('end')
try:
fun()
except Exception as err:
print(err)
其结果是:
start
division by zero
捕捉异常情况二:
# 函数异常的传递
def fun1():
print('start1')
m = 10/0
print('end1')
def fun2():
print('start2')
fun1()
print('end2')
try:
fun2()
print('main')
except Exception as err:
print(err)
print('finish')
其结果是:
start2
start1
division by zero
finish
捕捉异常情况三:
def fun1():
print('start1')
m = 10/0
print('end1')
def fun2():
print('start2')
try:
fun1()
except Exception as err:
print(err)
print('end2')
try:
fun2()
print('main')
except Exception as err:
print(err)
print('finish')
其结果是:
start2
start1
division by zero
end2
main
finish
抛出自己想要的异常:
# 主动抛出异常
def fun1():
print('start1')
m = 10/0
print('end1')
def fun2():
print('start2')
try:
fun1()
except Exception as err:
raise Exception('10/0 is false')
print(err)
print('end2')
try:
fun2()
print('main')
except Exception as err:
print(err)
print('finish')
其结果是:
start2
start1
10/0 is false
finish
7.python模块
模块是一个保存了Python代码的文件,模块能定义函数,类和变量。我们可以通过编写属于自己的模块,来加深对于第三方库的理解。
引用的模块要放在与引用程序相同的目录下,或者放在python能找到的目录下.
python模块一般放在安装目录的lib文件夹中。
引用模块的函数时,写模块名称名称与函数名称用'.'连接。model.max
设计一个模块:
# 设计一个程序模块,它包括两个函数:计算最大值和最小值
# 可以将它保存到通常使用的Python文件的同目录下,c:\model
def max(a,b):
c = a
if c < b:
c = b
return c
def min(a,b):
c = a
if c > b:
c = b
return c
print(max(1,5))
print(min(1,5))
其结果是:
5
1
# 可以通过以下两种方式调用相应的函数
import model
print(model.max(1,5),model.min(1,5))
from model import max,min
print(max(1,5),min(1,5))
其结果是:
5 1
查看可以存放模块的目录
# python中能存放模块的目录可以通过sys.path得到,python模块可以放在sys.path包含的任何一个目录中,
import sys
print(sys.path)
for i in sys.path:
print(i)
其结果是:
['C:\\Users\\lenovo', 'C:\\Users\\lenovo\\anaconda3\\python39.zip', 'C:\\Users\\lenovo\\anaconda3\\DLLs', 'C:\\Users\\lenovo\\anaconda3\\lib', 'C:\\Users\\lenovo\\anaconda3', '', 'C:\\Users\\lenovo\\anaconda3\\lib\\site-packages', 'C:\\Users\\lenovo\\anaconda3\\lib\\site-packages\\locket-0.2.1-py3.9.egg', 'C:\\Users\\lenovo\\anaconda3\\lib\\site-packages\\win32', 'C:\\Users\\lenovo\\anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\Users\\lenovo\\anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\Users\\lenovo\\anaconda3\\lib\\site-packages\\IPython\\extensions', 'C:\\Users\\lenovo\\.ipython']
C:\Users\lenovo
C:\Users\lenovo\anaconda3\python39.zip
C:\Users\lenovo\anaconda3\DLLs
C:\Users\lenovo\anaconda3\lib
C:\Users\lenovo\anaconda3
C:\Users\lenovo\anaconda3\lib\site-packages
C:\Users\lenovo\anaconda3\lib\site-packages\locket-0.2.1-py3.9.egg
C:\Users\lenovo\anaconda3\lib\site-packages\win32
C:\Users\lenovo\anaconda3\lib\site-packages\win32\lib
C:\Users\lenovo\anaconda3\lib\site-packages\Pythonwin
C:\Users\lenovo\anaconda3\lib\site-packages\IPython\extensions
C:\Users\lenovo\.ipython