Python入坑笔记(五):函数

Author Avatar
Zhu Yuexin Dec 04, 2017

函数定义

使用def定义一个函数:

def greet():
    print("hello")

greet()

outputs:

hello

参数

python向函数传递参数的方式有很多种,有位置实参、关键字实参,还可以传递列表和字典。

位置实参

基于实参的顺序,每个实参与对应的形参关联,这样的方式叫做位置实参。

def pets(type, name):
    print("I hava a " + type)
    print("It's name is " + name)

pets("pig","Peggy")

outputs:

I hava a pig
It's name is Peggy

根据传入实参的顺序,通过形参获取到传入的值。

关键字实参

关键字实参名称-值这样的参数对传递给函数,名称与值直接关联,因此不必考虑传入的顺序。

def pets(type, name):
    print("I hava a " + type)
    print("It's name is " + name)

pets(name="Peggy",type="pig")

outputs:

I hava a pig
It's name is Peggy

参数默认值

在函数定义中,可以给每个形参指定默认值,如果在调用函数时传入了对应的实参,则函数中会使用传入的实参值,否则,使用该参数的默认值。

def pets(name, type="dog"):
    print("I hava a " + type)
    print("It's name is " + name)

pets("Peggy")

outputs:

I hava a dog
It's name is Peggy

注意:参数定义中,有默认值的参数的位置必须在无默认值的参数之后。默认参数必须指向不变对象!

传递任意数量的实参

如果预先不知道函数需要接受多少个实参,Python允许函数从调用语句中接收任意数量的实参。在形参定义时前面加一个*号,它会创建一个空元组,用来接收所有的参数值。比如def fun(*params),会创建一个名为params的 空元组,将接收到的所有值封装进去。

def pets(*types):
    for pet in types:
        print(pet)

pets("dog", "cat", "monkey")

outputs:

dog
cat
monkey

传递任意数量的关键字实参

Python函数还可以接收任意数量的关键字实参,即任意数量的键值对。任意数量的关键字实参用**定义,Python会创建一个字典保存所接收到的所有关键字实参。比如def func(**kvs),会创建一个名为kvs的字典,接收所有的关键字实参。

def user_info(**info):
    for k,v in info.items():
        print(k + " is " + str(v))

user_info(name='Tom', age=21, location='Chongqing')

outputs:

name is Tom
age is 21
location is Chongqing

注意

  • 参数定义顺序:必选参数、默认参数、可变参数、可变关键字参数
  • 默认参数必须指向不变对象
  • 给形参指定默认值时,等号两边不要有空格

返回值

函数可返回任何类型的值,包括列表和字典等较复杂的数据结构。用return语句返回。

def get_sum(a, b):
    return a+b

sum = get_sum(1,2)
print(sum)

output:

3

传递列表

有时候需要将列表作为参数传递给函数,更方便的操作列表。列表传递给函数后,函数能直接访问它的内容,注意,函数中对列表的修改是永久性的。

def check(users):
    while users:
        user = users.pop()
        print(user+" checked!")

users = ["Tom", "Jhon", "Edward"]
check(users)
print("last: "+ str(len(users)))

outputs:

Edward checked!
Jhon checked!
Tom checked!
last: 0

禁止函数修改列表

Python提供了对列表的切片操作符:,比如有一个列表L,那么L[0:3]表示,在列表L中从索引0开始,取到索引3但不包括索引3,取出包含这三个元素的列表副本。

在传入函数的实参列表,这样使用切片[:],就可以将列表的完整副本传入函数中,这样函数对列表的操作就不会影响到原始列表。

def check(users):
    while users:
        user = users.pop()
        print(user+" checked!")

users = ["Tom", "Jhon", "Edward"]

check(users[:])

print("last: "+ str(len(users)))

outputs:

Edward checked!
Jhon checked!
Tom checked!
last: 3