函数的主要作用: 打包代码
最大程度实现代码的重用减少冗余代码
将不同代码进行封装、分解从而降低结构复杂度,提高代码可读性
# 创建
def my_func():pass# 调用
my_func()
def my_func(name, times):for i in range(times):print(f"我喜欢{name}")my_func(name="python", times=5)
形式参数(形参)
实际参数(实参)
我们在传参的时候不仅可以这样
number = div(x=6, y=0)
还可以这样
number = div(6, 0)
那么可以混着用么?
# 这样是可以的
number = div(6, y=0)# 但这样不行
number = div(x=6, 0)
关键字参数必须在,位置参数后面
我们可以定义一个求圆面积的函数是这样的
def func(r,pai):print(2*pai*r)
我们都知道 pai
是3.1415926…
那么我们可以不可以让这个参数默认为 3.14
呢,如果需要要精细那么再让用户自己传入.
def func(r, pai=3.14):print(2 * pai * r)# 可以传
# func(3, 3.1415926)# 也可以不传
func(3)
有时候我们不知道用户要输入多少参数
例如:print
这时我们就需要使用到我们的收集参数
def func(*args):print(args, type(args)) # (1, 2, 3, 4) func(1, 2, 3, 4)
我们发现,传入这么多值其实用的元组的打包
性质
字典形式的收集参数
def func(**kwargs):print(kwargs) # {'a': 1, 'b': 2, 'c': 3}func(a=1, b=2, c=3)
收集参数就是 打包操作
那么我们 传入的时候还有一个变量解包操作
def func(a, b, c, d):print(a, b, c, d) # 1 2 3 4f = (1, 2, 3, 4)
g = {'a': 1, "c": 3, "b": 2, "d": 4}
func(*f)
func(**g)
例如:
我们需要使用 return
让我们的自定义函数实现返回
实现一个除法的函数
- 实现基本的除法
- 除数不能为0
def div(x, y):if y == 0:return "除数不能为0"else:return x / ynumber = div(x=6, y=1)print(number)
return后代码将不会在继续向下执行,这样代码就可以简化成
def div(x, y):if y == 0:return "除数不能为0"return x / ynumber = div(x=6, y=1)print(number)
在想想我们学过的三目运算,代码就可以简化成这样
def div(x, y):return x / y if y != 0 else "除数不能为0"number = div(x=6, y=0)print(number)
如果我们不写return 那么函数也会返回一个
None
变量或函数起作用的范围
全局变量
变量定义的位置不在任何函数中
a = 0 # 全局变量def func():print(a)func()
我们想修改全局变量时,可能不如我们所意
a = 0 # 全局变量def func1():a = 1 # 局部变量print(a) # 输出的是局部变量 1func1()
print(a) # 输出的是全局变量 0
我们可以使用 global
从而实现我们修改的目的
a = 0 # 全局变量def func1():global aa = 1print(a)func1()
print(a)
局部变量
def func1():b = 1 # 局部变量def func2():print(b) # NameError: name 'b' is not definedfunc1()
func2()
- 函数内的函数,无法在外部被调用
- 函数内定义的变量,可以使用
nonlocal
关键字进行修改
def func1(x):print(x)def func2():nonlocal xx = 5print(x)func2()print(x)func1(1)