Исходники удобно печатать! Напечатанные, они выглядят так же, как и на экране.
Sources are printable! Being printed, they are the same like on screen.
Исходники удобно печатать! Напечатанные, они выглядят так же, как и на экране.
Sources are printable! Being printed, they are the same like on screen.
Генератором в python называется такая конструкция, возвращающая заместо коллекции итератор по этой коллекции.
def usual_function():
"""
обычная функция, возвращающая список
"""
return [2 * i for i in range(10)]
print "Usual function: {0}".format(usual_function())
Usual function: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
def usual_generator():
"""
обычный генератор
"""
for i in range(10):
yield 2 * i
g = usual_generator()
print "Usual generator: {0}".format(g)
print "Iterating usual generator:"
for j in g:
print j,
print
Usual generator:
Iterating usual generator:
0 2 4 6 8 10 12 14 16 18
Так же генераторы могут возвращать итераторы по бесконечным последовательностям
def endless_prime_generator():
"""
бесконечный генератор простых чисел (построенный на решете Эратосфена)
"""
used_primes = []
current_n = 2
while True:
is_prime = True
for p in used_primes:
if current_n % p == 0:
is_prime = False
break
if is_prime:
used_primes.append(current_n)
yield current_n
current_n += 1
primes = endless_prime_generator()
print "Iterating endless prime generator"
for i in range(10):
print primes.next(),
print
Iterating endless prime generator
2 3 5 7 11 13 17 19 23 29
Но совсем недавно я наткнулся на PEP-342, который вводит в генераторы новшество: теперь yield это не statement, а expression, то есть он может быть использован для присвоения значения какой-то переменной. Чтобы передать в генератор это значение используется метод send.
Простейший пример:
def coroutine():
data = "No data"
while True:
data = "data is {0}".format((yield data))
print "in generator: {0}".format(data)
g = coroutine()
print "First next(): {0}".format(g.next())
print "Then (yield) = None, because next() = send(None)"
for i in range(5):
print g.next()
print "We send Hello: this causes skipping one iteration. {0}".format(g.send("Hello"))
print "And one more example: {0}".format(g.send("Goodbye"))
First next(): No data
Then (yield) = None, because next() = send(None)
in generator: data is None
data is None
in generator: data is None
data is None
in generator: data is None
data is None
in generator: data is None
data is None
in generator: data is None
data is None
in generator: data is Hello
We send Hello: this causes skipping one iteration. data is Hello
in generator: data is Goodbye
And one more example: data is Goodbye
Первой выдачей генератора управлять нельзя. Поэтому первым возвращенным значением будет «No data». То есть выполнится конструкция (yield data). При следующем вызове next() (yield data) вернет None, (next() = send(None)). data станет равна data is None. При вызове send(«Hello») генератор «просыпается», yield data возвращает «Hello», data = «data is Hello», и в таком значении она и возвращается.
Как вы думаете, какие преимущества и недостатки у аспирантуры?
Из преимуществ я вижу: возможность позаниматься сложными задачами, не привести мозг к застою. Возможно, каким-то новые перспективы, связанные с кандидатской степенью. Так же, как мне кажется, о высшем образовании теперь свиделельствует ни диплом «20 минут позора и вы инженер», а кандидатская диссертация. Может быть, когда Сколково развернется, то это будет хорошей инвестицией.
Из недостатков вижу: опять жизнь, разрывающая между работой и учебой, не оставляющая времени на друзей и семью. Невозможность реализации каких-то собственных проектов в свободное время.
Может быть еще дополню.
Был озадачен неприятностью: слетел один из дисков raid0-массива (но на то он и raid0, чтобы не хранить на нем важные вещи). Пришлось в срочном порядке переустанавливать систему на близнеца, который не знаю сколько продержится. Для того, чтобы спокойно спать по ночам, решил делать бэкапы всего того, что мигрировало с raid1 на непонятно когда сломающийся жесткий диск. Но как? Сначала скриптом обходил важные папки, архивировал и заливал на народ. А потом столкнулся с wuala.
Мне понравилось в ней все: кроссплатформенность, сама идея распределенного между пользователями хранилища, возможность продавать ресурсы своего HDD за Pro-доступ (что я и сделал), простой и понятный для меня интерфейс (конечно, консоль самая простая и понятная, но тут тоже вполне продумано).
Собственно, официальный сайт и регистрация с промокодом на 2 Гб вместо 1.
Послушал утром выступление Дмитрия Анатольевича: http://news.kremlin.ru/news/9126 и вот странным кажется, то, что ответов на вопросы он не дал: неужели братская помощь заключается в скидках на нефть и газ? Да, конечно, это очень хорошо для белоруссов, что они есть, но все же как-то не по-братски. Потому и говорят так. Да, стоит заметить, что у Белоруссии нет такой трубы в бюджете, в которую втекают триллионы долларов просто так каждый год. Да, живут они скромнее во вмногом, насколько мне известно, но из тех же данных можно понять, что они как ни одна другая страна, самодостаточны.
В чем я не прав?
http://piligrim-67.livejournal.com/1044533.html
http://piligrim-67.livejournal.com/1044935.html
I’m loveing it!
let canonicalize_headers (headers: WebHeaderCollection) = String.concat "" ( Array.map (fun (x : string) -> String.Format("{0}:{1}\n", x.ToLower(), headers.Get(x))) ( Array.sort ( Array.filter (fun (x : string) -> x.StartsWith("x-ms-")) headers.AllKeys ) ) )
Ура! Свершилось!
http://buy.skype.com/paymonthly/#RU
Так же хочу показать предложение от нового (перспективного) провайдеда VoIP: компании Google по сравнению с ценами Skype
Долой дорогую, некачественную мобильную связь!
Выложил свой код для более удобного обозрения на codeplex. Можно присоединяться ко мне! http://functionalazure.codeplex.com/
В одном очень хорошем блоге есть хорошая статья о начале работы с REST API к Windows Azure Storage Services.
Но информации по некоторым вопросам там явно недостаточно. Автор, к сожалению, не дает с собой связаться. Так же странно себя ведет документация к REST API. Я потратил почти 6 часов на то, чтобы понять, что фильтры не входят в параметры канонизации строки. И исходников .NET не видно. Создавал на C# классы, пробовал-пробовал, отлаживал-отлаживал. Вроде, прорвался через фильтрацию.
И вот что мне очень не нравится в F# — его сильная ориентированность на .NET. Я, конечно, понимаю, что он так и задумывался. Но о какой автоматической параллельности может идти речь, если приходится вызывать в коде потоконебезопасные методы со сторонними эффектами?
Под катом продолжение моей библиотеки на F# для работы с Azure
«Никогда не участвуйте во фрилансе, если хотите заработать. Никогда!» — это, замечу, не мои слова — «Если хотите набраться опыта, получить навыки продаж, общения, впаривания — наздоровья. Но за деньгами во фриланс не ходите никогда»
Вот и я теперь так же думаю, не могу уже 4 месяца доудовлетворить заказчика с проектом, ядро которого сделал за неделю. Не моё это, наверное, наводить финальный лоск. Зато теперь знаю это.