谁能解释为什么[Unit]
Description=App
[Service]
ExecStart=sudo /usr/bin/python3 /home/pi/script.py
WorkingDirectory=/home/pi/
Restart=always
User=pi
[Install]
WantedBy=multi-user.target
是
fib()接受1个位置参数,但给定2个参数。
当我只给它一个参数=> TypeError
!
还可以在保留类实例化的同时,提出解决问题的解决方案?
我觉得“自我”使用过多,尤其是在添加的更多方法中。可以改善吗?
只是想把我的头放在一些基础知识上!感谢所有反馈。
self.fib(self.n - 1)
答案 0 :(得分:2)
方法的第一个参数是self
,它指向方法被调用的 object 。如所显示的,如果您希望传递参数(看起来像n
),则需要在方法的签名中包含该参数。
答案 1 :(得分:1)
此函数接受一个参数self
,但以下行:self.fib(self.n - 1)
尝试传递2:self
和self.n - 1
。
答案 2 :(得分:1)
当您第一次在
中调用fib()时print(first_func.fib())
除了隐式self外,您不传递任何参数。在下一个调用中,您传递1 arg,使其变为2(包括隐式self)
self.fib(self.n-1)
这提供了TypeError:fib()接受1个位置参数,但给出了2个
有关斐波那契的简单实现:
def fib(n):
if n==0 or n==1:
return 1
else:
return (fib(n-1) + fib(n-2))
答案 3 :(得分:1)
类型错误可能意味着很多事情。在这种情况下,这意味着您向函数传递了太多参数。看起来您正在使用参数调用 self.fib 。您仅使用 self 作为参数定义了它。从您编写代码的方式来看,您似乎认为需要将 self 作为参数传递。事实是,它是一个不可见的参数,在调用函数时已经传递了。
做这样的事情:
class math_func:
def __init__(self, '''...'''):
#...
def fib(self):
#...
self.n = self.n - 1
self.fib()
或
class math_func:
def __init__(self, '''...'''):
#...
def fib(self):
#...
self.fib2(self.n -1)
def fib2(self, n: int):
#...
#same thing as fib with slight changes
或
class math_func:
def __init__(self, '''...'''):
#...
def fib(self, n: int):
#...
self.fib(self.n - 1)
def getN(self):
return self.n
fib = math_func('''...''')
print(fib.fib(fib.getN())
答案 4 :(得分:0)
您需要将n包含在fib的内容中
def fib(self, n):
...
还有一点补充:如果您定义递归函数,则应考虑使用lru_cache装饰器以提高性能。
from functools import lru_cache
...
@lru_cache(500) # 500 is the cache size
def fib(self, n):
...