Python函数简介

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

定义一个函数

你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
  • 函数内容以冒号起始,并且缩进
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

注意,在创建函数时,即使函数不需要参数,也必须保留一对空的"()",否则 Python 解释器将提示"invaild syntax"错误。另外,如果想定义一个没有任何功能的空函数,可以使用 pass 语句作为占位符。

# 定义个空函数,没有实际意义
def pass_dis():
    pass

函数参数

定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。

Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。

位置参数

def my_power(x):
    return x**2

对于 my_power(x) 函数,参数 x 就是一个位置参数
但我们调用 power 函数时,必须传入有且仅有的一个参数 x

默认参数

def my_power(x,n==2):
    return x**n

调用函数时,如果没有传递参数,则会使用默认参数,可以简化函数的调用。
默认参数很有用,但使用不当也会掉进坑里,演示如下:

# 先定义一个函数,传入一个 list,添加一个 end 在返回
def add_end(l=[]):
    l.append("end")
    return l

当你正常调用的时候,结果似乎不错:

>>>add_end([1,2,3])
[1,2,3,"end"]

当你使用默认参数调用时,一开始也是对的:

>>>add_end()
['end']

但是,再次调用 add_end() 时,结果就不对了:

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

原因如下:
Python函数在定义的时候,默认参数 l 的值就被计算出来了,即[] ,因为默认参数 l 也是一个变量,它指向对象[] ,每次调用该函数,如果改变了 l 的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

定义默认参数要牢记一点: 默认参数必须指向不可变对象

可变参数

在python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以是0个,1个,任意个!

def calc(*args):
    sum = 0
    for i in args:
        sum += i
    return sum

定义可变参数和定义普通参数相比,仅仅是在参数前面加了一个 * 号。
在函数内部,参数 *args 接受到的是一个 tuple元组。

关键字参数

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

def person(name,age,**kw):
    print(f"name: {name},age: {age},other: {kw}")

>>>person("ming",18,city="BeiJing",job="Teacher")
name: ming,age: 18,other: {
   'city': 'BeiJing', 'job': 'Teacher'}

关键字参数有什么用?它可以扩展函数的功能。比如,在 person 函数中,我们保证能接收到 name 和 age 这两个参数,但是,如果调用者愿意提供更多的参数,我们也能接受到,试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。

函数返回值

return 语句用于退出函数,选择性地向调用方返回一个表达式。不带参数值的return语句返回None

def my_fun():
    return "hello world"

返回多个值

def my_fun():
    a = 1
    b = 2
    c = 3
    return a,b,c

>>>a,b,c = my_fun()
>>>print(a,b,c)
1 2 3

Python的函数返回多值其实就是返回一个tuple!但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置赋给对应的值。

函数注释

通过调用 Python 的 help() 内置函数或者 __doc__ 属性,我们可以查看某个函数的使用说明文档。事实上,无论是 Python 提供给我们的函数,还是自定义的函数,其说明文档都需要设计该函数的程序员自己编写。

其实,函数的说明文档,本质就是一段字符串,只不过作为说明文档,字符串的放置位置是有讲究的,函数的说明文档通常位于函数内部、所有代码的最前面。

下面演示了如何为其设置说明文档:

def add(x,y):
    '''返回a+b的值'''
    return x+y

>>>help(add)

add(a, b)
    返回a+b的值

>>>add.__doc__
返回a+b的值