函数简介
函数是什么?
函数本质上是特殊功能的封装:在程序开发的过程中,有些功能需要重复使用,我们会将这些功能进行封装,在需要使用的时候,调用即可,这段封装的代码,我们称他为函数。
函数的优点
a.简化代码结构,提高应用的效率
b.提高代码复用性
c.提高代码的可读性和可维护性
建议:但凡涉及到功能,都尽量使用函数实现
函数定义
定义一个函数:
语法:
def 函数名(参数列表):
函数体
return 表达式
def代表函数的开始
函数名:遵循标识符的命名规则
参数列表:传入函数的参数,参数与参数之间使用逗号隔开。
函数体:这个函数要实现的功能
return:函数结束之后,返回值,返回值可以是变量、常量也可以是表达式
return可不写,默认为None.
函数的使用
定义函数后,函数的调用:通过 函数名(参数列表) 调用
定义好函数后,函数不会自动执行函数体
调用函数的参数列表和定义函数的参数列表保持一致(关键字参数可以解决这个局限)
一个函数可以被重复多次调用
同一个py文件中出现多个同名函数,调用的是最后一个,类似于变量赋值的覆盖
函数调用前需要先定义,否则会报错NameError
函数的调用顺序
在函数中调用其他函数,不需要定义在前,调用在后;而实际的函数调用执行操作,就一定要先定义后调用。
举例:
def test1():
print("aaaa")
test2()
print("over")
def test2():
print("bbbb")
test3()
test4()
def test3():
print("cccc")
def test4():
print("dddd")
test1()
#注意:函数在调用的过程中,相互之间的关系,以及代码执行的先后顺序
函数的参数
形式参数:在函数的声明部分,本质就是一个变量,用于接收实际参数的值 【形参】
实际参数:在函数调用部分,实际参与运算的值,用于给形式参数赋值 【实参】
传参:实际参数给形式参数赋值的过程,形式参数 = 实际参数
格式:参数1,参数2.....参数可以有多个
形参与实参的关系:
1.实参和形参重名对函数实现没有影响
2.进行传参之后,实际参与运算的是形参,对实参没有影响【将形参可以理解为实参的替代品】
3.本质原因:形参和实参在内存中开辟的空间不同
4.不可变对象传递的是值: 数字,字符串,元组为不可变对象
值传递和引用传递【面试题】
值传递:传参的过程中传递的是值,一般指的是不可变的数据类型,number,tuple,string\
引用传递:传参的过程中传递的是引用,一般指的是可变的数据类型,list,dict,set
引用传递本质上传递的地址.可变对象传递的是地址:列表,字典,集合set
参数类型
- 必须参数:如果形参没有任何限制,则默认为必需参数,调用函数的时候则必需传参,顺序一致,数量一致
- 关键字参数:使用关键字参数允许函数调用的时候实参的顺序和形参的顺序可以不一致,可以使用关键字进行自动的匹配
- 默认参数:调用函数的时候,如果没有传递参数,则会使用默认参数
- 不定长参数:可以处理比当初声明时候更多的参数 * **
- *被当做tuple处理,变量名其实就是一个元组名
-
被当做字典处理,变量名就相当于字典名
使用的时候,实参就必须按照key=value的方式进行传参
思考:自定义一个函数 是否需要设置参数=>是否有未知项参与运算,是否需要设置返回值=>是否需要在函数外面使用函数运算之后的结果
函数变量的作用域
- 定义:变量的作用域就是指的是变量的可使用范围。
- 分类:
局部作用域:L【Local】
函数作用域:E【Enclosing】 将变量定义在闭包外的函数中
全局作用域:G【Global】
內建作用域:B【Built-in】 - 查找顺序:
查找的顺序:L----》E------>G------>B【极端情况:当所有的变量同名的情况下】【面试题】
代码演示:
#变量的查找规则
#注意:全局作用域和内置作用域,当重名的时候,谁出现在后面,则先匹配到谁
x = 0
x1 = int(3.3)
def outer1():
j = 1
def inner1():
i = 2
#【就近原则】
print(x)
return inner1
f1 = outer1()
f1()
- 全局变量与局部变量
全局变量:将变量定义在函数的外面
局部变量:将变量定义在函数的内部
注意:局部变量只能在其被声明的当前函数中使用,而全局变量可以在整个程序中使用 - 关键字:global和nonlocal关键字的使用
使用场景:当内部作用域【局部作用域,函数作用域】想要修改全局变量的作用域的时候
global >函数内部:局部变量前添加 global 如global num
nonlocal>前提:nonlocal关键字是定义在闭包中,使用nonlocal关键字进行声明,相当于将局部作用域范围扩大了,变为函数作用域
网友评论