python2
函数
函数的特征
函数的定义必须使用def关键字
函数的命名规则
不能是用特殊字符,除 _
严格区分带大小写
避免使用关键字
函数的定义
def 函数名():
函数中的功能代码
调用函数:函数名()
具有参数的函数结构
def 函数名( 参数名, 参数名 。。 ):
函数中的代码
h函数的代码
调用函数:函数名(值, 值)
声明函数中的参数称之为形参 , 形参表示形式上的参数
调用函数中的参数称之为实参 , 实参表示真实的值
具有默认值参数的函数
def 函数名(形参名 = 默认值 ,形参名 = 默认值。。。 ):
函数中的代码
调用函数1: 函数名()
调用函数2: 函数名( 实参 , 实参。。)
注意
具有默认值的函数,调用时如果不提供实参,则会使用形参的默认值执行,如果提供了实参,则使用实参而忽略默认值
函数的返回值
函数更具执行之后是否可以德奥值可以将函数分为两类:
执行过程函数
函数执行完毕, 什么也得不到的函数称之为执行过程函数
具有返回值的函数
函数执行完毕之后可以得到一个值的函数称之为具有返回值的函数
return语句的使用
1.如果函数执行完毕需要的到一个结果作为反馈,需要添加return语句
2.return语句可以为当前函数返回一个结果
3.一旦程序运行了return语句,那么函数结构机会结束。
4.return一般只能返回一个值,如果需要返回多个数据可以将其组成序列类型,在返回即可
格式
def 函数名():
函数中的代码
函数中的代码
return语句
函数文档
函数文档的作用是对当前函数提供使用相关的参考信息
查看函数文档:
1.使用help()查看文档信息
使用函数名.__doc__的方式查看,
自定义函数文档
"""
在函数内部开始的第一行使用字符串定义文字内容即可
def 函数名():
'此处书写函数文档信息,单引号中使用\n换行'
函数中的其他代码...
函数中的其他代码...
或者
def 函数名():
'''
此处书写函数文档信息
此处书写函数文档信息
...
函数中的其他代码...
函数中的其他代码...
"""
lambda表达式
lambda表达式就是一种简洁格式的函数而已。lambda不是一种函数结构,只是一种表达式而且不需要函数名。(匿名函数)
'''
格式:
变量 = lambda 形参,形参...: 功能代码
案例:
lambda x,y :x*y 传入两个参数返回这两个数的乘积、
lambda x: 值1 if 条件表达式 else 值2 根据条件表达式的真假返回值1还是值2
优点:
1.lambda表达式书写简单,不用def关键字,可惜要用lambda
2.lambda表达式不需要函数名,省得命名头疼
3.看起来比较装逼!
缺点:
1.lambda表达式功能受限,无法使用循环以及部分流程控制相关语句
2.lambda表达式不适合较为复杂的程序。
'''
关键字参数
'''
def 函数名(形参名 = 默认值,形参名 = 默认值...):
函数中的代码(python语句)
函数中的代码(python语句)
调用函数:
函数名(形参名 = 实参值,形参名 = 实参值...)
优点:由于实参和形参传递是按照位置一一对应的关系,
当参数太多时容易出现参数传错位置的情况 引入关键字参数后,在设置实参时可以指定形参的名称,避免参数传递错误!
'''
收集参数
'''
1.收集参数1 (专用于收集非关键字参数)
def 函数名(*形参名):
函数中的代码(python语句)
函数中的代码(python语句)
...
调用函数: 函数名(实参,实参....)
**注意**:
1.使用收集参数进行形参的书写,需要在形参名之前添加*
2.*形参格式的收集参数会收集到调用函数时传入的所有没有关键字的形参
3.收集参数收集到的最终数据是由所有非关键字实参组成的元组。
4.收集参数和普通的参数(关键字参数)可以共存
2.收集参数2 (专门用于收集关键字参数)
def 函数名(**args):
函数中的代码(python语句)
函数中的代码(python语句)
...
调用函数:函数名(形参名 = 值,形参名=值...)
**注意**
1.使用收集参数收集关键字实参的方法需要在形参名之前加**
2.**形参格式会收集调用函数时传入函数的所有关键字参数
3.收集的所有关键字参数最终组成的数据为字典类型
4.关键字参数收集的方式可以和普通形参共存,但是必须在最后
'''
注意1:普通参数,非关键字手机形参和关键字手机形参具有顺序关系
普通参数在最前面
非关键字放中间
关键字形参放最后
注意2:所有手机参数只能够手机没有形参接受的实参
函数变量的作用域
变量分为两个大类
全局变量
在函数外部声明的变量就是全局变量
局部变量
在函数内部声明的变量就是局部变量
局部变量和局部变量
1.全局变量在全局范围内可以使用
2.全局变量在局部范围内可以使用(访问)
3.局部变量在局部范围内可以使用
局部变量在全局范围内无法正常使用
global关键字
作用可以提升局部变量维全局变量
'''
使用global关键字即可提升局部变量为全局变量
def 函数名()
提升局部变量为全局变量
global 局部变量
其他操作...
'''
全局变量和局部变量同名是
局部环境中只会使用局部变量,忽略同名的全局变量
内部函数
在函数内部声明的函数就是内部函数,
特征
内部函数在函数内部可以访问
内部函数的调用必须在定义内部函数之后
内部函数不可以在函数外部调用
本质上内部函数等同于内部变量
闭包 (少用 或者 不用)
'''
闭包格式:
def 外层函数():
局部变量
局部变量
...
def 内部函数():
pass
def 内部函数():
pass
return (局部变量,局部变量...内部函数,内部函数...)
'''
nonlocal关键字
nonlocal的作用是声明当前变量不是当前函数内部的变量,他有可能是当前函数的外部变量(不是全局变量)
'''
def 外部函数()
局部变量
def 内部函数():
nonlocal 变量名声明当前变量不是内部函数中的变量
其他代码...
return 代码
'''
递归函数
在函数中调用当前函数本省的函数就是递归函数
'''
定义递归函数
def recursion(n):
输出当前的n的值
print(n)
判断n的值是否>0,决定下一步操作
if n>0: n>0 在此调用当前函数digui,将n - 1放进去
recursion(n-1)
else:
n>0 为False 输出分隔线
print('------')
再次输出n的值
print(n)
调用递归函数
recursion(3)
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,栈的特点是先进后出,
每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,
所以,递归调用的次数过多,会导致栈溢出。
解决递归调用栈溢出的方法是通过定义递归的出口,就是在条件不满足的时候我们就不再调用自身来递归了,
上面的递归在n不大于0的时候就不会再接着递归自身了,这样就不会一直递归下去直到递归溢出了
'''