python语法基础 - day9~10 函数
1、函数定义和调用
1)定义
函数是实现一个特定功能的代码的封装
2)语法
def 函数名(形参):
说明文档
代码块
3)调用
函数名(实参)
调用时:实参的个数要和形参一致(有默认值的情况除外)
# 练习1:定义一个函数,求n的阶乘(factorial = n! = n*(n-1)*(n-2)...*1# 函数的定义
def factorial(n):"""求n的阶乘:param n: 提供一个指定的数值n:return: None"""f = 1for x in range(1, n+1):f *= xprint(f)# 调用函数
factorial(10) # 3628800
2、函数的参数
函数参数是将外部数据(实参)传入函数内部的接口或通道
1)位置参数和关键字参数
a.位置参数
调用时,形如函数名(实参1, 实参2, 实参3, ...)
,这里的参数就是位置参数,位置参数实参与形参一一对应,位置不能随意更换
def func1(a, b, c):print(f'a:{a}, b:{b}, c:{c}')
func1(10, 20, 30) # a:10, b:20, c:30
b.关键字参数
调用时,形如函数名(形参1=实参1, 形参2=实参2, 形参2=实参3, ...)
,这里的参数就是关键字参数,参数的位置可以随意更换
def func1(a, b, c):print(f'a:{a}, b:{b}, c:{c}')
func1(c=10, a=20, b=30) # a:20, b:30, c:10
注意:
位置参数和关键字参数同时存在时,位置参数在前,关键字参数在后。只要保证位置参数在前,后面的关键字参数之间可以更换位置
def func1(a, b, c):print(f'a:{a}, b:{b}, c:{c}')
func1(10, c=20, b=30) # a:10, b:30, c:20
2)参数的默认值
参数默认值是在定义函数时给形参赋值,在调用函数时,有默认值的参数可以不用传值,有默认值的参数要在没有默认值参数的后面
def func1(a, b, c=100):print(f'a:{a}, b:{b}, c:{c}')
func1(10, 20) # a:10, b:30, c:20
3)定长和不定长参数
a.定长参数
参数的个数是确定的
def func1(*args):print(f'args的值:{args}, 类型:{type(args)}')
func1(10, 20, 30) # args的值:(10, 20, 30), 类型:<class 'tuple'>
b.不定长参数 - 带*、带**
带*
- 在形参前面加*
,让形参变成不定长参数,可以同时接受多个实参,这个参数的本质是一个元组,传递的每个实参都变成这个元组的元素 (必须使用位置参数)
def func1(*kwargs):print(f'args的值:{args}, 类型:{type(args)}')
func1(10, 20, 30) # args的值:(10, 20, 30), 类型:<class 'tuple'>
带**
- 在形参前面加**
,让形参变成不定长参数,可以同时接受多个实参,这个参数本质是一个字典**(只能使用关键字参数)**
def func1(**kwargs):print(f'kwargs的值:{kwargs}, 类型:{type(kwargs)}')
func1(a=10, b=20, c=30) # kwargs的值:{'a': 10, 'b': 20, 'c': 30}, 类型:<class 'dict'>
3、函数的返回值
1)什么是返回值
从函数内部传递到函数外部的数据
2)如何确定函数返回值
每个函数都有返回值,返回值是什么就看return
后面跟的是什么(没有return返回值就是默认值None)
return的作用:遇到return会确定返回数据并结束函数
3)怎么在函数外部获取返回值
函数调用表达式的值就是函数的返回值,所以获取函数调用表达式的值就是在获取函数的返回值
def func2(a, b):return a*bresult1 = func2(33, 79)
print(f'result1:{result1}') # result1:2607
注意:
函数只有一个返回值,形如return a, b, c
这种,返回值也只有一个,只不过这个返回值是一个容器/序列
def f(a, b):return a+b, a-b, a*b, a/bprint(f(33, 12)) # (45, 21, 396, 2.75)
4、全局变量和局部变量
1)全局变量
什么是全局变量:定义在函数和类外部的变量,
作用域:从定义开始到文件结束
2)局部变量
什么是局部变量:定义在函数内部的变量(形参也是局部变量)
作用域:从函数定义到函数结束
a = 'qja' # 全局变量a
b = 'qjb' # 全局变量b
def func3(b): # 局部变量ba = 'jba' # 局部变量aprint(f'函数内部:a:{a}, b:{b}') # 函数内部:a:jba, b:200func3(200)
# 局部变量不会改变全局变量的值,即没有重新赋值
print(f'函数外部:a:{a}, b:{b}') # 函数外部:a:qja, b:qjb
3)global和nonlocal
global
- 在函数内部定义全局变量,只能在函数内部使用,使用global定义的全局变量只能在global后面使用 - 可以对全局变量重新赋值
语法:
global 变量名
变量名 = 数据
a = 100
b = 100
def func4(c):global aa = 200return a+c, b+cprint('函数返回值:', func4(234)) # 函数返回值: (434, 334)
print('函数外部:', a, b) # 函数外部: 200 100
nonlocal
- 在局部的局部中去修改局部变量的值,使用nonlocal修改局部变量后该变量只能在nonlocal后面使用 - 可以对局部变量重新赋值
语法:
nonlocal 变量名
变量名 = 数据
def f1():a = 100def f2():nonlocal aa = 200print(f'函数里面的函数里面:{a}')f2()print(f'函数里面:{a}')f1()
# 函数里面的函数里面:200
# 函数里面:200
5、匿名函数
什么是匿名函数 - 实质上也是一个函数,只是在定义的时候不需要函数名(实参高阶函数中用的多些)
语法:lambda 形参列表: 返回值
使用条件:函数的功能可以用一句代码写完
**注意:**你们函数形参列表中不能使用:
,因为:
在匿名函数中本身就有特殊功能
a = lambda x, y: x+y
print(a(30, 55)) # 85# 定义一个函数,求两个数中较大的数
max_num = lambda a, b=100: a if a > b else b# 有默认值的参数可以不用赋值
print(f'较大值是:{max_num(58)}') # 较大值是:100
# 赋值后参数默认值改变
print(f'较大值是:{max_num(58, 29)}') # 较大值是:58
6、实参高阶函数
定义一个函数其实就是定义一个function类型的变量,函数名就是变量名
什么是实参高阶函数