第14课 再识函数

一、变量的作用域

1、函数的作用域

1)全局变量在函数外部

>>> x = 2   # 全局变量
>>> def func():
      x = 9 # 局部变量
      print('this x is in the func:-->', x)

# 执行结果    
>>> func()
this x is in the func:--> 9
>>> print('this x is out of func:-->', x)
this x is out of func: -->2

2)局部变量:在函数内部,生命周期只有在函数内部里面

>>> def func():
        x = 9
        print('x为局部变量,只能在函数内部调用', x)

    
>>> func()
x为局部变量,只能在函数内部调用 9
>>> print('在函数外部调用局部变量x', x)
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    print('在函数外部调用局部变量x', x)
NameError: name 'x' is not defined

3)全局变量在函数内部可以被引用

4)在函数内部修改全局变量,使用global关键字

>>> def func():
    global x   # 使用global后,x为全局变量
    x = 9
    print('x为全局变量!')

    
>>> func()
x为全局变量!
>>> print('打印全局变量x的值:', x)
打印全局变量x的值: 9

二、可缺省参数

1、必填参数:def func(a, b),其中a和b为必填参数,如果不填的话,程序将报错。

>>> def func(a, b):
    print(a, b)

    
>>> func(68) # 参数缺一不可
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    func(68)
TypeError: func() missing 1 required positional argument: 'b'

2、可缺省参数:def func(a, b = 0):

1)形参变量 = 值:b = 0   是默认参数;

就是不传这个值的时候,默认给的参数

如果传实际的实参,b = 实参

>>> def func(a, b = 0):
      print(a, b)

    
>>> func(68)  # 因为b是可缺省参数,有默认值0,所以这里可以给b的值,也可以缺省
68 0

2)传实参

>>> def func(a, b = 0):
        print(a, b)

    
>>> func(68, 99) # 重新给b赋值
68 99

3)在一定程度上可以方便程序员调用---少给参数

4)可缺省参数定义的时候一定在必填参数后面,否则会报错

错误的写法

>>> def func(a = 0, b):
      print(a, b)
    
SyntaxError: non-default argument follows default argument

正确的写法

>>> def func(a, b =0):
        print(a, b)

    
>>> func(68, 99)
68 99

或者可以这样写

>>> def func(a = 1, b =2):
      print(a, b)

    
>>> func(5, 6)
5 6

三、可变数量参数

1、数量可变

>>> def calc(numbers):
        total = 0
        for n in numbers:
          total = total + n * n
    return total

>>> print(calc([1,2,3,4,5,6]))  # 括号里是一个列表
91

2、提升函数的兼容性---扩展性/通用性

>>> def calc(numbers):
      total = 0
      for n in numbers:
          total = total + n * n
    return total

>>> print(calc((1,2,3,4,5,6))) # 括号里是一个元组,因为numbers是一个参数,所以calc()里面也应该是一个参数;这里的(1,2,3,4,5,6)是一个元组,把元组当做一个参数
91

3、在形参变量前面加一个星号(*)---然后numbers就变成一个元组

  def calc(*numbers):

    print(type(*numbers))-----tuple元组

def calc(*numbers):
    print(type(numbers))
    total = 0
    for n in numbers:
        total = total + n * n
    return total

print(calc(1,2,3,4,5,6,7,8,9))  # 注意,这里calc后面是一个括号,可以直接在calc里面写,而不用calc(())的形式。因为numbers是一个元组,calc()括号里面就是元组的元素


# 执行结果
<class 'tuple'>
285

4、如果传入的是一个元组或者列表-----在元组或列表名前面加*---或者称为解包

>>> tul = [1,2,3,5,7,9]
>>> def calc(*numbers):
    total = 0
    for n in numbers:
        total = total + n * n
    return total

>>> print(calc(*tul))  # 解包
169

1)如果可变数量参数在默认参数之前,则默认参数只能使用默认值。因为可变数量参数是不固定的,除了关键字参数,后面的都会被可变数量参数引用

>>> def func(a, *numbers, c = 100):
        print(a)
        print(numbers)
        print(c)

    
>>> 
>>> func(2,3,4,5,6,7)
2
(3, 4, 5, 6, 7)
100  # 只能引用默认值

2)这样写,可以不用引用默认值

>>> def func(a, b = 188, *numbers):
    print(a)
    print(b)
    print(numbers)

    
>>> func(1,2,3,5,6,7,8,9)
1
2   # b引用新值2
(3, 5, 6, 7, 8, 9)

四、关键字可变数量参数

1、有关键字

2、可变数量

3、定义:**arg

1)print(type(arg))------<class 'dict'>

2)键值对

3)传入值:变量 = 值

>>> def func(a, b = 188, *numbers, **args):  # **args--关键字可变数量参数
        print(a)
        print(b)
        print(numbers)
        print(type(args))
        print(args)  

    
>>> func(123,5678,9,10,12,156789, name = 'linda')
123
5678
(9, 10, 12, 156789)
<class 'dict'>
{'name': 'linda'}  # 字典类型

4、如果传入的是字典:**dict1------关键字可变数量参数的解包

>>> dict1 = {'name': 'Tom', 'age': 18}
>>> tup1 = (3,5,6,7,8,9)
>>> def func(a, b = 123, *numbers, **args):  
    print(a)
    print(b)
    print(numbers)
    print(args)

    
>>> func(123, 111, *tup1, **dict1) # **args 关键字可变数量参数的解包
123
111
(3, 5, 6, 7, 8, 9)
{'name': 'Tom', 'age': 18}

五、综合使用:必填参数、缺省参数、可变参数和关键字可变参数

def func(a, b, c =168, *arg, **kw):
    print(a)
    print(b)
    print(c)
    print(arg)
    print(kw)

func(123, 5, 6, 7, 8, 9, 88, 899, name = 'Tom', age = 18)  # 字典在这里赋值时,key不用加冒号。


# 执行结果
123
5
6
(7, 8, 9, 88, 899)
{'name': 'Tom', 'age': 18}
原文地址:https://www.cnblogs.com/nick1998/p/10088937.html