Python中函数分两类:内置函数和自定义函数;内置函数放到后面来说,这次主要是自定义函数
使用 def 关键字
def 函数名(参数列表): 函数体
注:
首先定义一个加法函数
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') # 未知关键字参数
注:
不定长参数也叫可变参数
可以使用任意数量的参数调用函数,这些参数会被包含在一个元组里。
通常使用*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函数可以引用所包含域的变量
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.