可变长参数
-
形参名(*)表示调用函数时,有多少个位置实参,我就接收多少个参数
-
形参名(**)用字典接收多余的关键字实参
(*实参)(#lt)把列表中的元素打散成位置实参依次传给位置形参
def f1(a, b, c, e, d, f, g):
print(a, b, c, e, d, f, g)
lt = [1, 2, 3, 4, 5, 6, 7]
f1(*lt)
(**实参) 参数把字典打散成关键字实参然后传给函数f1
def f1(z, b):
print(z, b)
dic = {'z': 1, 'b': 2} # a=1,b=2
f1(**dic) # **dic把字典打散成关键字实参然后传给函数f1
函数对象
python中一切皆对象函数
- 引用
- 容器元素
- 作为函数的实参
- 作为函数的返回值
- 字典/列表/元组/集合/布尔值
函数对象 == 函数名
函数对象的应用
比如定义一个注册函数
def register()
pass
函数嵌套
就是函数里面有函数
def f1()
print('from f1')
def f2()
print('from f2')
res = f1()
函数内部定义的函数,外部不能使用
名称空间和作用域
名称空间:专门存储名称的
内置名称空间:存储了内置方法的名称
数据类型自带的内置方法:python解释器自带的内置方法(print/len/str)
-
全局名称空间:除了内置和局部都叫全局
-
局部名称空间:函数内定义的都叫局部
名称空间的执行(生成)顺序:内置--》全局--》局部
搜索顺序:先从当前的位置,找不到按照这种顺序,不会逆着方向找 局部 --》全局--》内置——》报错
全局作用域:内置名称空间+全局名称空间——》全局作用域
-
局部作用域:全局作用域和局部作用域没有关系
-
局部作用域:局部作用域和局部作用域没有关系
-
global:打破了全局作用域,让代码下面的局部x变成全局的x
-
nonlocal:打破了局部作用域,让x成为顶层的局部,不让他成为全局
打印99乘法表
for i in range(1,10):
for j in range(i):
print(f'{j+1}*{i} = {(i)*(j+1)}',end = ' ')
print()
运行结果:
1*1 = 1
1*2 = 2 2*2 = 4
1*3 = 3 2*3 = 6 3*3 = 9
1*4 = 4 2*4 = 8 3*4 = 12 4*4 = 16
1*5 = 5 2*5 = 10 3*5 = 15 4*5 = 20 5*5 = 25
1*6 = 6 2*6 = 12 3*6 = 18 4*6 = 24 5*6 = 30 6*6 = 36
1*7 = 7 2*7 = 14 3*7 = 21 4*7 = 28 5*7 = 35 6*7 = 42 7*7 = 49
1*8 = 8 2*8 = 16 3*8 = 24 4*8 = 32 5*8 = 40 6*8 = 48 7*8 = 56 8*8 = 64
1*9 = 9 2*9 = 18 3*9 = 27 4*9 = 36 5*9 = 45 6*9 = 54 7*9 = 63 8*9 = 72 9*9 = 81
上节课回顾
- 函数的定义
函数定义阶段只检测语法,不执行代码
- 函数的三种定义方式
- 空函数
- 无参函数
- 有参函数
- 函数的返回值
- return可以返回值,默认返回None,return后面不加东西也返回None
- return可以终止函数,有多个return,执行到第一个就结束了
- return可以返回多个值,以元组形式返回
- 函数的调用
函数调用就会执行代码
函数名()
- 函数的参数
- 形参
接收实参,具有描述意义,相当于变量
- 实参
传值给形参
- 位置形参
依次接收位置实参的值
- 位置实参
依次传值给位置形参
- 默认形参
具有默认值,如果传参,使用传参的值;否则使用默认值(形参会多次使用同一个值)
默认形参必须得放在位置形参后面
- 关键字实参
按照形参名传参(参数较多的情况下使用这个方法)
关键字实参必须得在位置实参的