Задать вопрос
Ответы пользователя по тегу Python
  • Выполнить, если переменная равна хотя бы одному элементу из массива (Python)?

    tsarevfs
    @tsarevfs
    C++ developer
    Может быть так? Только убедитесь что id это не число а тоже строка.
    if id in user:
    Ответ написан
    2 комментария
  • Как заставить работать функцию в python?

    tsarevfs
    @tsarevfs
    C++ developer
    Предлагаю вам вариант, как сделать код красивее.
    places = ["Таверна","Рынок"]
    tavern_actions = ["Купить еды","Пить"]
    marketplace_actions = ["Купить руду","Продать руду"]
    
    def chose_option(options):
    	option_strings = ["{}) {}".format(i + 1, name) for (i, name) in enumerate(options)]
    	question = '\n'.join(option_strings) + '\n'
    
    	return int(input(question))
    
    class Player:
    	def __init__(self):
    		#конструктор вызывается при создании
    		self.money = 0
    		self.water = 0
    		self.food = 0
    
    	def __repr__(self):
    		return "Player:\n money: {}\n water: {}\n food: {}\n".format(
    			self.money, self.water, self.food
    			)
    
    	def tavern(self):
    		action = chose_option(tavern_actions)
    		#if action == 1:
    		# 	self.buy_food()
    		#...
    
    	def marketplace(self):
    		action = chose_option(marketplace_actions)
    		#...
    
    	def mest(self, x, y):
    		print(self)
    
    		if ((x==1 and y==1) or(x==3 and y==1)):
    			pass
    			#...
    
    		place = chose_option(places)
    		if place == 1:
    			self.tavern()
    		if place == 2:
    			self.marketplace()
    
    p = Player()
    p.mest(0, 0)


    Используем класс вместо глобальных переменных. Разбиваем разные действия на функции.

    Из того что можно сделать еще:
    Класс мир (World), который хранит масив villages и возможно что-то еще
    Класс Village, который хранит позицию, имя,...
    Тогда страшный if:
    if ((x==1 and y==1) or(x==3 and y==1)):
        if x==2 and y==1:

    Можно заменить на
    village = world.find_village(x, y)
    if (village != none):
    Ответ написан
  • Как защита приложения на Python?

    tsarevfs
    @tsarevfs
    C++ developer
    Единственная реальная защита -- выполнение части функциональности на сервере.
    Вы можете поискать реализации онлайн или оффлайн лицензийб например https://github.com/Cryptolens/cryptolens-python
    Все эти способы можно так или иначе обойти. Но вам нужно написать что-то сильно популярное чтобы кто-то стал заморачиваться. В целом никто не мешает добавить защиту в новые версии, когда это станет актуально.
    Ответ написан
    Комментировать
  • Можно ли python 3, разделить числа с плавающей запятой от целочисленных?

    tsarevfs
    @tsarevfs
    C++ developer
    В диапазоне от 1 до 5, найти все целые числа кратные 2

    Тут нужно явно проверить делимость. А именно что остаток равен 0:
    >>> 4 % 2 == 0
    True
    >>> 3 % 2 == 0
    False

    Найти все числа с плавающей запятой кратные 2

    А вот тут проблема с определением. кратность определена для целых чисел. Уточните что вы имеете в виду.
    Если вы хотите из списка floating point чисел найти целые и одновременно кратные 2, то это просто 2 отдельные проверки. Проверку на то что число целое можно сделать так:
    >>> a = 2.0
    >>> b = 2.1
    >>> int(a) == a
    True
    >>> int(b) == b
    False

    Однако если floating point число получилось в результате вычислений, то за счет погрешности вы можете никогда не получить целое:
    >>> c = 0.1 + 0.1 + 0.1 - 0.3
    >>> c
    5.551115123125783e-17
    >>> int(c) == c
    False
    >>> abs(c - int(c)) < 1e-10
    True
    Ответ написан
    Комментировать
  • Хочу написать архиватор на Python,с чего начать?

    tsarevfs
    @tsarevfs
    C++ developer
    Изучайте как работают алгоритмы сжатия:
    LZ77
    LZW

    Попробуйте написать реализацию того, который больше нравится и проверить что она работает в обе стороны.
    Интересно так же реализовать несколько и сравнить на разных данных.
    Ответ написан
    Комментировать
  • Возможно ли запустить функцию в одном потоке и заставить Tkinter Progressbar двигаться в другом потоке mainloop, пока эта функция выполняется?

    tsarevfs
    @tsarevfs
    C++ developer
    Поскольку tk не потокобезопасный изменять показания прогрессбара придется из главного потока. Заведите переменную для хранения прогресса. Тред воркер будет писать в нее актуальное состояние а главный тред читать и применять новое значение к прогрессбару по таймеру. Не забудте про Lock при чтении и записи.
    Как упомянул Сергей Горностаев, использовать join не вариант. Вероятно вам подойдет daemon тред.
    Ответ написан
    Комментировать
  • Нужно подобрать регулярное выражение, можете помочь?

    tsarevfs
    @tsarevfs
    C++ developer
    Мой вариант пытается сделать буквально то что вы просите https://regex101.com/r/tWkwTe/2
    Ответ написан
  • Как исправить ошибки в пузырьковом сортировщике массива?

    tsarevfs
    @tsarevfs
    C++ developer
    1. Вы смешали табы и пробелы. Не важно как я об этом узнал XD Для Python это важно. Используйте нормальный текстовый редактор, например VSCode.
    5cf67edfef0ec629296918.gif
    2.
    n = int(input())
    3. Вы обращаетесь к элементам пустого массива.
    a[i]=int(input())
    Используйте append чтобы расширить массив.
    for _ in range(n):
        print("Введите элемент массива ")
        a.append(int(input()))
    Ответ написан
    Комментировать
  • Как сделать реакцию на любую команду?

    tsarevfs
    @tsarevfs
    C++ developer
    Как я понял вы используете pyTelegramBotAPI https://github.com/eternnoir/pyTelegramBotAPI#a-si...

    Второй пример там позволяет получать все сообщения:
    @bot.message_handler(func=lambda m: True)
    def echo_all(message):
    	bot.reply_to(message, message.text)


    Вместо commands там используется func, которая проверяет, подходит ли это сообщение для этого хендлера.
    Ответ написан
    1 комментарий
  • Как ускорить программу?

    tsarevfs
    @tsarevfs
    C++ developer
    Можно решать асимптотически быстрее если не заниматься симуляцией процесса.
    Идея в том, что тот кто выходил подышать позже точно окажется после того кто выходил раньше или совсем не выходил.
    spoiler
    fin = open('input.txt', 'r')
    
    n, _, *actions = (int(v) for v in fin.read().split())
    
    nToLastPos = {n : i for (i, n) in enumerate(actions)}
    
    res = sorted(range(1, n + 1),
    			 key=lambda v: nToLastPos.get(v, -1))
    
    fout = open('output.txt', 'w')
    fout.write(' '.join((str(a) for a in res)))



    Из советов по python коду:
    1. Не храните размер отдельно от списка. Его всегда можно получить с помощью len(arr)
    2. По возможности не используйте for i in range(len(arr)). Вместо этого for value in arr или for i, value in enumerate(arr)
    3. Генераторы списков или словарей очень полезны.
    4. Распакова списков в переменные тоже очень удобная тема.
    Ответ написан
    2 комментария
  • Python: как сделать GUI и скомпилировать под UBUNTU?

    tsarevfs
    @tsarevfs
    C++ developer
    Для GUI можно использовать tkinter или Qt for Python.
    Правильный путь создания приложения доступного пользователю это создвть "ярлык" в виде .desctop файла:
    https://gist.github.com/nathakits/7efb09812902b533...
    Это позволит найти программу через главное меню, добавить иконку, закрепить иконку на панели.
    Такой файл нужно положить в ~/.local/share/applications/
    Для учебных задач в 99% случаев удобно запускать код из IDE или консоли.
    Основной способ распространения программ под Ubuntu это deb пакеты. Это архив с необходимыми файлами и встроенный скрипт, который знает по каким местам в системе надо раздожить эти файлы. Делать их не трудно, но долго и муторно. Для учебных задач это тоже излишнее.
    Ответ написан
    Комментировать
  • Как написать программу в Python, позволяющую записать обыкновенную дробь в виде конечной простой непрерывной дроби?

    tsarevfs
    @tsarevfs
    C++ developer
    Не используйте float деление. Храните пару (числитель, знаменатель) для того чтобы представить значение "хвоста". В итоге можно обойтись только целочисленным делением и взятием остатка.

    num, den = (int(v) for v in input().split('/'))
    a, q = divmod(num, den)
    t = den #q/t -- хвост
    res = [a]
    while q != 0:
        next_t = q
        a, q = divmod(t, q)
        t = next_t
        res.append(a)
    print(res)
    Ответ написан
    1 комментарий
  • Как сделать, что бы все значения сохранялись в программе Python \ PyQt?

    tsarevfs
    @tsarevfs
    C++ developer
    QSettings отличный вариант для сохранения настроек. В том числе путь до последнего открытого файла можно записать туда. По умолчанию в Windows они пишут в реестр, а под linux в ini файл, который создается в ~/.config.
    Ответ написан
    Комментировать
  • Олимпиадное программирование. c++ или python?

    tsarevfs
    @tsarevfs Куратор тега C++
    C++ developer
    Python может работать в 10 раз медленнее. В некоторых олимпиадах для него увеличенные таймауты, но не везде. C++ пока более предпочтителен. Java тоже хороший выбор.
    Пишите на C++ а не на C. Пользуйтесь новыми возможностями C++ 11/14. Забудьте про явное выделение памяти через new (вместо этого используйте vector, unique_ptr, shared_ptr). Изучите stl, в нем много полезного для олимпиад. Пользуйтесь лямбдами. Тогда писать на C++ будет достаточно приятно.
    Ответ написан
    4 комментария
  • Как присвоить диапазон значений переменной в Python?

    tsarevfs
    @tsarevfs
    C++ developer
    Насколько я знаю, какого-то специального способа нет. Используйте пару переменных или кортеж.
    min_val, max_val = 1, 10
    
    if min_val <= x <= max_val:
        print("...")


    Либо писать свой класс:
    def BoundsChecker:
        __init__(self, min_val, max_val):
            self.min_val = min_val
            self.max_val = max_val
            
        def isBounded(self, val):
            return self.min_val <= val <= self.max_val
        
    checker = BoundsChecker(1, 10)
    
    if (checker.isBounded(x))
        print("...")
    Ответ написан
    1 комментарий
  • Как узнать, что тело сообщения начинается с точки?

    tsarevfs
    @tsarevfs
    C++ developer
    Можно встроеную функцию использовать. Плюс пробелы в начале вычистить.

    body = response['items'][0]['body']
    startsWithDot = body.strip().startswith('.')
    Ответ написан
  • Как прикрутить GUI к скрипту Python?

    tsarevfs
    @tsarevfs
    C++ developer
    Смотрите примеры тут www.rkblog.rk.edu.pl/w/p/simple-text-editor-pyqt4
    Вам достаточно первых двух по ссылке.
    # here we connect signals with our slots
    		QtCore.QObject.connect(self.ui.button_open,QtCore.SIGNAL("clicked()"), self.file_dialog)
    .
    Благодаря этой строчке в примере при нажатии на кнопку вызывается функция file_dialog.
    Ответ написан
    Комментировать
  • Как сделать обход в глубину на основе файловой системы?

    tsarevfs
    @tsarevfs
    C++ developer
    Для реальной задачи используйте os.walk.
    Пробел после запятой -- зло!

    def filegraph(current, last):
        
        if current in visited:
            print( visited, ' visited')
            print(node)
            for key in node:
                    print('%s -> %s' % (key, node[key]), end = ' \n')
            print(current, ' Посещено')
            return #*Сразу выходим, чтобы уменьшить вложенность кода*
    
        #spisok.clear()
        current_dir_items = [] #*это список файлов в текущей директории, то что он был глобальным создавало проблемы ниже*
    
        names = os.listdir(current)
        visited.append(current)
        
        print(current, ' Текущая директория')
        print(last, ' Последняя директория')
        
        for name in names:
            directory = os.path.join(current, name)            
            if os.path.isdir(directory) == True:
                current_dir_items.append(directory)
                print(directory, 'директория')
        print( current_dir_items,  ' список')
        
        print(last)
        node[current] = last, current_dir_items #Добавляем в словарь !!!список не копируется, мы помещаем в словарь ссылку на него!!!
        
        if (last in node) #*логика на исключениях -- плохая идея*
            print(node[last], ' last' )
        else
            print(' Ключа нет')
    
        print(node[current], ' current')
        if len(current_dir_items) != 0:
            #for a in range(0, len(current_dir_items)):
            #    if node[current][1][a] not in visited:
            for next_item in current_dir_items: #*по возможности не используйте for in range(len)*
                if next_item not in visited: 
                    time.sleep(3) 
                    os.chdir(next_item) #*код становится проще*
                    for key in node:
                        print('%s -> %s' % (key, node[key]), end = ' \n')
                    print(next_item, ' current ', '-' * 10 )
                    return filegraph(next_item, current) #тут происходил spisok.clear() и портил вам данные в словаре. 
                
        else:
            time.sleep(3)
            print(' Возвращение ' )
            print(node[current][0], ' current  0' )
            for key in node:
                print('%s -> %s' % (key, node[key]), end = ' \n')
    
            return filegraph(node[current][0], '')
    Ответ написан
  • Как лучше организовать работу многих подключений к SOCKET в роли клиента?

    tsarevfs
    @tsarevfs
    C++ developer
    Создаем в клиенте 10 потоков. В каждом коннектимся к серверу. Со стороны сервера поддержка нескольких подключений тоже необходима. Сервер видит нас как отдельных клиентов.
    Но выглядит это странно.
    Если клиент однопоточный, то можно иметь "виртуальные" соединения. Каждое сообщение передается через одну пару сокетов, но в самом сообщении записан список id или имен получателей внутри клиента. Например если у нас игра с несколькими юнитами, то это не значит что действие каждого юнита передается через отдельное соединение.
    Так же можно разделить клиента на отдельные процессы, а обмен между ними организовать через локальные сокеты или пайпы.
    Ответ написан
    Комментировать