5.1 定义与调用

函数的作用:能够将复杂的程序逻辑分解为可重复使用的模块。

业务→业务逻辑→程序逻辑

第5章 Python函数_内部函数

语法:

# 定义一个函数
def 函数名(参数列表):
    """
    这个函数的功能是实现xxx功能
    """
    函数体
    
# 调用函数
函数名(参数列表)

示例:

# 定义一个函数
def hello():
    """
    这个函数的功能是实现输出hello,world功能
    """
    print("HelloWorld")
    
# 调用函数
hello()

5.2 函数名

命名规则

1、可以由字母、数字和下划线组成

2、不能以数字开头

3、不能是 Python 中的关键字(如 ifforwhile 等)

合法函数名示例

def my_function():
    pass

def add_numbers():
    pass

def calculate_sum():
    pass

不合法函数名示例

# 以数字开头
def 123function():
    pass

# 是关键字
def if():
    pass

函数最佳命名规则

1、使用小写字母和下划线,函数名应全部使用小写字母,并使用下划线 (_) 分隔单词。例如,add_numbers

2、简洁但具有描述性,函数名应该尽可能简短,但也要足够描述其功能。例如,get_totalgt 更好

3、使用动词,函数名通常以动词开头,因为它表示一个动作。例如,read_file, send_email

4、使用名词,如果函数用于获取某些信息,可以使用名词。例如,get_list, fetch_data

5、使用前缀或后缀,使用前缀或后缀可以帮助区分不同类型的函数。例如,is_valid 表示一个布尔检查函数,get_ 通常用于获取信息

6、避免使用数字,尽量不要在函数名中使用数字,除非它们有特殊意义。例如,process_data_v2 可能表示这是数据处理函数的第二个版本

最佳函数命名示例

def add_numbers():
    pass

def get_total():
    pass

def read_file():
    pass

def send_email():
    pass

def get_list():
    pass

def fetch_data():
    pass

def is_valid():
    pass

def process_data_v2():
    pass

5.3 函数参数

在 Python 函数中,函数可以没有参数,也可以有参数。如果有参数,函数参数是用来传递数据给函数的变量。根据不同的需求,Python 支持多种类型的参数,包括位置参数、关键字参数、默认值参数、不定长参数等。

5.3.1 位置参数

位置参数是按照顺序来传递给函数的。

def multiply(x, y):
    print(x * y)

    
multiply(3, 5)  # 3 和 5 是位置参数
5.3.2 关键字参数

关键字参数允许你在调用函数时通过参数名指定参数值,这样就不必关心参数的实际位置了。关键字参数可以在任何位置使用,并且可以与位置参数混合使用。

def multiply(x, y):
    print(x * y)

    
multiply(x=3, y=5)    # 使用关键字参数
multiply(3, y=5)      # 混合使用位置参数和关键字参数

当位置参数和关键字参数混合使用时,位置参数必须出现在关键字参数之前

5.3.3 默认值参数

默认值参数是在定义函数时为参数指定一个默认值。如果调用函数时没有提供这个参数的值,那么就会使用默认值。

def multiply(x, y=5):
    print(x * y)


multiply(3, 6)
multiply(3)
multiply(x=3, y=6)
multiply(x=3)
5.3.4 不定长参数

不定长参数允许函数接受不定数量的位置参数或关键字参数。

*不定长位置参数 (args)

当参数列表前面加上星号 (*) 时,可以接收任意数量的位置参数。

def add_numbers(*args):
    numbers_sum = 0
    for i in args:
        numbers_sum += i
    print(numbers_sum)


add_numbers(1, 2)
add_numbers(1, 2, 3)

**不定长关键字参数(\kwargs)

当参数列表前面加上两个星号 (**) 时,可以接收任意数量的关键字参数。

def print_message(**kwargs):
    for key, value in kwargs.items():
        print(key + "=" + str(value))


print_message(name="buddha", age=18, height=1.75)
print("*" * 20)
print_message(name="buddha", age=18)
5.3.5 参数组合

一个函数的参数可以有位置参数、默认值参数、不定长位置参数、不定长关键字参数的组合。如果有参数组合,其函数定义时,参数从左到右的顺序是:位置参数、默认值参数、不定长位置参数、不定长关键字参数。

def show(name, height=1.80, *args, **kwargs):
    print(f'{name},{height}')
    for i in args:
        print(i)
    for key, value in kwargs.items():
        print(f'{key}-{value}')


show("buddha", 1, 2, says="hello,world")

5.4 函数返回值

1、返回值,就是函数执行完毕,返回给调用者的结果。如果函数没有显式地返回任何值,则通常返回None

2、函数需要显示地返回返回值,用关键字return

3、函数内可以有多个return,碰到第一个return关键字就结束了函数的调用

4、在Python中,可以返回一个值,或用元组的方式返回多个值

返回一个值的示例

# 函数返回一个值
def add_numbers(a, b):
    return a + b


sum_numbers = add_numbers(1,2)
print(sum_numbers)  # 3

返回多个值的示例

