"Кроме того, можно вставить некоторый код для ловли всех необработанных исключений. Прочитайте ссылку для большего количества информации, но основы являются этими двумя строками".
Это - ложь. Это раньше ловило все необработанные исключения в.NET 1.0/1.1, но это была ошибка, и это, как не предполагалось, и это было зафиксировано в.NET 2.0.
AppDomain.CurrentDomain.UnhandledException
только предназначается, чтобы использоваться в качестве последнего седана входа шанса, таким образом, можно зарегистрировать исключение перед выходами программы. Это выгода привычки исключение с 2,0 вперед (хотя в.NET 2.0, по крайней мере, существует значение конфигурации, можно изменить, чтобы заставить его действовать как 1,1, но это не методические рекомендации для использования этого.).
, который стоит отметить, что существует немного исключений, что Вы не можете выгода, такая как StackOverflowException и OutOfMemoryException. Иначе, поскольку другие люди предположили, что это могло бы быть исключение в фоновом потоке где-нибудь. Также я вполне уверен, Вы не можете поймать некоторые/все неуправляемые/собственные исключения также.
Вы можете написать генератор:
def running_average():
sum = 0
count = 0
while True:
sum += cauchy(3,1)
count += 1
yield sum/count
Или, учитывая генератор для чисел Коши и функцию полезности для текущей суммы генератор, у вас может быть аккуратное выражение генератора:
# Cauchy numbers generator
def cauchy_numbers():
while True:
yield cauchy(3,1)
# running sum utility function
def running_sum(iterable):
sum = 0
for x in iterable:
sum += x
yield sum
# Running averages generator expression (** the neat part **)
running_avgs = (sum/(i+1) for (i,sum) in enumerate(running_sum(cauchy_numbers())))
# goes on forever
for avg in running_avgs:
print avg
# alternatively, take just the first 10
import itertools
for avg in itertools.islice(running_avgs, 10):
print avg
Вы можете использовать сопрограммы. Они похожи на генераторы, но позволяют отправлять значения. Сопрограммы были добавлены в Python 2.5, так что это не будет работать в версиях до этого.
def running_average():
sum = 0.0
count = 0
value = yield(float('nan'))
while True:
sum += value
count += 1
value = yield(sum/count)
ravg = running_average()
next(ravg) # advance the corutine to the first yield
for i in xrange(10):
avg = ravg.send(cauchy(3,1))
print 'Running average: %.6f' % (avg,)
Для понимания списка:
ravg = running_average()
next(ravg)
ravg_list = [ravg.send(cauchy(3,1)) for i in xrange(10)]
Изменения:
next ()
вместо it.next ()
метод. Таким образом, он также будет работать с Python 3. Функция next ()
также была перенесена на Python 2.6 +. it.next ()
, либо самостоятельно определить функцию next
. У меня есть для вас два возможных решения. Обе функции являются просто общими функциями бегущего среднего, которые работают с любым списком чисел. (можно заставить работать с любой итерацией)
На основе генератора:
nums = [cauchy(3,1) for x in xrange(10)]
def running_avg(numbers):
for count in xrange(1, len(nums)+1):
yield sum(numbers[:count])/count
print list(running_avg(nums))
На основе понимания списка (на самом деле тот же код, что и ранее):
nums = [cauchy(3,1) for x in xrange(10)]
print [sum(nums[:count])/count for count in xrange(1, len(nums)+1)]
Совместимость с генератором На основе генератора:
Изменить : Это один я только что протестировал, чтобы узнать, смогу ли я легко сделать свое решение совместимым с генераторами и какова будет его производительность. Это то, что я придумал.
def running_avg(numbers):
sum = 0
for count, number in enumerate(numbers):
sum += number
yield sum/(count+1)
См. Статистику производительности ниже, она того стоит.
Характеристики производительности:
Изменить : Я также решил протестировать интересное использование Orip нескольких генераторов, чтобы увидеть влияние по производительности.
Используя timeit и следующее (1 000 000 итераций 3 раза):
print "Generator based:", ', '.join(str(x) for x in Timer('list(running_avg(nums))', 'from __main__ import nums, running_avg').repeat())
print "LC based:", ', '.join(str(x) for x in Timer('[sum(nums[:count])/count for count in xrange(1, len(nums)+1)]', 'from __main__ import nums').repeat())
print "Orip's:", ', '.join(str(x) for x in Timer('list(itertools.islice(running_avgs, 10))', 'from __main__ import itertools, running_avgs').repeat())
print "Generator-compatabile Generator based:", ', '.join(str(x) for x in Timer('list(running_avg(nums))', 'from __main__ import nums, running_avg').repeat())
Я получаю следующие результаты:
Generator based: 17.653908968, 17.8027219772, 18.0342400074
LC based: 14.3925321102, 14.4613749981, 14.4277560711
Orip's: 30.8035550117, 30.3142540455, 30.5146529675
Generator-compatabile Generator based: 3.55352187157, 3.54164409637, 3.59098005295
См. комментарии к коду:
Orip's genEx based: 4.31488609314, 4.29926609993, 4.30518198013
Результаты представлены в секундах и показывают, что метод нового генератора, совместимого с генератором LC , постоянно работает быстрее, однако ваши результаты могут отличаться. Я ожидаю, что огромная разница между моим исходным генератором и новым заключается в том, что сумма не рассчитывается на лету.