目录

  • 前言
    • ●  Python解释器安装
    • ●  PyCharm开发环境
  • Python程序设计实验
    • ●  实验1 IDLE与代码编写规范
    • ●  实验2 输入输出与数据类型
    • ●  实验3 字符串处理
    • ●  实验4 数据运算
    • ●  实验5 列表与元组应用
    • ●  实验6 字典与集合应用
    • ●  实验7 if语句与match语句
    • ●  实验8 使用循环语句
    • ●  实验9 异常处理
    • ●  实验10 函数应用
    • ●  实验11 类的应用
    • ●  实验12 模块应用
    • ●  实验13  应用re模块
    • ●  实验14 文件处理
    • ●  实验15 用户界面设计
    • ●  实验18 SQLite数据库应用
    • ●  理论考试模拟试题A
    • ●  理论考试模拟试题B
    • ●  理论考试模拟试题C
    • ●  理论考试模拟试题D
  • 学习参考
    • ●  01 Python及其IDLE环境
    • ●  02 Python代码规范
    • ●  03 常量和变量
    • ●  04 输入输出
    • ●  05 运算符
    • ●  06 数值类型
    • ●  07 字符串
    • ●  08 列表
    • ●  09 元组
    • ●  10 字典
    • ●  11 集合
    • ●  12 条件语句
    • ●  13 循环语句
    • ●  14 异常处理
    • ●  15 自定义函数
    • ●  16 内置函数
    • ●  17 模块导入与定义
    • ●  18 math模块
    • ●  19 os模块
    • ●  20 time模块
    • ●  21 random模块
    • ●  22 文本文件
    • ●  23 二进制文件
    • ●  24 类的创建和使用
    • ●  25 类的继承与多态
 15 自定义函数

1、函数定义的格式:

def 函数名([参数]):

    函数文档字符串

    函数体

格式说明

(1)函数名可由英文字符、数字或下划线组成。数字不能作为第一个字符。

(2)函数名不能与python已有的关键字同名。

(3)可以没有参数,也可以有多个参数(参数间半角逗号分隔)。

(4)函数文档字符串可省略。用于指定执行help(函数名)时显示的函数说明。

(5)在函数体内可使用“return 表达式”语句返回函数值。

(6)未指定函数返回值时,返回值为None。

(7)函数体内的语句不能与def关键字左对齐,必须保持右缩进(默认4个空格)。

(8)当函数体比较简短时,也可以将函数体与def写在同一行。如:

    def getV(a,b):  return a+b


2、函数调用

函数定义后,即可在代码中调用,调用方法与使用内置函数相同。通过“函数名(参数)”形式调用。

对于上面定义的getV函数,下面的调用方法均可:

x=getV(16,2)

y=getV(12,3)+getV(81,9)

z=getV(b=3,a=15)      #通过参数名称传递参数时,参数顺序可以打乱。

***说明***

---定义函数时的参数称为形式参数,是变量。调用时的参数称为实际参数,可以是常量、变量或表达式。


3、参数的默认值

   定义函数时,形参可赋默认值。这类参数称为可选参数。调用函数时,如果不传递该参数值,则使用该默认值。如:

def fun(a,b=10)

      retrun a+b

则以下方法均可调用:

x=fun(3,2)

y=fun(3)


4、可变参数(参数个数不确定)

   用“*”标识参数,将未命名的传递参数打包成元组。如:

def fun(*a)

    s=0

    for x in a:

        s+=x

    return s

调用:a=fun(1,2,3)+fun(4,5)

***注意与元组为参数的区别:

def fun(a)

    s=0

    for x in a:

        s+=x

    return s

调用:a=fun( (1,2,3) )+fun( (4,5) )


5、关键字参数

   定义函数时,可用“**”标识,将传递的命名参数打包成字典。如:

def fun(**a)

    s=0

    for x in a:

        s+=a[x]

    retrun s

调用:a=fun(a=4,b=3,c=6)

***注意与字典为参数的区别:

def fun(a)

    s=0

    for x in a:

        s+=a[x]

    retrun s

调用:m=fun( dict(a=4,b=3,c=6) )

***说明***

---位置参数、可变参数、关键字参数可按序混合使用。

---混合使用格式:函数名(p,*a,**b)


6、传递参数时的解包

(1)传递参数时,可使用“*”标识元组,将其元素解包为传递的多个参数。如:

def fun6(a,b,c):

    return a+b+c

a=(1,2,3)

x=fun(*a)    # *a表示将元组的3个元素解包为3个参数

(2)传递参数时,可使用“**”标识字典,将其元素解包为多个参数。如:

def fun(a,b,c):

    return a+b+c

x=dict(a=1,b=2,c=3)

print(fun(**x))

***注意:字典键必须与参数个数及其名称相同。


7、lambda匿名函数

---lambda函数用于创建匿名函数。

(1)格式:

   lambda arg1,arg2,... : exp

   ---arg1,arg2,...为参数。个数可以是0,1,2,...

   ---匿名函数只是一个表达式,通常用于定义简单函数。

   ---exp是一个表达式,是函数的值(整个匿名函数表达式的值)。

示例:

x=lambda a,b : a+b

print( x(2,3),x(4,8) )        #输出:5 12

(2)创建方法

方法①:在表达式中创建。这时匿名函数只能调用一次。如:

x,y,z=1,2,8

a=z-(lambda u,v:u+v)(x,y)

“lambda u,v:u+v”的作用:创建一个匿名函数,它有2个参数u,v,返回值为2个参数的值的和。

“(lambda u,v:u+v) (x,y)”的作用:调用定义的匿名函数,传入的参数是x和y。

方法②:以赋值方式创建。如:

x=lambda a,b:a+b

print( x(2,3),x(4,8) )

这时匿名函数可多次调用,可将x理解为函数名称。


8、函数的递归调用

---定义函数时,函数体内调用函数本身,这个函数称为递归函数。如:

   def fun1(n):

       if n<2:

           return 1

       else:

       return n*f(n-1)

   调用:fun1(3)的返回值为6。

---递归函数应用说明

   ---必须有一个明确的结束条件(函数调用自身的总次数是有限的)

   ---递归调用次数不宜过多

   ---应尽量避免使用递归函数


9、函数体使用全局变量

默认情况下,函数体内使用的变量,其作用范围就是函数体。

函数体内使用全局变量有两种方式:

(1)不使用global关键字声明

使用限制:函数体内只能读取全局变量的值,不能修改全局变量的值。

注意:如果在函数体内没有读取全局变量的值,而是直接给全局变量赋值,那么,这个变量只是一个与全局变量同名的局部变量。如果在函数体内先读取了全局变量的值,再给它赋值,则会触发异常。

例如,下面代码是正确的:函数体内的变量a是局部变量,与全局变量a无联系。

a=10

def fun( ):

a=8

return a

但是,以下代码会触发异常:先读取了全局变量a的值,不能再为全局变量赋值。

a=10

def fun( ):

b=a+3

a+=2

return a+b

(2)使用global关键字声明

使用限制:函数体内可以读取、修改全局变量的值。在使用关键字global声明全局变量之前,不能再定义同名的局部变量。否则global声明语句会触发异常。