• Как в коде Python написать про включение программы?

    netpastor
    @netpastor
    Python developer
    scale_1200
    Ответ написан
    Комментировать
  • Конфликт локальных/глобальных переменных в Python: кто из нас прав?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Марк Лутц - "Изучаем Python", глава 20, страница 596
    Как известно, имена, которым выполняется присваивание внутри функции, по умолчанию рассматриваются как локальные – они располагаются в области видимости функции и существуют только во время работы функции. Но я еще не говорил, что локальные переменные определяются статически, во время компиляции программного кода в инструкции def, а не в соответствии с операциями присваивания, производимыми во время выполнения. Эта особенность становится причиной появления самых причудливых сообщений в группе новостей, получаемых от начинающих программистов. Обычно, если внутри функции имени не присваивается какое-либо значение, поиск его будет производиться в области видимости объемлющего модуля. Но посмотрите, что произойдет, если добавить инструкцию присваивания переменной X после ее использования.

    X = 99
    >>> def selector():
    ... print(X) # Переменная еще не существует!
    ... X = 88 # X классифицируется как локальная переменная
    ... # То же самое происходит при “import X”, “def X”...
    >>> selector()
    Traceback (most recent call last):
    ...текст сообщения об ошибке опущен...
    UnboundLocalError: local variable ‘X’ referenced before assignment

    Было получено сообщение о том, что переменная не определена, но причина его появления не очевидна. Этот программный код компилируется интерпретатором во время ввода в интерактивной оболочке или во время импорта модуля. Вовремя компиляции Python обнаруживает операцию присваивания переменной X и делает вывод, что X – это локальное имя везде в теле функции. Но во время выполнения функции, из-за того, что к моменту вызова инструкции print операция присваивания еще не производилась, интерпретатор сообщает о том, что имя не определено. Согласно этому правилу использования имен, он говорит, что обращение к локальной переменной X произведено до того, как ей было присвоено значение. Фактически любая операция присваивания внутри функции создает локальное имя. Операция импортирования, =, вложенные инструкции def, вложенные определения классов и так далее – все трактуются именно таким образом. Проблема возникает из-за того, что операция присваивания делает имена локальными для всей функции, а не только для той ее части, которая следует за инструкцией присваивания.

    Читать учебники - полезно.
    Ответ написан
    3 комментария
  • Смотрите я делаю такую штуку для себя типо,приходы и уходы(денег),но там происходит какая то ошибка,что не так?

    Lillipup
    @Lillipup
    Allons-y, Алонсо!
    couldn't open "add.gif": no such file or directory

    Такая картинка не существует
    Ответ написан
    Комментировать
  • Не записывает в файл?

    Артем Марш, в коде полно ошибок:
    1. После первой строки не нужен отступ(4 пробела перед for ...)
    2. Не понятно, какая необходимость извлекать сведения из словаря в переменные? (name = item['first_name'], ...)
    3. Дуплицирование кода
      print('|', name, lname, '|', 'id' + str(iduser), '|', 'Пол:', sex, '|', '==>', online)
      . Во всех случаях одно и то же, и поэтому печать на экран можно вывести из блока if sex == 1
    4. Запись в файл лучше оформить через контекст, т.е. через with
    5. И самое главное!
      Сам файл создался, но записей в нем нету.
      . Файл Вы открываете на запись, а не на добавление. Получается при каждом проходе цикла файл перезаписывается без сохранения предыдущих результатов. Режим для добавления строк в файл:f = open('result.txt', mode='a')
    6. Проверка связанная с полом, несколько переусложнена. Лучше подобные проверки выводить в функции для чистоты кода. Не буду писать подробнее, т.к. потребует еще большего времени для объяснения


    По поводу вопроса в комментарии к ответу Сергей Горностаев:
    1. Какой смысл в преобразовании str в bytes при записи?(.encode('utf-8')) Чтобы при чтении преобразовать обратно в строку Unicode?! По мне, так логичнее так и хранить в Unicode. При открытии файла на запись указать кодировку:
      with open('result.txt', encoding='utf-8') as f:
          ...

    2. Ошибка TypeError: sequence item 3: expected str instance, int found выводится, т.к. аргументами метода join должны быть коллекция из строк(str). А переменная iduser типа int(целое число). Нужно преобразовать перед передачей в join: '\t'.join([ name, lname, online, str(iduser)])

    Вот код для записи:
    with open('result.txt', encoding='utf-8', mode='a') as f:
        f.write('\t'.join([ name, lname, online, str(iduser)]))

    или
    f = open('result.txt', encoding='utf-8', mode='w')
    for item in group['items']:
        ...
            f.write('\t'.join([ name, lname, online, str(iduser)]))
        ...
    f.close()


    P.S. И маленький совет не связанный с ошибками. Формат в котором Вы записываете в файл напоминает CSV. Поменяйте:
    1. расширение файла на csv
    2. разделитель вместо таба(/t) используйте точку с запятой (;)
    3. и первыми строчками можете добавить заголовки для полей (расшифровка полей)

    И можете смотреть в файл в табличных редакторах(Excel, ...), подвергать в них анализу, сортировке, ...
    Ответ написан
    3 комментария