【Python】掌握Python函数:从Hello World到高级技巧

发布于:2024-04-22 ⋅ 阅读:(133) ⋅ 点赞:(0)

欢迎来到CILMY23的博客

本篇主题为: 掌握Python函数:从Hello World到高级技巧

个人主页:CILMY23-CSDN博客

系列专栏:Python | C++ | C语言 | 数据结构与算法

感谢观看,支持的可以给个一键三连,点赞关注+收藏。


目录

一、函数的定义与调用

1.1 函数的定义

1.2 函数的调用 

1.3 函数成员 

二、函数参数

2.1 实参与形参

2.2 参数传递 

2.3 参数类型

2.3.1 必需参数

2.3.2 关键字参数

2.3.3 默认参数

2.3.4 不定长参数

三、函数的嵌套

四、函数的说明文档


一、函数的定义与调用

什么是函数?

在Python中,函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码块,也是一段可重复使用的代码块,用于执行特定任务或操作。函数可以接受输入参数,并且可以返回一个结果。使用函数可以将代码模块化,提高代码的可读性和可维护性。

python中的函数分内建函数自定义函数, 

  1. 内建函数(Built-in Functions)

    • 这些函数是Python语言提供的内置函数,无需额外导入任何模块即可直接使用。
    • 例如,print(),len(),input()等都是内建函数。
    • 内建函数通常用于执行常见的任务,如输出、数据处理、类型转换等。
  2. 自定义函数(Custom Functions)

    • 这些函数是由开发者根据需要自行定义的函数。
    • 通过使用def关键字来定义函数,并在需要时调用它们。
    • 自定义函数可以根据具体需求来实现各种功能,使得代码更加模块化、可维护和可重用。

我们接下来说的函数都是自定义函数 

1.1 函数的定义

 自定义函数的格式为:

# 1.1 自定义函数
def 函数名(参数1,参数2,参数3.......):
    """ 函数的说明文档 """
    函数体
    return 返回值
  •  函数关键字: 函数以关键字 def 开头,后接函数名和圆括号 () 
  •  函数内容: 函数内容用 : 起始,并且加一层缩进
  •  函数名: 函数名遵循标识符命名规则,函数名最好是用英文命名
  •  参数: 必须放在圆括号中间,称为形式参数,简称形参,这些参数是函数在执行时所需的输入,可以有零个或多个形参,中间用逗号隔开
  •  函数说明: 三重引号内的内容是函数的说明文档,用于描述函数的功能、参数、返回值等信息。它是可选的,但是良好的文档能够提高代码的可读性和可维护性。
  •  函数体: 函数体包含了具体的代码实现,是函数执行的主要部分。在函数体内部,你可以编写实现特定功能的代码,使用参数传递的数据,执行各种操作。如果函数体为 pass 语句,则表示什么事都不做
  •  返回值: 当函数结束时,return语句用于指定函数的返回值。在函数体内部,当遇到return语句时,函数会立即停止执行,并返回指定的值给调用函数的地方。返回值可以是任何Python数据类型,包括数字、字符串、列表、字典等。如果没有return,则默认返回None

1.2 函数的调用 

 例如:定义一个hello函数

# 1.2 函数的调用
def hello():
    return """hello world!"""

print(hello())

 结果如下:

函数调用时的顺序如下:

  1. 执行函数调用前的语句
  2. 执行函数调用,运行被调用函数内的语句,并返回相应结果
  3. 执行函数调用后的语句 

 函数调用的注意事项我们结合之后的第二点实参和形参讲。

1.3 函数成员 

在python中,函数是一种对象,因此函数可以有自己的成员,也可以为函数动态增加、修改和删除成员。(了解对象可以看链接),我们用 . 添加成员,del 关键字删除成员

例如: 

# 1.3 函数成员
def my_func():
    print("This is my function")

# 添加一个成员到函数对象上
my_func.author = "John Doe"

# 访问函数的成员
print("Author:", my_func.author)  # 输出: Author: John Doe

# 删除成员
del my_func.author

 注意,如果我们在函数内部添加了成员,这个成员在函数外部是无法删除的,有的也把函数成员称为函数属性,二者是相同的。

二、函数参数

2.1 实参与形参

在函数调用和函数定义中,我们通常会遇到两个概念:实际参数(Arguments)和形式参数(Parameters)简称 实参和形参。

  • 形参(Parameters):在函数定义时,用来接收传递给函数的值的变量称为形参。形参是在函数定义时指定的,它们充当了函数内部的变量,用于接收外部传入的数据。
  • 实参(Arguments):在函数调用时,实参是传递给函数的具体值。它们是函数调用时提供给函数的数据。
# 2.1 实参和形参
def add(a,b):
    return a + b

print(add(3,5))

在上述代码中,a和b就是形参,3,5就是实参。所以形参是函数定义中的占位符,用来接收实际参数的值,而实参则是在函数调用时提供给函数的具体值。函数调用的时候形参和实参的个数和顺序是一一对应的,从左向右的结合性。

2.2 参数传递 

 python中的对象可分为不可变对象(数字、字符串、元组等)可变对象(列表、字典、集合等)对应地,python函数的参数传递也有以下两种情况:

  1. 实参为不可变对象: 当实参为不可变对象时,函数调用是将实参的值复制一份给形参。在函数调用中修改形参时,不会影响函数外面的实参。
  2. 实参为可变对象: 当实参为可变对象时,函数调用是将实参的引用复制给形参。在函数调用中修改形参时,函数外面的实参也会随之改变。

 不过上述的第一种传递我们更习惯说是传值调用,第二种传递更称为传引用调用

更深入的说法如下:

