如何解决如何使用函数创建与给定参数相关的持久性列表?
我正在编写脚本来查找不同股票的移动平均线。该脚本连续运行,遍历我的API调用,以将当前价格添加到列表中,然后取平均。这很好用,但是我希望能够将其放入一个函数中,我唯一需要输入的就是股票名称。我希望该脚本可以同时处理我想要指定的许多股票。那就是我遇到的问题,因为对于我拥有的每只股票,我都需要预先定义一个空列表以容纳定价信息。
我一直在尝试使用股票名称来创建相关列表,但是据我所知,使用一个变量名称来创建另一个变量并不是一个好主意,所以我不确定该怎么做。做。我相信这里通常的解决方案是使用字典,但是我一般是编程的初学者,所以我还没有弄清楚如何使其适合我的情况。任何帮助将不胜感激。
def sma(stock_name):
list_exists = stock_name + "_list" in locals() or stock_name + "_list" in globals()
if list_exists:
print()
else:
stock_name + "_list" = [] # Problem line,I would like for this to create a list called stock_name_list
stock_price = requests.get("myapi.com",params={"stock_name": stock_name,"bla bla": "blah"})
stock_name_list.append(stock_price)
解决方法
当您有基于特定于该操作的数据版本的操作时,通常是考虑使用类的好时机。提出的这个特定类将封装股票名称,特定于该股票的数据列表,并对它执行sma
:
class Stock:
n = 10
def __init__(self,name):
self.name = name
self.data = []
def sma(self):
stock_price = requests.get("myapi.com",params={"stock_name": self.stock_name,"bla bla": "blah"})
self.data.append(stock_price)
window = self.data[-n:]
return sum(window) / len(window)
现在,您可以维护这些对象的字典。每当您遇到新库存时,只需在字典中添加一个项目即可:
stocks = {}
def sma(name):
stock = stocks.get(name)
if name is None: # None is what get returns when the key is missing
stock = Stock(name)
stocks[name] = stock
return stock.sma()
令人高兴的是,您现在有了一个命名数据集的字典。如果要添加其他统计信息,只需在实现该功能的Stock
类中添加一个方法。
我在这里定义了一个全局sma
函数,该函数对在字典中找到的对象调用同名方法。如果使用名称而不是实例来静态调用该方法,则可以使该方法执行该函数的操作,从而可以对封装进行封装。例如:
class Stock:
n = 10
named_stocks = {} # This is a class variable that replaces the global stocks
def __init__(self,name):
self.name = name
self.data = []
def sma(self):
if isinstance(self,str):
self = Stock.get_stock(self)
stock_price = requests.get("myapi.com","bla bla": "blah"})
self.data.append(stock_price)
window = self.data[-n:]
return sum(window) / len(window)
@classmethod
def get_stock(cls,name):
stock = cls.named_stocks.get(name)
if stock is None:
stock = cls(name)
cls.named_stocks[name] = stock
return stock
现在可以检查isinstance(self,str)
了,您可以通过以下两种方法之一调用sma
方法。您可以直接在一个拥有自己名称的实例上进行所有操作:
aapl = Stock('AAPL')
aapl.sma()
OR
Stock.get_stock('AAPL').sma()
或者,您可以在类上调用它,并传递一个名称:
Stock.sma('AAPL')
,
from collections import defaultdict
stock_name_to_stock_prices = defaultdict(list)
stock_name_to_stock_prices['STOCK_NAME'].append(123.45)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。