【Python】函数入门

184 阅读5分钟

函数分为数学术语中的函数,和计算机函数。

函数(数学术语): 一个量随着另一个量的变化而变化,或者说一个量中包含另一个量; 含有三个要素:定义域A、值域B和对应法则f。

函数(计算机函数): 是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时,还带有一个入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序,供计算机处理;所谓出口,就是指函数的函数值,在计算机求得之后,由此口带回给调用它的程序。

小结: 在计算机函数中,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。 作用: 函数能提高应用的模块性,和代码的重复利用率。

那么在 Python 中如何定义一个函数:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号();
  • 任何传入的参数和自变量必须放在()内,()内可以用于定义参数;
  • 函数的第一行语句可以选择性地使用文档字符串(用于存放函数说明)
  • 函数内容以冒号起始,并且缩紧;
  • return [表达式]结束函数,选择性返回一个值给调用方。不带表达式的return相当于返回None;
def 函数名(参数):
    "函数文档字符串"
    代码1
    代码2

函数的调用:

定义一个函数,给出该函数的名称,指定函数里包含的参数和代码块结构; 函数必须调用才会执行,不调用则不执行。

# 定义函数
def demo():
    print("我是dmeo函数")


# 调用函数
demo()

函数的参数:

在 python 中定义函数的时候,函数名后面的()里就是用来定义参数的,如果有很多个参数,之间可以使用逗号隔开。

传入固定参数值:
def add_num(a, b):
    c = a + b
    print(c)
    

add_num(11, 22)

图解: 容器 1.png

自定义传入参数:
"""使用函数实现2个数进行相加"""
num1 = int(input("请输入第1个数:"))
num2 = int(input("请输入第2个数:"))


# 函数定义了参数,那么调用函数的时候就需要传入参数
def add_num(num1, num2):  # 形参
    print(num1 + num2)

add_num(num1, num2)  # 实参

参数的分类:

1、根据实参进行分类:
位置参数(未命名参数):
三个形参是按位置接收传入的实参
def add(a, b, c):
    c = a + b
    print(c)


add(11, 22, 33)
关键字参数(命名参数):
def func1(a, b, c):
    print(a)
    print(b)
    print(c)


func1(11, b=99, c=40)  # 位置参数必须放在关键字参数的前面
"""默认一一对应,实参的值会覆盖形参的值"""


def func2(a, b, c=99):
    print(a)
    print(b)
    print(c)


func2(11, 22, 33)  # 默认一一对应,实参的值会覆盖形参的值
func2(55, 66)  # 实参的长度小于形参时,c=99,会自动填充
"""TypeError: func() missing 1 required positional argument: 'b'"""
# func(55, c=66)  # 实参的长度小于形参时,c=66,但形参中c已经有值了,这时b取不到值,报错
2、根据行参进行分类
必备参数:

在调用函数时必须要传的参数

def add(a, b):
    c = a + b
    print(c)


add(11, 22)
# a,b为必备参数,在调用函数时,必须传,否则报错;
默认参数:

调用函数时可传可不传,不传就用默认值;

def func1(a, b, c=99):
    print(a)
    print(b)
    print(c)


func1(11, 55)
# 带有默认值的参数一定要位于参数列表的最后面,
# 否则会报语法错误(语法错误:默认参数后跟非默认参数)。
# SyntaxError: non-default argument follows default argument
不定长参数(*args和 **kwargs):
  • *args:接收多传入的位置参数,以元祖的形式保存
def func3(*args):
    print(args)


func3(11, 22, 33, 44, 55)  # 可以直接传入
func3(*(11, 22, 33, 44, 55))  # 先组装为列表或元组,再通过*拆包传入
  • **kwargs:接收多传入的关键字参数,以字典的形式保存
def func4(**kwargs):
    print(kwargs)


func4(a=1, b=3, c=5, d=7)   # {'a': 1, 'b': 3, 'c': 5, 'd': 7}
func4(**{'a': '1', 'b': '3', 'c': '5', 'd': '7'})  # {'a': '1', 'b': '3', 'c': '5', 'd': '7'}

函数的返回与返回值:

"""函数的返回:将函数的处理结果返回给调用它的程序"""

"""
函数返回值:函数执行后会返回一个对象,给调用方返回值,如果函数内部有return就可以返回,没有则返回 None

返回值类型:取决于return后面的类型
函数内可出现多个return,不会报错,但只会起作用第一个,若执行return,意为这函数执行完退出了;
"""
def sum_1(a, b):
    sum_1 = a + b
    return sum_1


# sum_1(1, 3)   # 只是调用,不会打印
print(sum_1(1, 3))

函数的多个返回值:

def my_test():
    a, b, c = (1, 3, 4)
    # return a    当函数中有多个return时,不会报错,但是只会执行第一个
    # return b    后面的为什么不执行:return返回到函数调用处了
    # return c

    return a, b, c  # 写在一起,但返回的类型为元组 (1, 3, 4)


values = my_test()
my_test()
print(values, type(values))  # (1, 3, 4)