пятница, 9 октября 2009 г.

Python 3.1 По горячим следам

И вот последовала реакция на предыдущий пост.
Очень рад. Узнал много нового. Но раз уж появилось так много информации оформлю её отдельным сообщением.

Спасибо yamixxx и agibov за предоставленную информацию.

Итак что увидел меткий глаз по поводу скрипта кредитный калькулятор.



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

Согласен по поводу этого заявления. Но для меня был шанс попробовать в регулярные выражения в реальных условиях. Так что Почему бы и нет. Практика хороший учитель. А если не пробовать то никогда и не узнаешь. Мне например пришлось покопаться в документации что бы узнать что а Python по мимо строк "" и '' можно использовать буквенно интерпретируемую строку которая обозначается как:
r"выражение"
В первый раз когда я столкнулся с регулярными выражениями в Python выражение вот такого вида:
r"(?:-s *(\d*))|(?:-r *(\d*))|(?:-p *(\d*)(y)?)|(\/\?)|(-dfc)"
я записал как:
"(?:-s *(\\d*))|(?:-r *(\\d*))|(?:-p *(\\d*)(y)?)|(\\/\\?)|(-dfc)"
Так выглядит страшнее :).

2. Параметры строки лучше все же парсить getopt.

Спасибо за совет. Попытка найти как его использовать. Привела меня к источнику
Итак getopt - это модуль помогающий работать с командной строкой полученной из sys.argv.
Данный модуль предоставляет 2 функции и одно исключение
getopt.getopt(args, options[, long_options])
Разбирает переданную строку
args - командная строка
options - это строка в которой указанно какие параметры мы ожидаем
long_options - не обязательная опция в которой указываются имена поддерживаемых параметров
getopt.gnu_getopt(args, options[, long_options])
работает так же как и getopt() за исключением того что поиск GNU включен по умолчанию.
exception getopt.GetoptError
Данное исключение возникает когда найден не описанный параметр или когда параметр найден но нет его значения
exception getopt.error
Ссылка на предыдущее исключение

3. В питоне есть оператор **. DoPowerW не к чему.
Теперь то я точно знаю как возводить в степень.

4. Оператор % для строк устарел. у питон 3.0 надо пользовать "".format()
Не смог найти почему использование "".format() предпочтительней чем %. вот ссылка где описана работа с "".format()

5. Оператор / - деления (возвращает float), // - целочисленное деление (возвращает int). float() и int() в большинстве мест писать не обязательно.
Спасибо учтём на будущее.

6. Глобальные переменные - зло. Их надо передавать в параметрах функций.
К сожалению не нашёл причин считать что это зло. yamixxx Расскажи подробнее пожалуйста.

7. Для возврата необходимых параметров лучше использовать списки
через return можно возвращать много параметров.
def f(a, b)
return a + b, a - b
c, d = f(2, 1)

ещё если параметры функция являются объектами, то их можно менять в функции
def f(lst):
lst.append(3)
l = [1,2]
f(l)
print(l)
# [1,2,3]


8. В питоне "главную функция принято писать в конструкции
if __name__ == "__main__":
main()

это позволяет подключать этот же файл как модуль. через import
Тонкости. Но их необходимо знать, а то будут проблемы.

9. А ещё и зря пишешь скобки в if они так не нужны

Дополнительно стоит отметить, что в Python есть встроенная система документации
class MyClass:
""" Описание класса """
def myFunc():
"""Описание функции и её параметров"""
pass
a = MyClass()
print(a.__doc__)
help(a)
print(a.myFunc.__doc__)


Если текст заключенный между """ (3йными кавычками) находится сразу после объявления он считается описанием функции или класса.


В следующем посте про Python попробую учесть всё вышесказанное.

P.S. ещё раз спасибо yamixxx и agibov за советы и указания на ошибки. Без вас ребята не было бы это го поста :).

3 комментария:

  1. Не стоило так вот перепечатывать мои коммены, с их опечатками неточностями :) Получается я тебя ввел в некоторое заблуждение, а если кто прочтёт, то и он может неверно понять некоторые моменты. Тебе бы стоило самому сначало в этом разобраться, прежде чем постить.

    И так, исправляюсь:

    4. Оператор % для строк устарел. В Python 3.0 надо пользоваться "".format()
    Это более мощное средство. Одно из его приимуществ это то, что подставляемые параметры нумеруются. Это удобно при переводе строк на другие языки.

    Опереатор // не всегда возвращает int
    int // int -> int
    int // float -> float
    float // int -> float

    На счет глобальных переменных ничего конкретного сказать не могу. Это скорее всего вопрос идеологии. В частности идеологии процедурного и объектно-ориентированного программирования.

    > Если текст заключенный между """ (3йными кавычками) находится сразу после объявления он считается описанием функции или класса.

    Любая строка стразу после заголовка фукции или класса является их описанием. То же применимо к модулю целиком.

    Ну и всё же я не удержался и написал своё вариант калькулятора с правельным, по моему мнению, оформлением:
    http://logicsworld.net/~xstream/upload/creditcalc

    ОтветитьУдалить
  2. Ну вот, а то всё Маманя да Маманя. У меня даже сомнений про // не возникло.

    ОтветитьУдалить