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的值