可变长参数

  • 形参名(*)表示调用函数时,有多少个位置实参,我就接收多少个参数

  • 形参名(**)用字典接收多余的关键字实参

(*实参)(#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  

上节课回顾

  • 函数的定义

函数定义阶段只检测语法,不执行代码

  • 函数的三种定义方式
  1. 空函数
  2. 无参函数
  3. 有参函数
  • 函数的返回值
  1. return可以返回值,默认返回None,return后面不加东西也返回None
  2. return可以终止函数,有多个return,执行到第一个就结束了
  3. return可以返回多个值,以元组形式返回
  • 函数的调用

函数调用就会执行代码

函数名()

  • 函数的参数
  1. 形参

接收实参,具有描述意义,相当于变量

  1. 实参

传值给形参

  • 位置形参

依次接收位置实参的值

  • 位置实参

依次传值给位置形参

  • 默认形参

具有默认值,如果传参,使用传参的值;否则使用默认值(形参会多次使用同一个值)

默认形参必须得放在位置形参后面

  • 关键字实参

按照形参名传参(参数较多的情况下使用这个方法)

关键字实参必须得在位置实参的