一、函数定义和调用
1. 函数的定义
1)定义函数关键字:def
2)作用:方便好用、复用性高
语法:
def 函数名():
#函数内部代码
2. 函数的调用:函数名()
二、函数的返回值:return
1. return的作用:
- 返回值数目=0:返回None
- 返回值数目=1:返回object
- 返回值数目>1:返回tuple
2 应用场景:
当需要返回结果的时候就用return,不需要返回的时候就不用
注意点:
· return是用来给函数返回结果的
· 当函数执行到return是函数执行结果
· 函数若没有定义return,默认返回None
三、函数参数
- 参数的定义:函数名后面的括号中定义参数
- 参数传递有两种形式:
1 位置传参:按位置进行传参
2 关键字传参:按关键字进行传参
注意:混合方式传参时:关键字传参写在位置传参之后
-
形参:
定义时小括号中的参数,用来接收实参用的,称为“形参”
-
实参:
调用时小括号中的参数,用来传递给形参用的,称为“实参”
-
形参的定义有三种形式
1)必备参数
· 调用函数的时候必须要传的参数,即调用参数时的数量和定义函数时声明的数量一致,而且传入的位置和定义的位置顺序一致。
2)默认参数(缺省参数)
调用函数时,默认参数的值如果没有传入,则是默认值,否则使用传入的参数;
带有默认值的参数一定要位于参数列表的最后面
3)不定长参数
声明时不会命名,能处理比当初声明时更多的参数
*args:
打印出来是个元组,用来接收未被其他参数接收的所有未命名的位置参数。
例如:
def func(*args, **kwargs):
print(args)
print(kwargs)
func(11, 22, 33)
运行结果:
(11, 22, 33)
{}
**kwargs:
打印出来是个字典,用来接收未被其他参数接收的所有命名的关键字参数,即key=value
键值对保存在里面,我们可以通过for
循环把kwargs
里面的键值对遍历出来。
例如:
def func(*args, **kwargs):
print(args)
print(kwargs)
func(11, 22, 33, a=100, b=200)
运行结果:
(11, 22, 33)
{'a': 100, 'b': 200}
注意:
- 调用的时候传参尽量统一风格(要么都通过位置传参,要么都使用关键字传参)
- 位置传参无法跳过默认参数,关键字传参可以跳过默认参数
- 超出的位置参数放在
*args
(元组)中 - 超出的关键字参数放在
*kwargs
(字典)中 - 拆包
列表拆包:在列表前加一个 * 号。
元组拆包:在元组前加一个 * 号。
同理可以对字典、字符串、序列类型等进行拆包
例如:
def func(*args, **kwargs):
print(args)
print(**kwargs)
data = (11, 22, 33)
# 未拆包
func(data)
# 拆包(通过*对元组拆包,只有在调用函数的时候可以用)
func(*data)
注意:两个*不能对字典拆包
四、函数的作用域
1. 全局变量:
在函数外部定义的变量,不论是函数外部还是内部都可以访问。
例如(在函数内部访问外部定义的变量):
a = 100
def func():
print(a)
func()
运行结果:
100
2. 局部变量
在函数内部定义的变量,只能在函数内部使用,在函数外部无法调用。
例如:(在函数内部访问内部定义的变量):
def func():
b = 100
print(b)
func()
运行结果:
100
例如(在函数外部调用内部定义的变量):
def func():
b = 100
func()
print(b)
运行结果:
Traceback (most recent call last):
File "E:/PycharmProjects/py_01/py01_07test/02test.py", line 16, in <module>
print(b)
NameError: name 'b' is not defined
注意点:
· 不同的函数,可以定义相同名字的局部变量,但是各用各的不会产生影响。
· 局部变量的作用:为了临时保存数据需要在函数中定义变量来进行存储。
3. global
在函数内部可以用global声明全局变量
例如:
def func():
global b # 在函数内部声明全局变量
b = 99
func()
print(b)
运行结果:
99
注意点:
- 使用global关键字修饰的变量不用提前定义
- 在函数内部变量定义前,引用变量会提示错误,局部变量错误:在定义前引用的局部变量;因为变量的查找是由内向外查找的,先找自身的作用域中有没有,若没有才会去外面的作用域中去查找
- 局部变量和全局变量的变量名最好不要相同,如果非要一样,那么要把局部变量的定义放在该函数的最前面
a = 100
def func():
print(a)
a = 200
func()
print(a)
运行结果:
Traceback (most recent call last):
File "E:/PycharmProjects/py_test/py_test/test.py", line 19, in <module>
func()
File "E:/PycharmProjects/py_test/py_test/test.py", line 14, in func
print(a)
UnboundLocalError: local variable 'a' referenced before assignment
扩展:
使用nonlocal
声明外部函数的局部变量,可以在嵌套函数内部修改外部函数的局部变量