среда, 13 ноября 2013 г.

5. Поделка для сына. Дни 8-12.

На 8 день начал строительство крыши. Замерил и отпилил бревна под стропилы. Установил стойки и коньковый прогон, на котором сделал соединение стропил. После того как застыл клей соединяющий стропила, я убрал переднюю стойку, чтоб не мешала потом делать фронтон.

вторник, 12 ноября 2013 г.

4. Поделка для сына. Дни 2-7.

Подготовка большого количества бревен в первый день несколько утомила, поэтому на второй решил внести небольшое разнообразие и занялся подготовкой фундамента.

понедельник, 11 ноября 2013 г.

3. Поделка для сына. День 1.

Работа началась!

Для начала я подготовил рабочее место, накрыл журнальный столик куском пластика и прикрутил к нему тиски.

Посчитал масштаб своей будущей постройки, вычислил необходимую длинну бревен и приступил к их изготовлению.

Бревна для модели сруба.

2. Поделка для сына. Шоппинг.

Сруб я собирался делать с рубкой углов "в чашу". Поэтому обдумывал, каким инструментом это можно сделать.
Рубка стен "в чашу".
Первое, что пришло в голову, это использовать напильник круглого сечения со средней насечкой, с диаметром, примерно равным диаметру бревна. Но в строительном магазине я нашел более интересное решение, это дремель с подходящими насадками.

четверг, 7 ноября 2013 г.

1. Поделка для сына. Начало.



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

Дружно мы взялись за дело и работа закипела!

воскресенье, 18 августа 2013 г.

Проверка существования ключа в словаре.

Обработка исключений

try:
 d[key] = d[key] + 1
except KeyError:
 d[key] = 1

Метод has_key

if d.has_key(key):
 d[key] = d[key] + 1
else:
 d[key] = 1

Метод setdefault

d[key] = d.setdefault(key, 0) + 1

Метод get

d[key] = d.get(key, 0) + 1

Оператор in

if key in d:
 d[key] = d[key] + 1
else:
 d[key] = 1
  1. Если предполагается почти 100% существование ключей в словаре, то инструкция try except будет самой эффективной на любом наборе данных.
  2. Если искомый ключ часто не существует, то инструкция try except окажется самой медленной из возможных решений.
  3. Метод has_key эффективно работает с небольшими наборами данных, на больших ведет себя хуже.
  4. Методы setdefault и get почти одинаковы по скорости, setdefault незначительно выигрывает.
  5. Хорошие показатели достигаются с оператором in и на маленьких и на больших наборах данных.


Если есть сомнения что лучше выбрать в конкретной ситуации, лучше использовать оператор in.
А еще лучше - тестировать.

Информацию нашел здесь http://wiki.gungfu.de/Main/PythonIdioms
По этой ссылке полное описание тестов с результатами.

понедельник, 24 июня 2013 г.

Pattern. Singleton (Одиночка).

Одиночка (англ. Singleton) в программировании — порождающий шаблон проектирования.
Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.

class Singleton(object): 
    __instance = None 
    def __new__(cls): 
        if cls.__instance is None: 
            cls.__instance = super(C, cls).__new__(cls) 
        else: 
            cls.__init__ = lambda x: None 
        return cls.__instance

Просмотрел массу решений, в том числе отсуда. В итоге больше понравилось одно из этих, его и опубликовал с небольшими изменениями.

UPD: А вот так еще краше получилось

class Singleton(object):
    def __new__(cls):
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__new__(cls)
        else:
            cls.__init__ = lambda x: None
        return cls.instance

среда, 17 апреля 2013 г.

Checkio. Домашний пароль.

Сделать проверку безопасности пароля. Пароль будет считаться достаточно сильным, если его длина больше или равна 10 символам, имеет хотя бы одну цифру, одну букву верхнего регистра, и одну строчную.

Input: Строка, которая является паролем.
Output: True, если пароль безопасен.

checkio('A1213pokl')==False
checkio('bAse730onE')==True
checkio('asasasasasasasaas')==False
checkio('QWERTYqwerty')==False
checkio('123456123456')==False
checkio('QwErTy911poqqqq')==True
Решение:
import re

def checkio(data):
    'Return True if password strong and False if not'
    c = re.compile(r'(?=.{10,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])')
    return bool(c.match(data))
    

if __name__ == '__main__':
    assert checkio('A1213pokl')==False, 'First'
    assert checkio('bAse730onE4')==True, 'Second'
    assert checkio('asasasasasasasaas')==False, 'Third'
    assert checkio('QWERTYqwerty')==False, 'Fourth'
    assert checkio('123456123456')==False, 'Fifth'
    assert checkio('QwErTy911poqqqq')==True, 'Sixth'
    print('All ok')

вторник, 16 апреля 2013 г.

Checkio. Банкомат.

Input: Список целых чисел: первое значение означает баланс счета, второе значение является списком сумм, которые требуется снять.
Output: Баланс счета после всех операций (integer).
# Withdraw without any incident
# 120 - 10 - 0.5 - 1% (10*0.01) = floor(109.4) = 109
# 109 - 20 - 0.5 - 1% (20*0.01) = floor(88.3) = 88
# 88 - 30 - 0.5 - 1%(30*0.01) = floor(57.2) = 57
checkio([120, [10, 20, 30]]) == 57
checkio([120, [200, 10]]) == 109
checkio([120,[3, 10]]) == 109
checkio([120, [200 , 119]]) == 120
checkio([120, [120, 10, 122, 2, 10, 10, 30, 1]]) == 56
Решение:
from math import floor

def checkio(data):
    balance, withdrawal = data

    for withdraw in withdrawal:
        if not withdraw % 5 and withdraw > 0:
            new_balance = floor(balance - withdraw - 
                                0.5 - withdraw * 0.01)
        else:
            continue

        if new_balance >= 0:
            balance = new_balance

    return int(balance)


if __name__ == '__main__':
    assert checkio([120, [10 , 20, 30]]) == 57, 'First'

    # With one Insufficient Funds, and then withdraw 10 $
    assert checkio([120, [200 , 10]]) == 109, 'Second'

    #with one incorrect amount
    assert checkio([120, [3, 10]]) == 109, 'Third'

    assert checkio([120, [200, 119]]) == 120 , 'Fourth'

    assert checkio([120, [120, 10, 122, 2, 10, 10, 30, 1]]) == 56, "It's mixed all base tests"
    
    print('All Ok')

Checkio. Предложение с лишними пробелами.

Дается строка в виде предложения. Удалить все лишние пробелы.

Input: Предложение в строковой переменной.
Output: Предложение без лишних пробелов.
checkio('I  like   python') == "I like python"
Решение:
def checkio(string):
    'return sentence without extra spaces'
    while string.find('  ') != -1:
        string = string.replace('  ', ' ')
    return string


if __name__ == '__main__':
    assert checkio('I  like   python') == "I like python", 'First'
    print('All ok')