当前位置: 华文世界 > 科技

第5章 Python函数

2024-08-26科技

5.1 定义与调用

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

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

语法:

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

示例:

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

5.2 函数名

命名规则

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

2、不能以数字开头

3、不能是 Python 中的关键字(如 if 、 for 、 while 等)

合法函数名示例

def my_function(): passdef add_numbers(): passdef calculate_sum(): pass

不合法函数名示例

# 以数字开头def 123function(): pass# 是关键字def if(): pass

函数最佳命名规则

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

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

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

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

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

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

最佳函数命名示例

def add_numbers(): passdef get_total(): passdef read_file(): passdef send_email(): passdef get_list(): passdef fetch_data(): passdef is_valid(): passdef 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 + bsum_numbers = add_numbers(1,2)print(sum_numbers) # 3

返回多个值的示例

# 函数返回元组,元组中含有多个值def do_numbers(a, b): return a + b, a - bnumbers = 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 + yprint(add(3, 5)) # 示例 2:对一个数进行平方运算square = lambda x: x ** 2print(square(4)) # 示例 3:判断一个数是否为偶数is_even = lambda x: x % 2 == 0print(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 = 5print(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 = -5print(abs(num))# type() 返回对象的类型num = 5print(type(num))# input() 用于获取用户的输入name = input("请输入您的名字:")print(f"您好,{name}!")