Python笔记4(函数)

  • Tip

Tip1: 设置循环的最大循环次数

sys.setrecursionlimit(1000)

Tip2: 函数返回多个值,返回的类型为一个元组,包含返回的多个值,接收返回值的时候,可以定义多个变量来接收元组中的值,避免使用元组的下标来取返回值。

  • 序列解包:元素的个数要相等
a = 1, 3, 4
print(type(a))
# 

a1, a2, a3 = a

函数的参数

  • 必须参数:
  1. 必须传入的参数
  • 默认参数:
  1. 变化小的参数可以设置为默认参数,给定默认值,调用时可以不用传入默认参数,使用默认值
  2. 必选参数在前,默认参数在后
  3. 调用时,如果不按顺序提供默认值的时候,需要把参数名写上
enroll('Adam', 'M', city='Tianjin')
  1. ==默认参数必须指向不变对象!==
def add_end(L=[]):
    L.append('END')
    return L

>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']

Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],
每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
  • 可变参数:==允许传入0个或多个参数,自动组装为一个tuple==
  1. 如果不用可变参数,需要将参数设置为一个list或者tuple:
def calc(numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

>>> calc([1, 2, 3])
14
>>> calc((1, 3, 5, 7))
84

可以简化成这样:
>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84
  1. ==使用可变参数,在可变参数前加*,就成为了可变参数,调用时也可以简化传入==
def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum

>>> calc(1, 2)
5
>>> calc()
0

如果已经有一个list或者tuple,在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:

>>> nums = [1, 2, 3]
>>> calc(*nums)
14
  • 关键字参数:==传入0个或任意个含参数名的参数,函数内部自动组装为一个dict==
  1. **kw
def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)

>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
  1. 先组装出一个dict,然后,把该dict转换为关键字参数传进去:
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict,
注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra。

  • 命名关键字参数:
  1. 为了限制关键字参数只能传入哪几个关键字参数,用命名关键字参数。
  2. 命名关键字参数需要一个特殊分隔符后面的参数被视为命名关键字参数。
def person(name, age, *, city, job):
    print(name, age, city, job)
    
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
  1. 如果中间有可变参数,则不需要用*来分割了。
  2. 命名关键字参数可以给出默认值
def person(name, age, *, city='Beijing', job):
    print(name, age, city, job)
参数定义的顺序

==必选参数==、==默认参数==、==可变参数==、==命名关键字参数==、==关键字参数==

对于任意函数,都可以通过类似func(*args, **kw)的形式调用它

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
    
>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}

你可能感兴趣的:(Python笔记4(函数))