在python中使用'yield'关键字的上下文

2024-05-19 17:02:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下程序从网站上删除数据。我想通过使用具有yield的生成器来改进下面的代码,而不是按顺序多次调用generate_urlcall_me。这个练习的目的是正确地理解yield和它可以使用的上下文。你知道吗

import requests                                                                                                                                                                                              
import shutil

start_date='03-03-1997'
end_date='10-04-2015'
yf_base_url ='http://real-chart.finance.yahoo.com/table.csv?s=%5E'
index_list = ['BSESN','NSEI']

def generate_url(index, start_date, end_date):
    s_day = start_date.split('-')[0] 
    s_month = start_date.split('-')[1]
    s_year = start_date.split('-')[2]

    e_day = end_date.split('-')[0] 
    e_month = end_date.split('-')[1]
    e_year = end_date.split('-')[2]
    if (index == 'BSESN') or (index == 'NSEI'):
        url = yf_base_url + index + '&a={}&b={}&c={}&d={}&e={}&f={}'.format(s_day,s_month,s_year,e_day,e_month,e_year)
        return url 

def callme(url,index):
    print('URL {}'.format(url))
    r = requests.get(url, verify=False,stream=True)
    if r.status_code!=200:
        print "Failure!!"
        exit()
    else:
        r.raw.decode_content = True
        with open(index + "file.csv", 'wb') as f:
            shutil.copyfileobj(r.raw, f)
        print "Success"

if __name__ == '__main__':
    url = generate_url(index_list[0],start_date,end_date)
    callme(url,index_list[0])
    url = generate_url(index_list[1],start_date,end_date)
    callme(url,index_list[1])

Tags: urldateindexifyearstartgeneratelist
2条回答

如果我理解正确的话,您想知道的是如何更改代码,以便用

if __name__ == '__main__':
   for url in generate_url(index_list,start_date,end_date):
       callme(url,index)

如果这是正确的,您需要更改generate_url,而不是callme。改变generate_url是相当机械的。使第一个参数index_list而不是index,将函数体包装在for index in index_list循环中,并将return url更改为yield url。你知道吗

你不需要改变callme,因为你从来不想说for call in callme(...)这样的话。除了一个普通的函数调用,你什么都不会做。你知道吗

有多种选择。您可以使用yield来迭代URL或请求对象。你知道吗

如果您的index_list很长,我建议您生成url。 因为这样您就可以使用multiprocessing.Pool映射执行请求并通过这些url保存输出的函数。这将并行执行它们,可能会使其速度更快(假设您有足够的网络带宽,并且yahoo finance不会限制连接)。你知道吗

yf ='http://real-chart.finance.yahoo.com/table.csv?s=%5E'
    '{}&a={}&b={}&c={}&d={}&e={}&f={}'
index_list = ['BSESN','NSEI'] 

def genurl(symbols, start_date, end_date):
    # assemble the URLs
    s_day, s_month, s_year = start_date.split('-')
    e_day, e_month, e_year = end_date.split('-')
    for s in symbols:
        url = yf.format(s, s_day,s_month,s_year,e_day,e_month,e_year)
        yield url

def download(url):
    # Do the request, save the file

p = multiprocessing.Pool()
rv = p.map(download, genurl(index_list, '03-03-1997', '10-04-2015'))

相关问题 更多 >