彻底搞懂python函数

一、函数定义与调用基本语法

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

函数定义语法:

def 函数名([参数列表]):
    '''注释'''
    函数体

注意事项:

  • 函数形参不需要声明类型(由实参值决定),也不需要指定函数返回值类型
  • 即使该函数不需要接收任何参数,也必须保留一对空的圆括号
  • 括号后面的冒号必不可少
  • 函数体相对于def关键字必须保持一定的空格缩进
  • Python允许嵌套定义函数
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

二、函数递归调用

函数的递归调用是函数调用的一种特殊情况,函数调用自己,自己再调用自己,自己再调用自己,…,当某个条件得到满足的时候就不再调用了,然后再一层一层地返回直到该函数第一次调用的位置。
在这里插入图片描述

三、函数参数

  • 函数定义时圆括弧内是使用逗号分隔开的形参列表(parameters),函数可以有多个参数,也可以没有参数,但定义和调用时一对圆括弧必须要有,表示这是一个函数并且不接收参数。
  • 调用函数时向其传递实参(arguments),根据不同的参数类型,将实参的引用传递给形参。
  • 定义函数时不需要声明参数类型,解释器会根据实参的类型自动推断形参类型。

1.位置参数(实、形参)

位置参数(positional arguments)是比较常用的形式,调用函数时实参和形参的顺序必须严格一致,并且实参和形参的数量必须相同。

>>> def demo(a, b, c):
    print(a, b, c)
>>> demo(3, 4, 5)                   #按位置传递参数
3 4 5
>>> demo(3, 5, 4)
3 5 4
>>> demo(1, 2, 3, 4)                #实参与形参数量必须相同
TypeError: demo() takes 3 positional arguments but 4 were given

2.默认值参数(形参)

  • 在调用带有默认值参数的函数时,可以不用为设置了默认值的形参进行传值,此时函数将会直接使用函数定义时设置的默认值,当然也可以通过显式赋值来替换其默认值。在调用函数时是否为默认值参数传递实参是可选的。
  • 需要注意的是,在定义带有默认值参数的函数时,任何一个默认值参数右边都不能再出现没有默认值的普通位置参数,否则会提示语法错误。(即带形参的默认值靠右放)

带有默认值参数的函数定义语法如下:

def 函数名(……,形参名=默认值):
    函数体
>>> def say( message, times =1 ):
    print((message+' ') * times)

>>> say('hello')
hello
>>> say('hello', 3)
hello hello hello

3.关键参数(实参)

关键参数主要指调用函数时的参数传递方式,与函数定义无关。通过关键参数可以按参数名字传递值,明确指定哪个值传递给哪个参数,实参顺序可以和形参顺序不一致,但不影响参数值的传递结果,避免了用户需要牢记参数位置和顺序的麻烦,使得函数的调用和参数传递更加灵活方便。

>>> def demo(a, b, c=5):
    print(a, b, c)

>>> demo(3, 7)
3 7 5
>>> demo(a=7, b=3, c=6)
7 3 6
>>> demo(c=8, a=9, b=0)
9 0 8

4.可变长度参数(形参)

  • 可变长度参数主要有两种形式:在参数名前加1个*或2个**
  • *parameter用来接收多个位置参数并将其放在一个元组
  • **parameter接收多个关键参数并存放到字典

*parameter的用法:

>>> def demo(*p):                     #形参带一个*则放在元组里
    print(p)
>>> demo(1,2,3)
(1, 2, 3)
>>> demo(1,2)
(1, 2)
>>> demo(1,2,3,4,5,6,7)
(1, 2, 3, 4, 5, 6, 7)

**parameter的用法:

>>> def demo(**p):
    for item in p.items():  #p.items()改成p.keys()则输出的是键,改成p.values()则输出的是值
        print(item)
>>> demo(x=1,y=2,z=3)
('y', 2)
('x', 1)
('z', 3)

四、传递参数时的序列解包(实参)

  • 传递参数时,可以通过在实参序列前加一个星号将其解包,然后传递给多个单变量形参。
>>> def demo(a, b, c):
    print(a+b+c)

>>> seq = [1, 2, 3]
>>> demo(*seq)
6             #*解包,1+2+3=6
>>> tup = (1, 2, 3)
>>> demo(*tup)
6
>>> dic = {1:'a', 2:'b', 3:'c'}
>>> demo(*dic)
6                 #一个星号取的是键值对中的键
>>> Set = {1, 2, 3}
>>> demo(*Set)
6
>>> demo(*dic.values())
abc
  • 如果函数实参是字典,可以在前面加两个星号进行解包,等价于关键参数。
>>> def demo(a, b, c):
    print(a+b+c)

>>> dic = {'a':1, 'b':2, 'c':3}
>>> demo(**dic)
6                   #两个星号取的是键值对中的值
>>> demo(a=1, b=2, c=3)
6
>>> demo(*dic.values())
6       #这三个是等价的
发布了107 篇原创文章 · 获赞 314 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/zag666/article/details/105060460