Python中的函数

164 阅读4分钟

Python中的函数


1.函数定义

1.1 定义一个函数

python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中参数和冒号:然后在缩进中编写函数体,函数的返回值用return 语句返回.

def my_abs(x):
    if x>=0:
       return x
    else:
    return -x

注意:没有return语句,函数执行完毕后也会返回None

1.2 定义一个空函数

定义一个什么也不做的函数就是空函数,空函数中使用pass,作为占位符,确保代码能运行起来

def nop():
    pass
1.3 函数中的参数检查

函数中参数数据类型检查可以用内置函数isinstance()实现.

def my_abs(x):
    if not isinstance(x,(int,float)):
       raise TypeError('bad operand type')
    if x>=0:
       return x
    else return -x
1.4 返回多个值

python函数返回多个值,实际上是返回一个tuple,在语法上,返回一个tuple可以省略括号,并且,多个变量可以同时接收一个tuple,按位置赋给对应的值.

def multiple_return (x,y):
    return x+1,y+1

2.函数的参数

Python中的函数参数定义简单,但非常灵活,除了正常定义的必选参数外,还可以使用默认参数、可变参数、关键字参数等

2.1 位置参数
# 计算x的平方值
def power(x,n):
    s = 1
    while n > 0 :
         n = n -1
         s = s*x
    return s

上例函数,x,n两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋值给x,n

2.2 默认参数

默认参数给参数赋予默认值

def power(x ,n=2):
    s = 1
    while n>0:
          n = n-1
          s = s*x
    return s

默认参数注意事项

  • 默认参数在必须参数后,否则容易造成歧义
  • 当有多个默认参数的时候,可以按顺序提供默认参数,当不按照顺序提供默认参数时,需要把参数名带上.
  • 默认参数必须指向不可变对
    # 错误示例
    def add_end(L = []):
    L.append('End')
    return L
    # 正确
    def add_end(L = None):
    if L is None:
    L = []
    L.append('End')
    return L
    
2.3 可变参数

定义一个可变参数只需要在参数前面加一个*,而在函数内部,参数接收的是一个tuple

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

calc(1,3,5,7)

已有list或者tuple,可以在他们前面加一个星号 list,tuple的元素变成可变参数传进去

nums = [1,3,5]
calc(*nums)
2.4 关键字参数

可变参数允许传入0 或任意个参数,这些可变参数在函数调用时自动组装成一个tuple.而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict

def person (name,age,**kw):
    print(name,age,kw)
person('Bob',35,city="BeiJing")
# Bob 35 {'city':'BeiJing'}

**和可变参数类似,也可以先组装一个dict,然后把dict转换关键字参数传入

extra = {'city':'beijking','job':'IT'}
person('Jack',24 ,**extra)
2.5 命名关键字参数

对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数.而命名关键字参数可以限制关键字参数的名字.

# 限制关键字参数只接收city和job作为关键字参数

def person (name,age,*,city,job)

注意事项

  • 和命名关键字**kw不同,命名关键字参数需要一个特殊分隔符*, *后面的参数被视为命名关键字参数.

  • 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*

    def person(name,age,*args,city,job)
    
  • 命名关键字参数必须传入参数名,和位置参数不同,如果没有传入参数名,调用将会报错

2.6 参数组合

必选参数、默认参数、可变参数、 关键字参数和命名关键字参数,这物种参数都可以组合使用.

但参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数、关键字参数

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
    # a = 1 b = 2 c = 4 args = (5, 6) kw = {'city': 'beijing', 'addr': 'chaoyang'}