# 函数返回元组,元组中含有多个值
def do_numbers(a, b):
    return a + b, a - b


numbers = do_numbers(1, 2)
print(numbers[0], numbers[1])

5.5 作用域

作用域是指变量在程序中的可见性范围。

1、局部作用域:

  • 在函数内部定义的变量具有局部作用域,只能在该函数内部访问。
  • 当函数调用结束时,局部变量的作用域也随之结束。

2、全局作用域:

  • 在函数外部定义的变量具有全局作用域,可以在整个程序中访问。
  • 全局变量在程序执行开始时创建,在程序结束时销毁。

3、封闭作用域:

  • 当一个函数内部定义了另一个函数时,内部函数可以访问外部函数的变量(局部变量)。
  • 外部函数的变量(局部变量)对于内部函数来说处于封闭作用域。

4、内置作用域:

  • Python 提供了一系列内置函数和常量,如 print()type()input()等,它们在所有作用域中都是可用的。

内层使用外层变量

# 全局变量
x = "全局变量"


def outer_function():
    y = "外部函数的局部变量"  # 封闭作用域

    def inner_function():
        z = "内部函数的局部变量"  # 局部作用域
        print(z)
        print(y)  # 访问封闭作用域中的变量
        print(x)  # 访问全局作用域中的变量

    inner_function()


outer_function()

# 下面这行会抛出 NameError,因为 y 是封闭作用域中的变量
# print(y)

# 下面这行会打印全局变量 x 的值
print(x)

原则是:内层可以使用外层,外层使用不了内层

内层修改外层变量

函数内部修改全局变量,该全局变量需要在函数内部用global关键字声明

内层函数修改外层函数的变量,该外层函数的局部变量在内层函数中用nonlocal关键字声明

外层不直接使用内层的变量,这样子破坏了函数的封装性

5.6 函数的嵌套

在 Python 中,函数的嵌套是指在一个函数内部定义另一个函数。这样的设计可以用来创建更加复杂的功能组合,同时保持代码的整洁和模块化。

简单嵌套

def outer():
    print("这是外部函数被调用")

    def inner():
        print("这是内部函数被调用")

    inner()


outer()

返回内部函数

def outer_function():
    print("外包函数...")

    def inner_function():
        return "内部函数..."

    return inner_function  # 返回内部函数的引用


inner = outer_function()  # 获取内部函数的引用
print(inner())  # 调用内部函数

嵌套的应用

def factorial(n):
    """
    实现阶乘的功能,内部函数是递归函数
    """
    def recursive_factorial(n):
        if n == 0:
            return 1
        else:
            return n * recursive_factorial(n - 1)

    return recursive_factorial(n)


print(factorial(3))  # 输出 6

5.7 匿名函数

在 Python 中,匿名函数也称为 lambda 函数。它是一种简洁的方式来定义一个小型的、一次性使用的函数。

匿名函数的语法:

lambda 参数: 表达式

说明:

  • 参数:可以是一个或多个参数,多个参数之间用逗号分隔
  • 表达式:是一个单一的表达式,表达式的结果作为函数的结果返回

示例:

# 示例 1:计算两个数的和
add = lambda x, y: x + y
print(add(3, 5))  

# 示例 2:对一个数进行平方运算
square = lambda x: x ** 2
print(square(4))  

# 示例 3:判断一个数是否为偶数
is_even = lambda x: x % 2 == 0
print(is_even(6))

5.8 文档字符串

文档字符串是放在函数、类或模块的第一个逻辑行上的字符串,用于描述该对象的用途、行为或用法。__doc__ 属性可以用来获取这些文档字符串的内容。

示例:

def function(*args):
    """函数的文档字符串
    :param args: 参数说明
    :return: 函数返回值说明
    """
    pass


# 通过 函数名.__doc__ 获取文档字符串
print(function.__doc__)
# 通过 help(函数名) 获取文档字符串
help(function)

5.9 内置函数

Python 中提供了大量的内置函数,这些函数可以直接在程序中使用。

5.9.1 获取内置函数帮助信息

方式一:官方手册地址:https://docs.python.org/3/library/functions.html

方式二:函数名.__doc__

方式三:help(函数名)

......

5.9.2 常见内置函数示例
# print() 用于输出文本或变量的值
print("Hello, World!")
num = 5
print(num)

# len() 返回对象(如字符串、列表、元组等)的长度
str = "Python"
print(len(str))  
list = [1, 2, 3, 4, 5]
print(len(list))

# range() 用于生成一个整数序列
for i in range(5):
    print(i)
    
# sum() 计算可迭代对象(如列表、元组等)中所有元素的总和
numbers = [1, 2, 3, 4, 5]
print(sum(numbers))

# max() 和 min() 分别返回可迭代对象中的最大值和最小值
numbers = [5, 2, 8, 1, 9]
print(max(numbers))
print(min(numbers))

# abs() 返回一个数的绝对值
num = -5
print(abs(num))

# type() 返回对象的类型
num = 5
print(type(num))

# input() 用于获取用户的输入
name = input("请输入您的名字:")
print(f"您好,{name}!")