2015-11-05 65 views
-1

我有以下程序從網站中取消數據。我想通過使用帶有收益率的發電機而不是多次調用generate_urlcall_me來改進以下代碼。這種exersise的目的是正確理解yield和它可以使用的上下文。在python中使用`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]) 
+3

那麼......問題是什麼? – user2357112

+0

@ user2357112 - 關於如何在此上下文中使用yield。 – liv2hak

+0

可能重複[在Python中yield關鍵字有什麼作用?](http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python) – ppperry

回答

2

有多種選擇。您可以使用yield來迭代URL。或者通過請求對象。

如果您的index_list長,我會建議產生URL。 因爲您可以使用multiprocessing.Pool來映射執行請求的函數並將輸出保存在這些URL上。這將並行執行它們,可能會讓它快很多(假設你有足夠的網絡帶寬,並且雅虎財務不會限制連接)。

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')) 
+0

上面的符號是什麼?我認爲index_list應該被定義爲符號。 – liv2hak

+1

@ liv2hak在最後一行叫'genurl'時...... –

+0

非常感謝。這真的清除了我的理解。 – liv2hak

1

如果我理解正確的話,你想知道是如何改變的代碼,這樣就可以通過

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(...)。你不會做任何事情,只是一個正常的函數調用。

相關問題