Ответы пользователя по тегу Python
  • Почему не работает функция?

    @Kapustlo
    Привет, предлагаю вот такой вариант решения задачи:

    import datetime
    import sys
    
    from colorama import Fore, Back, Style, init
    
    init()
    
    def main():
    	try:
    		_, login, password = sys.argv
    	except ValueError:
    		login = password = ""
    
    	if password != "abrakadabra" or login != "root":
    		print(Fore.RED)
    		print("Неверный логин или пароль!")
    		exit()
    
    	print(Fore.GREEN)
    	print("Добро пожаловать!")
    	print(Fore.WHITE)
    
    	try:
    		name = input("Как тебя зовут?: ")
    		print("Приятно познакомиться, {}! Я - Джессика! Твой ассистент.".format(name))
    
    		while True:
    			question = input("Введите запрос: ")
    
    			if question == "Сколько сейчас времени?":
    				cur_time = datetime.datetime.today().strftime("%H.%M")
    				print("Сейчас: " + str(cur_time))
    			elif question == "Какая сегодня дата?":
    				date = datetime.datetime.today().strftime("%d.%m.%Y")
    				print("Сегодня у нас: " + str(date))
    			else:
    				print("Извините, я не могу понять ваш вопрос...")
    
    	except KeyboardInterrupt:
    		exit()
    
    if __name__ == "__main__":
    	main()


    Немного по тому, что изменил: убрал часть с объявлением кодировки, так как в новых версиях Python utf-8 ставится по умолчанию, убрал из импорта модуль time, так как он не используется. Чтобы из модуля какого-то импортировать функции, не обязательно сначала сам модуль импортировать "colorama", можно сразу, как у меня. Переменную "time" переименовал в "cur_time", так как она могла конфликтовать в будущем с модулем "time" и занёс "date" и "cur_date" в цикл, так как в теории, если оставить на определённое время, то информация станет не актуальной. Убрал функцию "qstn", так как она нам дальше не понадобится, у нас будет цикл. Там будет есть моя "отсебятина", которая, как я считаю, прикольнее и улучшит взаимодействие с программой. Там есть строчка sys.argv. Ты, наверное, сталкивался, что в некоторых консольных утилитах ты можешь различные параметры передавать, так вот, они в python будут в этом списке храниться, в коде мы их и берём. Там можно сразу много строк кода убрать и сделать логин удобнее и быстрее для пользователя. Дальше проще, мы будем в цикле прогонять вопросы по мере их поступления, ловить комбинацию "ctr+c", которая ошибку будет выкидывать "KeyboardInterrupt" и просто выходить из программы, когда она попадётся. И ещё хотел одну ремарочку сделать, у тебя там в коде ошибки выбрасывались "SystemExit", так вот, на сколько я знаю, системные ошибки по типу этой или "KeyboardInterrupt" лучше самому не выкидывать.
    Ответ написан
    Комментировать
  • Как из строки байтов сделать нормальную строку?

    @Kapustlo
    string = '\xd0\x9c\xd0\xbe\xd0\xbd\xd0\xb5\xd1\x82\xd0\xb0'
    string_bytes = string.encode("iso8859-1") # Вот тут вы получите байты, если надо будет ими дальше оперировать
    decoded_string = string.decode("utf-8") # "Монета"
    Ответ написан
    Комментировать
  • Как уменьшить или оптимизировать код?

    @Kapustlo
    class Counter():
    
    	def __init__(self, a = 0, b = 0, c = 0):
    		self.a = a
    		self.b = b
    		self.c = c
    
    	def main_count(self):
    		while True:
    			self.a += 1
    			yield self.a
    
    	def method1(self):
    		while True:
    			print('method1', a)
    			self.b += self.a
    			yield self.b
    
    	def method2(self):
    		while True:
    			print('method2', a)
    			self.c += self.a
    			yield self.c
    
    if __name__ == '__main__':
    	counter = Counter()
    	method1 = counter.method1()
    	method2 = counter.method2()
    
    	for a in counter.main_count():
    		b = next(method1)
    		c = next(method2)
    Ответ написан
  • Как правильно огранизовать поиск минимального значения в массиве?

    @Kapustlo
    Предлагаю такой вариант в три строчки, если я правильно понял вашу задачу.
    default = 0
    array = (2, 4, 6, 8, 10)
    minimal = min(default, min([number for number in array if not number % 2]))
    Ответ написан
    Комментировать
  • Как правильно завершать цикличный скрипт?

    @Kapustlo
    Здравствуйте, вы попросили рассказать о другом возможном подходе, так вот, я вам предлагаю использовать утилиты, которые помогают запускать скрипты через определённый промежуток времени. Например, вы можете использовать "cron".
    Ответ написан
  • Как исправить ошибку?

    @Kapustlo
    У вас проблема в том, что вы забываете поменять тип переменной и вы умножаете на 2 строку "4", а не число 4 и выходит, что строка повторяется два раза, становясь "44" (кстати иногда очень крутая штука, позволяет решать лаконично определённые задачи без использования циклов)
    amont = "4" # Допустим, это мы получили из API
    
    if condition:
        amont = float(amont) * 2
    
    # А дальше, если вам нужно работать с "amont" как со строкой, то просто сделайте str(amont)


    Ну, а если вы уверены, что число у вас всегда будет целочисленное, то вы можете, как написал Ivan Yakushenko сделать так:

    amont = int(amont)

    Но учтите, что если будет передано дробное число, то выдастся ошибка. Также учитывайте, что дробная часть должна обязательно разделяться ".", чтобы float() смогла преобразовать строку в дробное число, иначе снова выдастся ошибка.
    Ответ написан
  • Как отправить http статус кода в ответ на сообщение?

    @Kapustlo
    Taus уже упомянул одну особенность Yandex API, полагаю, что он всё сказал верно, но я дам ответ на конкретно ваш запрос. Вам нужно создать свой класс обработчика запросов, который будет наследовать от "SimpleHTTPRequestHandler", в котором вы переопределите метод "do_GET" (или другой, который вам нужен, в зависимости от типа запроса) и вернёте нужные данные.

    import http.server
    import socketserver
    from http import HTTPStatus
    
    class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler):
        def do_GET(self):
            encoding = "utf-8"
            self.send_response(200)
            self.end_headers()
            self.wfile.write("Your response".encode(encoding))
    
    port = 8080 
    
    Hander = HTTPRequestHandler()
    
    with socketserver.TCPServer(("", port), Handler) as httpd:
    print("serving at port", port)
    httpd.serve_forever()
    Ответ написан
  • Как задать переменную?

    @Kapustlo
    Ну, смотрите, если вы хотите просто создать переменную, то сделайте так:

    GOOGLE_APPLICATION_CREDENTIALS = "test.json"

    У вас была проблема в том, что вы не ставили кавычки, что означало, что интерпритатор пытался найти объект "test" и взять значение его атрибута "json"

    А если вы хотите именно в "os.environ" добавить добавить это значение, то сделайте так:

    os.putenv("GOOGLE_APPLICATION_CREDENTIALS", "test.json")
    Ответ написан
    Комментировать
  • Взаимодействие двух хостов в сетевой игре?

    @Kapustlo
    Доброго времени суток, в принципе 66demon666 правильно мыслил, но, к сожалению, не рассказал про практическую сторону. Я предлагаю вам воспользоваться более высокоуровневым стандартным модулем Python "socketserver", который позволяет проще реализовать сервера, которые работают по протоколам UDP и TCP. И так, говоря о настройке сервера, то нам понадобится изначально создать обработчик запросов, класс, который будет наследовать от класса "socketserver.BaseRequestHandler". В нашем новосозданном классе мы должны переопределить метод "handle", который по умолчанию ничего не делает, чтобы мы могли обрабатывать приходящие запросы. Далее мы создаём класс нашего сервера со множественным наследованием, в котором на данном этапе мы не добавим своих методов и не переопределим имеющиеся. Далее я уже пойду немного глубже и расскажу немного про своё мнение об организации игрового процесса. Я предлагаю пока что создать два класса: "Player" и "Session". "Session" будет наследовать наш TCP сервер и в своём "__init__" методе будет присваивать обработчику событий себя, чтобы мы из него могли спокойно оперировать данными сессии. Собственно, класс "Player" был добавлен с целью упрощения работы с данными игроков, дабы не создавать словари с их данными и прочее. В принципе, полагаю, на этом мои разъяснения закончены, остальное вы увидите в коде.

    import socket
    import threading
    import socketserver
    
    class Player:
        def __init__(self, id, name):
            self.id = id
            self.name = name
    
    class TCPRequestHandler(socketserver.BaseRequestHandler):
        def handle(self):
            encoding = "utf-8"
    
            data = self.request.recv(1024)
    
            # Дальше мы обрабатываем данные, которые пришли и, например, создаём из них словарь
            if len(session.get_players()) < 2:
                player = Player(data["id"], data["name"])
                session.add_player(player)
                self.request.send("Some response".encode(encoding))
            else:
                self.request.send("Some error data".encode(encoding))
    
    class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
        pass
    
    class Session(ThreadedTCPServer):
        def __init__(self, connection_data, request_handler):
            super().__init__(connection_data, request_handler)
    
            self.max_players = 2
            self.players = {}
            self.over = False
    
            request_handler.session = self
    
        def get_players(self):
            return self.players
    
        def add_player(self, player):
            if type(player) == Player:
                if len(self.players) < self.max_players:
                    self.players[player.id] = player
                else:
                    raise Exception("Players overflow")
            else:
                raise TypeError("'player' argument must be a 'Player' type")
    
        def game_over(self):
            self.over = True
    
    if __name__ == "__main__":
        HOST, PORT = "localhost", 80
    
        session = Session((HOST, PORT), TCPRequestHandler)
    
        with session:
            session_thread = threading.Thread(target=session.serve_forever)
    
            session_thread.daemon = True
            session_thread.start()
    
            while not session.over:
                pass # Заглушка, чтобы сервер работал
    
            session.shutdown()
    Ответ написан
    Комментировать