Python:函数的定义、调用、参数

在 Python 中,函数是一段可重复使用的代码块,用于执行特定的任务。

一、函数的定义

使用 def 关键字来定义函数,语法如下:

def function_name(parameters):
    """docstring"""
    # 函数体
    return expression

function_name:函数的名称,遵循变量命名规则。

parameters:参数列表,可以是零个或多个参数,用逗号分隔。参数在函数内部作为变量使用。

"""docstring""":文档字符串,用于描述函数的功能和用法,可以通过 help() 函数查看。

return expression:可选的返回语句,用于将函数的结果返回给调用者。如果没有 return 语句,函数默认返回 None。

二、函数的调用

通过函数名称和括号来调用函数,并可以传递参数:

result = function_name(arguments)

arguments:实参,与函数定义中的参数相对应。

三、函数的参数

1. 位置参数:按照参数在函数定义中的位置顺序传递的参数。

def add(a, b):
    return a + b
result = add(3, 4)

2. 关键字参数:通过参数名称来传递参数,可以不按照参数在函数定义中的位置顺序。

result = add(b=4, a=3)

3. 默认参数:在函数定义时为参数指定默认值,如果调用函数时没有传递该参数,则使用默认值。

def greet(name, greeting="Hello"):
    return f"{greeting}, {name}!"
print(greet("Alice"))
print(greet("Bob", "Hi"))

4. 可变参数:

*args:用于接收任意数量的位置参数,将它们打包成一个元组。

kwargs:用于接收任意数量的关键字参数,将它们打包成一个字典。

def print_args(*args, kwargs):
    print("Positional arguments:", args)
    print("Keyword arguments:", kwargs)
print_args(1, 2, 3, a=4, b=5)

四、函数的返回值

函数可以返回一个或多个值,使用 return 语句返回结果。如果有多个返回值,可以用逗号分隔,它们将被打包成一个元组返回。

def divide(a, b):
    quotient = a // b
    remainder = a % b
    return quotient, remainder
q, r = divide(10, 3)

五、函数的作用域

1. 局部变量:在函数内部定义的变量,只能在函数内部访问。

2. 全局变量:在函数外部定义的变量,可以在整个程序中访问。如果在函数内部想要修改全局变量,需要使用 global 关键字声明。

x = 10
def change_x():
    global x
    x = 20
    print(x)
change_x()
print(x)

六、递归函数

在 Python 中,递归函数是一种直接或间接调用自身的函数。递归可以将复杂问题分解为较小的、相似的子问题,从而使问题更容易解决。

1、递归函数的基本结构

def recursive_function(parameters):
    # 基本情况(终止条件)
    if base_condition:
        return base_value
    # 递归调用
    else:
        return recursive_function(modified_parameters)

2、示例:计算阶乘

阶乘是一个经典的适合用递归解决的问题。正整数 $n$ 的阶乘是所有小于等于 $n$ 的正整数的乘积,记作 $n!$。

def factorial(n):
    if n == 0 or n == 1:
        return 1
    else:
        return n * factorial(n - 1)
print(factorial(5))

在这个例子中,当 n 为 0 或 1 时,这是基本情况,直接返回 1。当 n 大于 1 时,通过递归调用 factorial(n - 1) 来计算 $(n - 1)!$,然后再乘以 n 得到 n!。

3、注意事项

A. 必须有终止条件:

如果没有终止条件,递归将无限进行下去,导致栈溢出错误。在设计递归函数时,一定要确保在某个条件下函数不再进行递归调用,而是返回一个确定的值。

B. 递归深度限制:

Python 对递归深度有一定的限制,可以通过 sys.getrecursionlimit() 查看当前的递归深度限制,默认情况下一般为 1000 层左右。如果递归深度超过这个限制,会引发 RecursionError 异常。

C. 可能的性能问题:

递归调用会占用较多的内存和时间,特别是在处理大规模问题时。对于一些可以用迭代方式更高效解决的问题,应优先考虑迭代而不是递归。

递归是一种强大的编程技术,但需要谨慎使用,确保其正确性和效率。

七、空函数

在 Python 中,可以使用 pass 语句来定义一个空函数。

以下是定义空函数的方法:

def empty_function():
    pass

这里定义了一个名为 empty_function 的函数,函数体中只有一个 pass 语句,表示不进行任何操作。

pass 语句在 Python 中常用来作为占位符,当代码结构需要一个语句但暂时不想实现具体功能时,可以使用 pass。这样可以使代码在语法上完整,同时也方便后续逐步完善函数的功能。

八、内置函数

Python 提供了许多内置函数,如 len()、sum()、max()、min() 等,可以直接使用。

(一)、数学运算相关

1. abs(x):返回数字的绝对值。

示例:abs(-5) 返回 5。

2. round(number[, ndigits]):将数字四舍五入到指定的小数位数。

示例:round(3.14159, 2) 返回 3.14。

3. pow(x, y[, z]):返回 x 的 y 次幂;如果提供了 z,则返回 x 的 y 次幂对 z 取余的结果。

示例:pow(2, 3) 返回 8;pow(2, 3, 5) 返回 3。

4. sum(iterable[, start]):对可迭代对象中的元素求和,并可以指定起始值。

示例:sum([1, 2, 3]) 返回 6;sum([1, 2, 3], 4) 返回 10。

(二)、类型转换相关

1. int(x[, base]):将数字或字符串转换为整数,可以指定进制。

示例:int('10') 返回 10;int('10', 2) 返回 2(将二进制字符串 '10' 转换为整数)。

2. float(x):将数字或字符串转换为浮点数。

示例:float('3.14') 返回 3.14。

3. str(x):将对象转换为字符串。

示例:str(123) 返回 '123'。

4. bool(x):将对象转换为布尔值。

示例:bool(0) 返回 False;bool(1) 返回 True。

(三)、序列操作相关

1. len(s):返回对象的长度(元素个数)。

示例:len([1, 2, 3]) 返回 3;len('hello') 返回 5。

2. range(start, stop[, step]):生成一个整数序列。

示例:list(range(5)) 返回 [0, 1, 2, 3, 4];list(range(1, 10, 2)) 返回 [1, 3, 5, 7, 9]。

3. reversed(seq):反转一个序列。

示例:list(reversed([1, 2, 3])) 返回 [3, 2, 1]。

4. sorted(iterable[, key][, reverse]):对可迭代对象进行排序,并返回一个新的已排序列表。

示例:sorted([3, 1, 2]) 返回 [1, 2, 3];sorted(['apple', 'banana', 'cherry'], key=len) 按照字符串长度排序。

(四)、其他常用函数

1. print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False):将对象打印到文本流,默认输出到控制台。

示例:print('Hello', 'World!', sep=', ', end='.') 输出 Hello, World!.。

2. input(prompt):接收用户输入,并返回一个字符串。

示例:name = input('What is your name? '),程序会等待用户输入名字,并将其赋值给 name 变量。

3. open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None):打开一个文件,并返回一个文件对象。

示例:with open('file.txt', 'r') as f: content = f.read(),打开名为 file.txt 的文件进行读取。

4. enumerate(iterable, start=0):将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标。

示例:for index, value in enumerate(['a', 'b', 'c']): print(index, value),输出 0 a、1 b、2 c。

5. zip(*iterables):将多个可迭代对象组合成一个元组序列,每个元组包含来自各个可迭代对象的对应元素。

示例:list(zip([1, 2, 3], ['a', 'b', 'c'])) 返回 [(1, 'a'), (2, 'b'), (3, 'c')]。

Python编程语言基础