@Author : Roger TX (425144880@qq.com)
@Link : https://github.com/paotong999
一、函数的理解
计算机语言的函数,其实和数学中的函数理解差不多
举个例子:
1.求圆的面积:S = πr2,这个计算公式按照数学的函数写法就是:f(x) = πx2
2.求数列的和:S = 1 + 2 + 3 + ... ,这个计算公式按照数学的函数写法就是:f(x) = ∑nn=1
在Python中,函数有以下特性
- 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
- 函数能提高应用的模块性,和代码的重复利用率。
- Python提供了许多内建函数,但也可以自己创建函数,这被叫做用户自定义函数。
二、函数定义
定义一个由自己想要功能的函数,一般需要遵循以下规则:
- 函数代码块以
def
关键词开头,后接函数标识符名称和圆括号 ()。 - 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
实例
#!/usr/bin/python3
def area(width, height):
return width * height
def print_welcome(name):
print("Welcome", name)
print_welcome("Runoob")
print(area(4, 5))
三、函数调用
一个函数被定义后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。
Python内置了很多有用的函数,我们也可以直接调用,例如print()
。
要调用一个函数,需要知道函数的名称和参数。
比如求绝对值的函数abs,只有一个参数,可以在交互式命令行通过help(abs)
查看abs函数的帮助信息。
实例
调用abs函数:
>>> abs(100)
100
>>> abs(-20)
20
四、函数的返回值
- return [表达式] 语句用于退出函数,选择性地向调用方返回一个表达式。
- 函数执行完毕也没有return语句时,自动return None。
- 不带参数值的return语句返回None。
- 函数可以同时返回多个值,但其实就是一个tuple。
五、函数的参数
参数的定义
- 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。
- 对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的逻辑被封装起来,调用者无需了解。
- 参数的分类:必须参数(位置参数)、默认参数、可变参数、关键字参数、命名关键字参数。
必需参数(位置参数)
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
def hello(name, age):
print ('hello %s %s' %(name,age))
hello('tx',2)
默认参数
用于定义函数,为参数提供默认值,调用函数时可传可不传该默认参数的值。
注意
1、所有位置参数必须出现在默认参数前,包括函数定义和调用
def hello(name, age=2):
print ('hello n%s a%s' %(name,age))
hello('tx')
可变参数
可变参数,顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
def test_args(first, *args):
print ('Required argument: ', first)
print ('args: ', args)
for v in args:
print ('Optional argument: ', v)
test_args(1, 2, 3, 4)
如果已经有一个list或者tuple,要调用一个可变参数可以使用以下方式
nums = [1, 2, 3]
test_args(nums[0], nums[1], nums[2])
test_args(*nums)
关键字参数
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。
关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
传入函数的关键字参数的参数名,不能同已有的参数名相同。
def func(**kw):
print ('a=%s,b=%s,c=%s' %(kw['a'],kw['b'],kw['c']))
func(a=1, b=2, c=3)
dict = {'a':1, 'b':2, 'c':3}
func(**dict)
命名关键字参数
和关键字参数**kargs
不同,命名关键字参数需要一个特殊分隔符*
,*
后面的参数被视为命名关键字参数。
采用命名关键字参数可以限制函数传入的关键字参数,定义如下:
def testArg(city,name,*,age,job)
可以这样调用他
testArg('beijin','wfp',age='25',job='hoker')
testArg('beijin','wfp',addr='shanghai',age='25',job='hoker')
但是不能这样调用他
testArg('beijin','wfp','25',job='hoker')
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
testArg(city,name,*args,age,job):
注意
1、命名关键字参数调用时,必须通过“键-值”形式加以指定。
2、命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。
3、命名关键字参数可以有缺省值。
4、命名关键字参数之间不存在先后顺序的**
def func(name, age, *args, sex=1, job):
print (name, age, sex, args, job)
func('tx', 25, 'music', 'sport', job='it', sex=3)
参数的混合使用
基本原则是:先位置参数,默认参数,包裹位置,包裹关键字(定义和调用都应遵循)
def func(name, age, *args, sex=1, **kw):
print (name, age, sex, args, kw)
func('tx', 25, 'music', 'sport', sex=3, a=1, b=2)
def func(name, age, sex=1, *args, **kw):
print (name, age, sex, args, kw)
func('tx', 25, 2, 'music', 'sport', a=1, b=2)
总结
-
*args
是可变参数,args接收的是一个tuple。 -
*kw
是关键字参数,kw接收的是一个dict。 - 同时使用
*args
和**kw
时,必须*args
参数列要在**kw
前。 - 使用
*args
和**kw
是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。