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.
posted @ 2021-07-16 18:47  柒哥-666  阅读(125)  评论(0编辑  收藏  举报