ФорумПрограммированиеPython → Первый Python скрипт - Игра о пыха.ру )

Первый Python скрипт - Игра о пыха.ру )

  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 10:46, спустя 3 минуты 13 секунд

    {i: i * i for i in range(10)}

    и так тоже знал :)
  • adwo

    Сообщения: 913 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 10:50, спустя 3 минуты 41 секунду

    знал о том, как с помощью генератора получить хеш, но не знал, как список?)
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 11:06, спустя 16 минут 11 секунд


    знал о том, как с помощью генератора получить хеш, но не знал, как список?)
    да :) Видимо про списки главу хуево прочитал )
  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 11 декабря 2011 г. 13:50, спустя 2 часа 43 минуты 57 секунд


    http://www.scribd.com/doc/48714240/An-Introduction-to-the-Zen-of-Python


    http://pypi.python.org/pypi - аналог cpan для питона, круто! Но вот в классах не совсем понял, там взглядом слева поглядеть и кажется словно это не класс, а какой-то хак, по типу bless-objecting в перле. Однако слова class, object, init говорят обратное - что это уже было вшито в язык. Но зачем тогда писать self в параметрах функций классов?) Просто в перле ооп вообще нету) Но есть хак через элемент языка - bless, она изменяет тип переменной, для создания своего типа переменной.
    Спустя 42 сек.
    Ааа дошло там же скобочек то нету в питоне, вот он так и сигнализирует что это функция класса, я правильно понимаю?
  • adwo

    Сообщения: 913 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 14:43, спустя 52 минуты 56 секунд

    Ivan, просто методы в питоне всегда в качестве первого параметра принимают созданный объект. а то что его называют self - это просто соглашение. можно вот так :)

    class Hello:
       def __init__(haha, name):
           haha.name = name

       def say_hello(haha):
           return 'Hello, %s!' % haha.name

    h = Hello('pyha')
    print h.say_hello()
  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 11 декабря 2011 г. 14:58, спустя 14 минут 47 секунд

    а то что его называют self - это просто соглашение

    Да это то я понимаю, а вот зачем передавать переменную, а не использовать встроенную this (как в php и подобных)
  • adw0rd

    Сообщения: 22959 Репутация: N Группа: в ухо

    Spritz 11 декабря 2011 г. 15:08, спустя 9 минут 58 секунд

    Потомучто можно передавать инстанс unbound методам, пример:

    class X(object):
    def test(self):
    return "Hello!"

    x = X()
    x.test()

    y = X()
    X.test(y)
    https://smappi.org/ - платформа по созданию API на все случаи жизни
  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 11 декабря 2011 г. 15:15, спустя 6 минут 51 секунду

    А зачем это надо?
    Спустя 103 сек.
    Вообще это костыли какие-то
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 15:29, спустя 14 минут 26 секунд


    Видимо в предпоследней строчке имелось в виду in вместо ==
    И более по-питонячи юзать sys.platform вместо os.name.

    Да, точно. Насчет второго - пояснишь? Я, вот, например, в данном случае сомневаюсь.

    os - модуль работы с ОС. sys - модуль работы с python-платформой. И чисто формально получается, что sys "ближе". Но это такие уж совсем условности.

    По поводу генераторов и списковых выражений:


    ( i for i in range(100500) )


    Получаете генератор. А генераторы очень полезно использовать в цепочках типа:


    body = … # тут у нас например офигенно здоровая страница текста
    lines = (line for line in body.splitlines())
    first_words = (line.split(' ')[0] for line in lines)
    triple_codes = (word for first_words if len(word) == 3 and word[0].isdigit())
    for code in triple_codes:
       print code

    Вот мы взяли, например, какой-то лог. И вывели трехзначные кода, начинающиеся с цифры, которые встречаются вначале каждой линии.
    Тут профита ровно два: код хорошо читается и каждый из генераторов логически отделен от остальных. А во-вторых, всё произойдет в один прогон. Памяти потребуется не стопицот метров, а килобайт отсилы.






    Получите список. Если в предыдущем примере круглые скобочки поменять на квадратные, то на больших данных офигеете.
    Но при этом всё равно полезен, когда вы знаете, что вам нужен именно список. А использовать генераторы, а в конце писать list(some_generator) - некрасиво….



    { i for i in range(100500) }


    Получите множество. Тип set. Множества прекрасны, кто не верит, почитайте. Практических применений кучи, только надо не боятся :)


    word_list1 = … # текст со словами один
    word_list2 = … # текст со словами второй

    set1 = { word for i in  word_list1}
    set2 = { word for i in  word_list2}
    print set1 & set2 # выведет слова находящиеся в обоих списках
    print set1 - set2 # выведет слова находящиеся в первом списке, но нет во втором.


    Ну и так далее… Ещё, если у вас большой список и аналогичное множество, то конечно же el in list будет медленнее чем el in set
    Добавлю, что чтобы работала магия множеств с вашими классами, достаточно определить в них методы __eq__ и __hash__. Первый для сопоставления элементов, второй для уникального ключа в множестве (тут я коряво сказал конечно…).


    {k:v for … in ..}


    Просто словарь…

    Внимание! Синтаксический сахар для словарей и множеств, появился только в 2.7, в версиях ниже будете получать синтаксическую ошибку

  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 16:10, спустя 41 минуту 10 секунд

    mathete, чувак спасибо за разъяснения! :) Очень приятно видеть таких людей тут :)
  • tartar

    Сообщения: 186 Репутация: N Группа: Кто попало

    Spritz 11 декабря 2011 г. 17:38, спустя 1 час 27 минут 47 секунд

    Да в Python я нуб, буду усерднее учить данный язык :)
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 19:19, спустя 1 час 41 минуту 15 секунд

    По поводу this и self. Я не знаю как в php, но в python по своему сделан доступ к атрибутам. Довольно сложно и на первый взгляд запутанно. Но позволяет контролировать этот доступ причем разнообразно. Частый пример - методы экземпляра, статичные методы, методы класса, свойство


    class SomeClass(object):

    def instance_method(*args):
    print args

    @staticmethod
    def static_method(*args):
    print args

    @classmethod
    def class_method(*args)
    print args

    @property
    def just_property():
    return 'foo'

    inst = SomeClass()
    inst.instance_method('arg1', 'arg2')
    SomeClass.class_method('arg1', 'arg2')
    SomeClass.static_method('arg1', 'arg2')
    print inst.just_property # без скобок вызова


    Так вот, задекорировав вроде бы метод экземпляра, мы получаем метод класса, статический метод, или вообще не метод :)
    Поэтому первым аргументом может быть данный экземпляр (self), или класс (cls), первый переданный аргумент. А в случае property ожидать аргументы бессмысленно.

    PS: тему setter и deleter для пропертей специально не затрагивал.
  • Ivan

    Сообщения: 1316 Репутация: N Группа: Адекваты

    Spritz 11 декабря 2011 г. 19:44, спустя 24 минуты 58 секунд

    без скобок вызова

    Да это же спизжено из перла!
    sub PI {
    3.14;
    }

    print PI;
    print PI(); # одно и то же

  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 20:13, спустя 28 минут 45 секунд


    без скобок вызова

    Да это же спизжено из перла!
    sub PI {
    3.14;
    }

    print PI;
    print PI(); # одно и то же




    Ты действительно не видишь пропасть между тем, что написал я и ты?

    Ну и сам себя поправлю:
    А в случае property ожидать аргументы бессмысленно.

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



    @property
    def just_property(self):
    return 'foo'

  • adwo

    Сообщения: 913 Репутация: N Группа: Джедаи

    Spritz 11 декабря 2011 г. 20:27, спустя 13 минут 45 секунд

    Ты действительно не видишь пропасть между тем, что написал я и ты?

    причем ппц какая пропасть)

Пожалуйста, авторизуйтесь, чтобы написать комментарий!