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')]。