Python阶乘实现
装饰器实现普通方法实现类方法实现
题目:自然数的阶乘
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
):
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):
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
())
旧版本判断太复杂,贴出来提醒下自己