题目:自然数的阶乘
n
!
=
1
⋅
2
⋅
3
⋯
n
,
0
!
=
1
{n!=1 \cdot 2 \cdot 3 \cdots n, 0!=1}\\
n!=1⋅2⋅3⋯n,0!=1
今天被要求简单实现下阶乘算法,但是没有做容错处理,现在整理一下,解决了输入为bool类型数据的bug
装饰器实现
def is_natural_num(func):
"""校验函数的第一个参数是否是自然数"""
def call_func(*args, **kwargs):
# 参数校验:判断args[0]是否是自然数
assert type(args[0]) == int and args[0] >= 0, '请输入大于等于0的整数'
return func(*args, **kwargs)
return call_func
@is_natural_num
def factorial(num: int):
"""求自然数的阶乘"""
if num == 0:
return 1
else:
return num * factorial(num-1)
if __name__ == '__main__':
print(factorial(17))
此方法的业务逻辑分离较好,逻辑性较好
普通方法实现
def factorial(num):
"""求自然数的阶乘"""
# 参数校验:自然数才有阶乘
assert type(num) == int and num >= 0, '请输入大于等于0的整数'
def func(num):
if num == 0:
return 1
else:
return num * func(num-1)
return func(num)
if __name__ == '__main__':
print(factorial(17))
此方法逻辑未分开,但是实现了递归时不会多次进行数据校验,此前的方法实现较差,贴出来做个对比
类方法实现
class Factorial(object):
def __init__(self, num: int):
# 校验num的数据类型是否为int,并且其值是否大于等于0
assert type(num) == int and num >= 0, '请输入大于0的整数'
self.num = num
def __call__(self):
return self.factorial(self.num)
def factorial(self, num):
if num == 0:
return 1
else:
return num * self.factorial(num-1)
if __name__ == '__main__':
factorial = Factorial(0)
print(factorial())
旧版本判断太复杂,贴出来提醒下自己