Python基础之函数

函数定义

函数定义时参数可为0个或多个,必须保留括号;返回值可以有0个或者多个,可以没有return

def <函数名>(<参数>) :

<函数体>

return <返回值>

两种参数传递方式

def f1(n, b):
    s = 1
    for i in range(1, n+1):
        s *= i
    return s*b
f1(3,2)
12
f1(b=2,n=3)
12

可选参数传递

可选参数也可以叫默认参数,函数定义时必须必选参数在前,可选参数在后,否则会报错。

f2(2)
2
f2(2,2)
4

同时,为了防止多次调用导致默认参数改变,可选参数一定要指向不便对象。

先定义一个函数,传入一个list,添加一个END再返回:

def add_end(L=[]):
    L.append('END')
    return L
>>> add_end()
['END']
>>> add_end()
['END', 'END']

函数可以改为:

def add_end(L=None):
    if L is None:
        L = []
    L.append('END')
    return L

可变参数传递

可变参数允许传入0个或任意个参数,在内部参数b接收到的是一个tuple。

def f3(n, *b):
    s = 1
    for i in range(1, n+1):
        s *= i
    for a in b:
        s *= a
    return s
f3(3,2)
12
f3(3,2,1,2)
24

如果已经有一个list或者tuple,要调用一个可变参数可以:

nums = [1.2.3]
f3(2,nums[0],nums[1],nums[2])

也可以在list或者tuple前面加一个*号,把list或者tuple的元素变成可变参数

nums = [1.2.3]
f3(2,*nums)

关键字参数

关键字参数允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

>>> def person(name, age, **kw): #kw为关键字参数,调用时可选
···    print('name:', name, 'age:', age, 'other:', kw)
>>> person('ya',20)
name:ya age:20 other:{}
>>> person('pan',20,gender='M')
name: pan age: 20 other: {'gender': 'M'}

与可变参数类似,若已经有一个dict的话,可以有两种方式将dict变成关键字参数。

>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, city=extra['city'], job=extra['job'])
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

另一种方法

>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

命名关键字参数(限定关键字)

命名关键字是为了限制参数的传递方式,增加可读性。使用命名关键字往往是因为后面几个形参名具有非常明显的含义。

定义命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字:

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

而如果函数中有一个可变参数,后面的命名关键字参数就不需要用*

def person(name, age, *args, city, job):
    print(name, age, args, city, job)

函数的调用时,命名关键字必须传入参数名,没有传入就会报错:

>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer

如果设置缺省值,可以简化调用:

>>> def person(name, age, *, city='Beijing', job):
···    print(name, age, city, job)
···
>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer

参数组合

前面各种参数可以同时使用,但是要按照一定的顺序:必选参数、默认参数、可变参数、命名关键字参数、关键字参数。

如:

def f(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)

通过tuple和dict也可以调用上述函数。tuple会将内部的元素按顺序依次赋值给必选参数、默认参数、可变参数;dict会依次赋值给命名关键字参数、关键字参数

>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}

虽然参数有很多种,但是不要同时使用太多,否则函数接口的可理解性会很差

返回值

函数可以返回多个值,但实际上只是返回一个元祖类型值

def f4(a,b=1): # b为可选参数    return a*b, a, b
f4(3,4) # 返回元祖类型
(12, 3, 4)
a, b, c = f4(3, 4)
print(a, b, c)
12 3 4

局部变量和全局变量

  • 基本数据类型(Number),无论是否重名,局部变量与全局变量不同。且函数运算结束后,局部变量会被释放。
a, b = 3, 4 # a,b为全局变量
def f5(a):
    b = 2 # 函数中的a,b为局部变量
    return a*b
print(f5(a),b)
6 4
  • 可以使用global在函数内部使用全局变量
a, b = 3, 4 # a,b为全局变量
def f6(a):
    global b # 函数中的a,b为局部变量
    b *= 2
    return a*b
print(f6(a),b)
24 8
  • 组合数据类型(除了Number以外的标准数据类型)如果局部变量未真实创建,则是全局变量
s = ["a", "A"] # 真实创建了一个全局变量列表s
def f(a):
    s = [] # 真实创建了一个局部变量s
    s.append(a)
f("b")
s
['a', 'A']
s = ["a", "A"] # 真实创建了一个全局变量列表s
def f(a):
    s.append(a) # 未真实创建,使用的是全局变量的列表s
f("b")
s
['a', 'A', 'b']

lambda函数

用于定义简单,能在一行内表示的函数。函数名即为返回结果

定义:

<函数名> = lambda <参数>:<表达式>

f = lambda x, y: x + y
f(10, 4)
14

空函数

如果想定义一个空函数,可以用pass语句:

def f():
    pass

pass可以用来作为占位符,比如还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来。

pass还可以用在其他语句里,比如:

if age >= 18:
    pass

缺少了pass,代码运行就会有语法错误。

参考:

廖雪峰的官方https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888

大学MOOC

posted @ 2021-07-12 11:18  艾雅雅雅  阅读(179)  评论(0)    收藏  举报