Поиск изобретенного примера кода: продолжения!

закомментируйте свой цикл for и попробуйте это

def get_data(x):
    try:
        r = requests.get('https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + x + '?formatted=true&crumb=8ldhetOu7RJ&lang=en-US&region=US&modules=defaultKeyStatistics%2CfinancialData%2CcalendarEvents&corsDomain=finance.yahoo.com')
        data = r.json()
        financial_data = data['quoteSummary']['result'][0]['defaultKeyStatistics']
        return financial_data['yield']
    except:
        return 'error'


df['Yield'] = df['Symbol'].apply(lambda x: get_data(x))

, если вы не хотите использовать apply, вы можете использовать индексацию, которая была бы быстрее

for i in df.index:
    x = df.at[i, 'Symbol']
    try:
        r = requests.get(
            'https://query2.finance.yahoo.com/v10/finance/quoteSummary/' + x + '?formatted=true&crumb=8ldhetOu7RJ&lang=en-US&region=US&modules=defaultKeyStatistics%2CfinancialData%2CcalendarEvents&corsDomain=finance.yahoo.com')
        data = r.json()
        financial_data = data['quoteSummary']['result'][0]['defaultKeyStatistics']
        df.at[i, 'Yield'] = financial_data['yield']
    except Exception as e:
        print(e)

в случае ошибки его столбец Yield будет иметь значение Nan

5
задан Mat 30 April 2012 в 12:09
поделиться

2 ответа

Да, продолжения могут быть довольно изнурительными. Вот хорошая загадка, которую я нашел некоторое время назад - попытайтесь выяснить, что напечатано и почему:

(define (mondo-bizarro)
  (let ((k (call/cc (lambda (c) c)))) ; A
    (write 1)
    (call/cc (lambda (c) (k c))) ; B 
    (write 2)
    (call/cc (lambda (c) (k c))) ; C
    (write 3)))

(mondo-bizarro)

Объяснение того, как это работает (содержит спойлеры!):

  1. Первый call / cc store возвращает его собственное продолжение и сохраняет его в k .
  2. Число 1 записывается на экран.
  3. Текущее продолжение, которое должно продолжаться в точке B, возвращается в k, которое возвращается к A
  4. На этот раз k теперь связано с продолжением, которое мы получили в B
  5. Число 1 снова записывается на экран
  6. Текущее продолжение, которое продолжить в точке B, возвращается к k, которое является другим (но другим) продолжением к другой точке B
  7. Как только мы вернулись в исходное продолжение, оно ' Важно отметить, что здесь k все еще связано с A
  8. Число 2 записывается на экран
  9. Текущее продолжение, которое должно продолжаться в точке C, возвращается к k, которое возвращается к A
  10. На этот раз k теперь связано с продолжением, которое мы получили в C
  11. Число 1 снова записывается на экран
  12. Текущее продолжение, которое должно продолжаться при точка B возвращается к k, который возвращается к C
  13. Число 3 записывается на экран
  14. И все готово

Следовательно, правильный вывод - 11213 . Самая распространенная претензия, которую я поставил жирным шрифтом - важно отметить, что когда вы используете продолжения для «сброса» значения k, это не влияет на значение k обратно в исходном продолжении.

5
ответ дан 14 December 2019 в 01:16
поделиться

У курса языков программирования Университета Брауна есть проблема , установленная для продолжений , общедоступных.

4
ответ дан 14 December 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: