函数基础
一.函数的参数
1. 位置参数和关键字参数 - (实参)
- 根据函数调用的时候实参的传递方式将实参分为位置参数和关键字参数
- 1)位置参数 -调用函数的时候直接在括号里面写多个实参,实参和形参是一一对应的。
- 2)关键字参数 -调用函数的时候以 形参名=实参 的形式来确定实参,
- 注意;位置参数和关键字参数可以一起使用,但是位置函数必须在关键字参数的前面。
不管以什么样的形式传参,最终都要保证每个参数都有值。
关键参数不能重复。
2 .参数默认值 - (形参)
- 在定义函数的时候,可以给形参赋默认值;如果一个形参有默认值,那么这个参数在调用的时候就可以不用传参。
- 如果定义函数的时候有的参数有默认值,有的参数没有默认值;没有默认值的参数放前面,有默认值的参数放后面。
3.不定长参数(参数个数不确定)
- 定义方法时,你可能不知道长度是多少,这时候,就可以使用。也是为了实现通用
- 1)定义函数的时候在一个参数前加*,那么这个参数就是一个不定长参数,可以同时接受多个实参。
注意:a.带 * 的参数本质就是一个元组
b.在调用的时候这个参数必须使用位置参数传参。 - 2)定义函数的时候在一个参数前加 ** ,那么这个参数就是一个不定长参数,可以同时接受多个实参。
注意:a.带** 的参数的本质是一个字典
b.在调用的时候这个参数必须使用关键字传参,(关键字随便命名) - 3)面试题:定义函数的时候经常看到函数的参数:*args,**kwargs,问题:这样写的意义和目的是什么?
- 答:两种不定长参数一起用,最终还是实现一个参数个数不定的函数;只是这个函数在调用的时候更加灵活,
既可以用位置参数传参也可以用关键字传参,还可以位置参数和关键字参数一起用。
4.参数类型说明(定义函数时)
- 赋一个默认值,或者加一个冒号 和类型名,说明参数的类型
def func7(a,b):
def func7(a: str, b=10):
print(a, b)
func7([1, 2], 100)
func7('abc', 'hu')
def func8(list1: list, str1=''):
pass
二.函数的返回值
1.什么是返回值
-
1)概念
返回值就是从函数内部传递到函数外部的数据;
返回值就是return关键字后面的表达式的值;
返回值就是函数调用表达式的值。 -
2)return关键字
-
return是只能在函数体中使用的关键字,作用有两个:
a. 确定函数的返回值(return后面是什么,函数的返回值就是什么)
b. 提前结束函数(只要遇到return,整个函数直接结束) -
注意: 如果在执行函数的时候没有遇到return, 那么函数的返回值是 None
-
3)函数调用表达式
-
调用函数的表达式就是函数调用表达式;当函数调用结束后,函数调用表达式的值就是函数的返回值。
2. 怎么确定函数是否需要返回值。
- 看实现函数的功能会不会产生新的数据,如果有就将这个新的数据作为返回值返回
- 注意:
a.用变量保存函数调用表达式的值,其实就是保存函数的返回值。
b.返回值对应的数据能做的事情,函数调用表达式都可以做。
3.函数调用过程(执行过程)(重要!!!)
第一步: 回到函数定义的位置
第二步: 传参(用实参给形参赋值;传参的时候必须保证每个参数都有)
第三步: 执行函数体
第四步:执行完函数体确定返回值
执行完函数体:a.执行到函数体的最后 b.遇到return
怎么确定返回值: 看函数执行完成的时候有没有遇到return,如果遇到了返回值就是return后面的值;
没有遇到return返回值是None
第五步:回到函数调用的位置接着往后执行(这个时候函数调用表达式的值就是函数的返回值)
4.多个返回值
- 函数的返回值永远都只有一个,如果要同时返回多个数据,就返回一个容器。
如果一个函数要同时返回多个,将多个数据作为一个元组中的元素返回
3.变量的作用域
- 变量的作用域指的是变量的使用范围,根据变量使用范围,我们将变量分为全局变量和局部变量两种:
1.全局变量和局部变量
-
1)全局变量
定义在函数和类的外部的变量就是全局变量。
作用域: 从定义开始到文件结束的任何位置都能使用。((在函数内也可以用,关键看定义的位置,是否是在函数和类的内部,定义在外部就是全局变量) -
2)局部变量
定义在函数中的变量就是局部变量
作用域: 从定义开始到函数结束的任何位置都能使用
2.global和nonlocal
-
global:用global可以在函数里面定一个全局变量。要先声明,
global声明的变量只能在声明以后使用,之前变量不能使用。只能在函数体中使用; -
nonlocal,局部的局部中修改局部变量的值的时候使用,(函数的函数中)只能在函数体中使用;
# 全局name
name = '小明'
age = 18
def show_message():
name = '小花' # 局部变量name
print(name)
# print(age) # 用global声明的变量只能在声明以后使用
global age
age = 20
print(age)
global sex
sex = 'boy'
show_message()
print(name)
print(age)
print(sex)
4.匿名函数(没什么用)
- 匿名函数的本质还是函数,除了定义的语法以外,其他的和普通函数没有区别。(只能实现一句话就完成的代码)
语法:
函数名(变量名)= lambda 参数列表:返回值
相当于:
def 函数名(参数列表):
return 返回值