按值传递(传值调用)和按引用传递(传址调用)。这两种方式的区别在于传递的是数据的值还是数据的引用(内存地址)。

  1. 按值传递

    • 在按值传递中,函数接收的是实参的值的副本,对形参的修改不会影响实参的值。
    • 函数内部对形参的修改不会影响到函数外部的实参。
  2. 按引用传递

    • 在按引用传递中,函数接收的是实参的引用(内存地址),形参指向的是实参的内存地址,因此对形参的修改会影响到实参的值。
    • 函数内部对形参的修改会直接影响到函数外部的实参。

实际上,我们创建变量,就是在内存地址中开辟空间,这个空间有唯一的标识 --- 内存地址,如果我们知道了地址,我们就可以修改内部空间的值。 传引用实际上就是知道了外部实参的地址位置,可以直接修改位置。(可以看链接了解一下地址)

例如:定义一个函数Swap(x,y),交换内部的两个值。 

def swap(x, y):
    temp = x
    x = y
    y = temp

a = 5
b = 10
print("Before swapping:")
print("a =", a)
print("b =", b)

swap(a, b)

print("After swapping:")
print("a =", a)
print("b =", b)

结果:

因为是传值调用,所以外部的实参并不会因为内部的形参改变而改变。 

 例如:如果我们要传引用调用,这里使用列表演示

def swap(arr):
    arr[0], arr[1] = arr[1], arr[0]

arr = [5, 10]
print("Before swapping:")
print("arr =", arr)

swap(arr)

print("After swapping:")
print("arr =", arr)

结果:

2.3 参数类型

调用函数时,可使用的正式参数类型包括:必须参数关键字参数默认参数不定长参数

2.3.1 必需参数

必需参数也称位置参数(调用函数时根据函数定义的参数位置来传递参数),它要求函数调用时传入的实参个数、顺序和函数定义时形参的个数、顺序完全一致

 例如:

#2.3.1 必需参数
def add(a,b):
    return a + b

print(add(3,))

如果我将5删除,则pycharm就会报错

2.3.2 关键字参数

关键字参数是一种在函数调用中使用的参数形式,它们与函数定义中的形参相对应,通过指定形参名来传递参数值。这种传递方式使得在函数调用时可以不必考虑参数的顺序,而只需指定参数名即可。

例如:

#2.3.2 关键字参数
def greet(name, message):
    return f"{message}, {name}!"

# 使用关键字参数调用函数
print(greet( message="Hi",name="Bob"))

 结果:

说白了,关键字参数就是通过“键=值”形式加以指定,有点类似组合类型中的字典,这样可以直接忽略参数顺序

2.3.3 默认参数

默认参数又被称为缺省参数(点击链接跳转查看C++缺省参数),我们更习惯叫它缺省参数,缺省参数是在定义函数时为参数指定的一个默认值,当调用函数时没有提供对应参数的值时,将会使用这个默认值。

例如:

#2.3.3 缺省参数
def greet(name, message = "hello"):
    return f"{message}, {name}!"

# 使用关键字参数调用函数
print(greet("job"))
print(greet( message="Hi",name="Bob"))

 结果:

2.3.4 不定长参数

不定长参数也叫可变参数。用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。不定长参数有如下两种形式:

  • *args: 将接收的多个参数放入一个元组中
  • **kargs:将显示赋值的多个参数放入字典中 

例如:

# 2.3.4 不定长参数

def sum_values(*args):
    result = 0
    for num in args:
        result += num
    return result

print(sum_values(1, 2, 3))
print(sum_values(1, 2, 3, 4, 5))

结果:

*args 表示可以接受任意数量的位置参数,并将它们存储在一个元组中。在函数体内,我们遍历这个元组并计算所有参数的总和,从而实现了对任意数量参数的求和。

类似地,可以使用**kargs表示接受任意数量的关键字参数,它会将这些关键字参数存储在一个字典中。 

例如:

def print_values(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_values(a=1, b=2, c=3)

结果:

补充:kwargs.items () 是字典类型的方法,用于获取字典中所有键值对(key-value pairs).

三、函数的嵌套

嵌套函数指在一个函数(称为外函数)中定义了另外一个函数(称为内函数)。

# 三、 函数的嵌套
def outer_function():  # 外函数
    print("This is outer function.")

    def inner_function(): # 内函数
        print("This is inner function.")

    inner_function()  # 在外函数内部调用内函数

# 调用外函数
outer_function()

 结果如下:

 嵌套函数中的内函数只能在外函数中调用,不能在外函数外面调用。

例如:

# 三、 函数的嵌套
def outer_function():  # 外函数
    print("This is outer function.")

    def inner_function(): # 内函数
        print("This is inner function.")

    inner_function()  # 在外函数内部调用内函数

# 调用外函数
outer_function()
inner_function()  # 在外函数外部调用内函数

结果: 

四、函数的说明文档

函数的说明文档(docstring)是在函数定义中用来描述函数功能、参数、返回值等信息的字符串。它是可选的。

在Python中,通常使用三重引号 """ 来定义函数的说明文档,放置在函数定义的第一行或者紧随其后。 

def greet(name):
    """
    这个函数用于向指定的名字打招呼。

    参数:
    name -- 要打招呼的名字。

    返回值:
    一个包含打招呼消息的字符串。
    """
    return f"Hello, {name}!"

 要查看函数的说明文档,可以使用Python内置的 help() 函数或者查看函数的 __doc__ 属性

help(greet)
print(greet.__doc__)


感谢各位同伴的支持,本期python就讲解到这啦,如果你觉得写的不错的话,可以给个一键三连,点赞关注+收藏,若有不足,欢迎各位在评论区讨论。