Python函数:平方函数的完整实现

在Python中,函数是代码组织的基本单位。本文将介绍一个完整的Python平方函数实现,包括参数验证、异常处理和类型注解。

一、函数定义

1
2
3
4
5
6
7
8
9
10
11
12
13
def square(n: int) -> int:
"""
计算一个整数的平方

:param n: 输入整数
:type n: int
:return: 输入整数的平方
:rtype: int
:raise: ValueError
"""
if not isinstance(n, int):
raise ValueError("Input must be an integer")
return n * n

二、函数分析

1. 函数签名

1
def square(n: int) -> int:
  • 函数名square,直观表示函数功能
  • 参数n,类型注解为int,表示接受一个整数
  • 返回类型-> int,表示返回一个整数

2. 文档字符串

1
2
3
4
5
6
7
8
9
"""
计算一个整数的平方

:param n: 输入整数
:type n: int
:return: 输入整数的平方
:rtype: int
:raise: ValueError
"""
  • 使用了reStructuredText格式的文档字符串
  • 清晰说明了函数的功能、参数、返回值和可能的异常
  • 文档与实现一致,明确声明了可能抛出ValueError

3. 函数体

1
2
3
if not isinstance(n, int):
raise ValueError("Input must be an integer")
return n * n
  • 包含参数验证,确保输入为整数
  • 验证失败时抛出ValueError异常
  • 简洁直接,返回输入整数的平方

三、函数使用示例

1. 基本使用

1
2
3
4
5
6
7
8
9
# 调用square函数
result = square(5)
print(result) # 输出: 25

result = square(10)
print(result) # 输出: 100

result = square(-3)
print(result) # 输出: 9

2. 类型注解验证

1
2
3
4
5
6
7
8
9
# 使用类型检查工具验证类型
# 例如使用mypy
# mypy example.py

# 正确使用
square(42) # 类型正确

# 类型错误(会被mypy检测到)
# square("42") # 类型错误:期望int,得到str

3. 异常处理

当传入非整数参数时,函数会抛出ValueError

1
2
3
4
5
6
7
8
9
try:
result = square("5")
except ValueError as e:
print(f"Error: {e}") # 输出: Error: Input must be an integer

try:
result = square(3.14)
except ValueError as e:
print(f"Error: {e}") # 输出: Error: Input must be an integer

四、函数特性

1. 类型注解

  • 使用了Python 3.5+引入的类型注解
  • 提高了代码的可读性和可维护性
  • 可以使用类型检查工具(如mypy)进行静态类型检查

2. 文档字符串

  • 使用了reStructuredText格式的文档字符串
  • 遵循了Python的文档字符串规范
  • 清晰说明了函数的功能、参数、返回值和异常

3. 参数验证

  • 包含完整的参数类型验证
  • 验证失败时抛出明确的异常信息
  • 确保函数的健壮性

4. 简洁性

  • 函数实现简洁明了,逻辑清晰
  • 符合Python的设计哲学:"简单胜于复杂"

五、扩展版本

支持浮点数的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
def square(n: float) -> float:
"""
计算一个数的平方

:param n: 输入数(整数或浮点数)
:type n: float
:return: 输入数的平方
:rtype: float
:raise: ValueError
"""
if not isinstance(n, (int, float)):
raise ValueError("Input must be a number")
return n * n

支持任意数字类型的版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def square(n) -> float:
"""
计算一个数的平方

:param n: 输入数
:type n: int or float
:return: 输入数的平方
:rtype: float
:raise: ValueError
"""
try:
return n * n
except TypeError:
raise ValueError("Input must be a number")

六、单元测试

为了确保函数的正确性,可以编写单元测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import unittest

class TestSquareFunction(unittest.TestCase):
def test_positive_integer(self):
self.assertEqual(square(5), 25)
self.assertEqual(square(10), 100)

def test_negative_integer(self):
self.assertEqual(square(-3), 9)
self.assertEqual(square(-10), 100)

def test_zero(self):
self.assertEqual(square(0), 0)

def test_non_integer(self):
with self.assertRaises(ValueError):
square("5")
with self.assertRaises(ValueError):
square(3.14)
with self.assertRaises(ValueError):
square([1, 2, 3])

if __name__ == "__main__":
unittest.main()

七、性能分析

对于大整数的平方计算,Python的内置乘法操作已经相当高效:

1
2
3
4
5
6
7
8
9
10
11
12
import time

def benchmark_square():
# 测试大整数
large_number = 10**6
start = time.time()
result = square(large_number)
end = time.time()
print(f"Time to square {large_number}: {end - start:.6f} seconds")
print(f"Result: {result}")

benchmark_square()

八、总结

square函数是一个完整的Python函数示例,展示了:

  1. 函数定义:使用def关键字定义函数
  2. 类型注解:使用类型注解提高代码可读性
  3. 文档字符串:使用reStructuredText格式编写文档
  4. 参数验证:添加参数类型检查,确保函数健壮性
  5. 异常处理:在参数无效时抛出明确的异常
  6. 函数实现:简洁直接的实现逻辑