python基础-6-函数
Python中函数分两类:内置函数和自定义函数;内置函数放到后面来说,这次主要是自定义函数
语法:
使用 def 关键字
def 函数名(参数列表):
函数体
注:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号 : 起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None
- 函数定义并不会执行函数体;只有当函数被调用时才会执行此操作
实例:
首先定义一个加法函数
def add(x,y): #定义一个加法函数
return x+y #缩进4个空格
add(3,4) #调用函数计算3+4的和
>>> 7
当一个或多个 形参 具有 形参 = 表达式 这样的形式时,该函数就被称为具有“默认形参值”。
在形参有默认值的情况下,调用函数的时候就该形参酒可以被忽略,默认形参值会在执行函数定义时从左到右的顺序被赋值。
def add(x,y=2): #定义一个加法函数,y形参的默认值为2
return x+y #缩进4个空格
add(3) #调用函数计算3+2的和
>>> 5
注:
-
给形参赋默认值的时候必须将该形参放到没有默认值的形参后方(右侧)
-
def add(x,y=2): # 有效 def add(x=2,y): # 无效
参数
上面已经提到了形参,可能有些小伙伴不知道形参时什么,下面就介绍一下函数当中的几种参数类型
- 位置参数
- 默认值参数
- 关键字参数
- 不定长参数
位置参数
位置参数,也可以叫必传参数、形参。
从名字也能看出来,调用函数的时候这个是必须要传的,不然就会报一场了
def positional(param):
print(param)
positional()
>>> Traceback (most recent call last):
>>> File "test.py", line 13, in <module>
>>> positional()()
>>> TypeError: positional()() missing 1 required positional argument: 'param'
def positional(param):
print(param)
positional("位置参数")
>>> "位置参数"
默认值参数
默认值参数,相当于形参的变相(函数定义的时候给形参赋上默认值)
最有用的形式是对一个或多个参数指定一个默认值。这样创建的函数,可以用比定义时允许的更少的参数调用,比如:
def add(x, y=3, z=4)
return x+y+z
# 这个函数可以通过几种方式调用:
add(2)
>>> 9
add(2, 2)
>>> 8
add(2, 8, 10)
>>> 20
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print("-- This parrot wouldn't", action, end=' ')
print("if you put", voltage, "volts through it.")
print("-- Lovely plumage, the", type)
print("-- It's", state, "!")
parrot(voltage=1000000, action='VOOOOOM')
>>> -- This parrot wouldn't VOOOOOM
>>> if you put 1000000 volts through it.
>>> -- It's a stiff !
parrot(action='VOOOOOM', voltage=1000000)
>>> -- This parrot wouldn't VOOOOOM
>>> if you put 1000000 volts through it.
>>> -- It's a stiff !
parrot('a thousand', state='pushing up the daisies')
>>> -- This parrot wouldn't voom
>>> if you put a thousand volts through it.
>>> -- It's pushing up the daisies !
# 无效调用
parrot() # 缺少必需的参数
parrot(voltage=5.0, 'dead') # 关键字参数后的非关键字参数
parrot(110, voltage=220) # 相同参数的重复值
parrot(actor='John Cleese') # 未知关键字参数
注:
- 在函数调用中,关键字参数必须跟随在位置参数的后面
- 传递的所有关键字参数必须与函数接受的其中一个参数匹配(比如 actor 不是函数 parrot 的有效参数)
- 它们的顺序并不重要。这也包括非可选参数,(比如 parrot(voltage=1000) 也是有效的)
- 不能对同一个参数多次赋值
不定长参数
不定长参数也叫可变参数
可以使用任意数量的参数调用函数,这些参数会被包含在一个元组里。
通常使用*args
表示,一般来说,这些 可变参数 将在形式参数列表的末尾,因为它们收集传递给函数的所有剩余输入参数。出现在 *args 参数之后的任何形式参数都是 ‘仅限关键字参数-**kwargs’。
def concat(*args, sep="/"):
return sep.join(args)
concat("earth", "mars", "venus")
>>> 'earth/mars/venus'
concat("earth", "mars", "venus", sep=".")
>>> 'earth.mars.venus'
Lambda 表达式
可以用 lambda 关键字来创建一个小的匿名函数
Lambda函数可以在需要函数对象的任何地方使用。它们在语法上限于单个表达式
lambda函数可以引用所包含域的变量
def make_incrementor(n):
return lambda x: x + n
f = make_incrementor(42)
f(1)
>>> 43
f(0)
>>> 42
将lambda小函数作为参数传递
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
print(pairs)
>>> [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
文档字符串
第一行应该是对象目的的简要概述。为简洁起见,它不应显式声明对象的名称或类型,因为这些可通过其他方式获得(除非名称恰好是描述函数操作的动词)。这一行应以大写字母开头,以句点结尾。
如果文档字符串中有更多行,则第二行应为空白,从而在视觉上将摘要与其余描述分开。后面几行应该是一个或多个段落,描述对象的调用约定,它的副作用等。
Python 解析器不会从 Python 中删除多行字符串文字的缩进,因此处理文档的工具必须在需要时删除缩进。 这是使用以下约定完成的。 文档字符串第一行 之后 的第一个非空行确定整个文档字符串的缩进量。(我们不能使用第一行,因为它通常与字符串的开头引号相邻,因此它的缩进在字符串文字中不明显。)然后从字符串的所有行的开头剥离与该缩进 "等效" 的空格。 缩进更少的行不应该出现,但是如果它们出现,则应该剥离它们的所有前导空格。 应在转化制表符为空格后测试空格的等效性(通常转化为8个空格)
def my_function():
"""Do nothing, but document it.
No, really, it doesn't do anything.
"""
pass
print(my_function.__doc__)
Do nothing, but document it.
No, really, it doesn't do anything.