函数
- 创建函数
- 函数的定义 使用def语句来定义函数
主要作用 就是打包代码
格式:
def functionname函数名([parameterlist形式参数]):
["""comments"""可选参数]
[functionbody函数体]
Pass 空语句 做占位符使用
def yyqx():
pass
Return 在执行return语句之后直接返回return语句的内容
不会再理会语句后面的内容
def chufa(a,b):
if b == 0:
return "除数不能为0!请重新输入!"
else:
return a / b
返回函数时只需要写函数名即可 不需要小括号
函数只有在定义和调用时需要小括号
如果一个函数没有通过return语句显示返回的内容 它也会再自己运行函数体中的内容后 悄悄的返回一个none值
def yyqx():
pass
print(yyqx())
返回多个值 return 值1,值2,值3 —— (值1,值2,值3)
Python利用元组进行打包 同样可进行解包
def yyqx():
return 1,2,8
a,b,c = yyqx()
print(a,b,c)
- 函数的参数
实参是按照形参传入的顺序进行传递
如果同时使用位置参数和关键字参数 位置参数必须在关键字参数之前/在这之间也不行
- 位置参数
位置固定的参数称为固定参数
只需要按照顺序传递正确的参数就可以了
- 关键字参数
只需要参数的名字就好了(对于参数特别多的参数比较友好)
- 默认参数
允许函数在定义的时候就指定默认的值 在函数调用时
没有传入实参 就用默认的值代替
如果传入实参 则自动进行覆盖
def yyqx(a,b,c):
return"".join((c,b,a))
yyqx(b=1,c=2,a=3)
- 冷门小知识
(1)/ 斜杠左测必须传递位置参数 禁止使用关键字参数
右侧不指定 可任意写入
def yyqx(a,/,b,c):
print(a,b,c)
yyqx(1,b=2,3)
(2)* *右侧必须传递关键字参数 禁止使用位置参数
左侧不指定 可任意写入
def yyqx(a,b,*,c,d)
print(a,b,c,d)
yyqx(a=1,2,c=3,d=4)
- 函数的好处
- 可以最大程度地实现代码重用,减少冗余的代码。
- 可以将不同功能的代码段进行封装、分解,从而降低结构的复杂度,提高代码的可读性。
- 收集参数
可任意传入多个参数
定义方式 定义形参前面加个* *形参
通过*对多个元素进行打包为元组(一个*)
或者字典(两个连续的*) 必须使用关键字传递 自动转换为键值对
def yyqx(a,*b,**c):
print(a,b,c)
yyqx(1,2,3,4,x=5,y=6)
如果在收集参数后面还需要输入其他参数 就需要用关键字参数进行传递 不然将会纳入收集参数中
也同时使用两种方法
- 解包参数
*/** 不仅在函数定义的时候可以使用 在函数调用时同样有特殊作用
在形参上使用称为参数的打包 在实参上使用称为参数的解包
**对应关键字参数
qzh = (1,2,3,4)
def yyqx(a,b,c,d):
print(a,b,c,d)
yyqx(*qzh)
- 作用域
指一个变量可以被访问的范围 通常 一个变量的作用域 总是由他在代码中被赋值的位置来确定的
- 局部作用域
变量的定义(局部变量)在函数里面 则作用域仅限函数里面
- 全局作用域
在任意函数的外部去定义一个变量(全局变量) 则他的作用域是全局的
如果一个变量在函数内部、外部均有定义,那么在函数外部返回的就是外部定义的值,如果调用函数,则返回的就是函数内部的值
- global语句
作用:声明此变量为全局变量。
用法:global 变量名
x = 2001
def yyqx():
global x
x = 1128
print(x)
yyqx()
- 嵌套函数
想调用函数 只能通过调用外部函数来调用
内部函数可以访问外部函数的变量却无法修改
嵌套函数的变量 尽管函数已经被调用完 外层函数的变量会保存下来
不会像局部变量那样调用完就消失了
def yyqx():
x = 2001
def lsf():
x = 1128
print("lsf x=",x)
lsf()
print("yyqx x=",x)
yyqx()
- nonlocal语句
内部函数修改外部函数的变量
def yyqx():
x = 2001
def lsf():
nonlocal x
x = 1128
print("lsf x=",x)
lsf()
print("yyqx x=",x)
yyqx()
- LEGB规则
字母越前等级越高
(1)字母含义:
L-Local(function) 函数内的名字空间
E-Enclosing function locals 外部嵌套函数的名字空间
G-Global(module) 函数定义所在模块的名字空间
B-Builtin(Python) Python内置模块的名字空间
(2)变量名定义
在命名变量名时注意不要取和内置函数一样的名字 存在同名函数
定义变量会自动覆盖掉内置函数
1.闭包
工厂函数 能生产函数的函数
Return funB即对funB的一个引用 加上括号即对函数的调用
def yyqx():
x = 1128
def lsf():
print(x)
return lsf
qx = yyqx()
qx()
实现闭包必须要用到嵌套函数
在本质上,闭包就是将函数内部和函数外部连接起来的桥梁
对于嵌套函数来说,外层函数的作用域是会通过某种形式保存下来的,内层函数可以在外层函数调用周期结束后,仍旧能访问到外层函数的变量(及参数)。
- lambda函数
- 函数介绍
在使用函数时不需要给函数分配一个名称 该函数就是“匿名函数 在python中使用lambda表达式表示匿名函数
- 函数语法
lambda 参数列表:lambda体
参数列表 类似函数中的形参 不同参数之间逗号隔开
可参考函数的参数那里对形参的讲解
lambda体 表达式的主要代码在此处编写 类似于函数体
不能是一个代码块,不能包含多条语句,只能包含一条语句
返回的lambda体运算式运算结果
与函数不同的是 不需要使用return语句返回
注意:参数列表可有可无,可以接收任意数量的参数,但只能返回一个值
- lambda函数与def函数的异同点
a.lambda可以立即传递(无需变量),自行返回结果b.lambda在内部只能包含一行代码
c.lambda是一个为编写简单函数而设计的,而def用来处理更大的任务
d.lambda可以定义一个匿名函数,而def定义的函数必须有一个名字
e. 参数都是可选,也都会返回对象,用法基本一致
f. lambda是一个表达式而非语句,两者应用范围有不同
- lambda函数优势:
a.对于单行函数且只有一个返回值,使用lambda表达式可以省去定义函数的过程,让代码更加简洁
b.对于不需要多次复用的函数,用lambda表达式可以在用完后立即释放,提高程序执行的性能。
c. lambda函数可以作为参数传递给其他函数也可 作为函数返回