Ответы пользователя по тегу Python
  • Задача на Python. Как найти число?

    @antares4045
    Ваша задача называется бинарный поиск
    def binsearch(min, max, check):
        support = (min + max) // 2
        result = check(support)
        if result == 'меньше':
            return binsearch(support+1, max, check)
        if result == 'больше':
            return binsearch(min, support-1, check)
        return support
    
    def guess(num):
        print('загадано', num)
        def check(req):
            result = 'равно' if req == num else 'меньше' if req < num else 'больше'
            print(f'это {req}?', '-', 'Да' if result=='равно' else f'Нет, твоё число {result}')
            return result
        return check
    
    
    binsearch(0, 100, guess(10))
    print('='*30)
    binsearch(0, 100, guess(27))
    print('='*30)
    binsearch(0, 100, guess(50))
    print('='*30)
    binsearch(0, 100, guess(100))


    загадано 10
    это 50? - Нет, твоё число больше
    это 24? - Нет, твоё число больше
    это 11? - Нет, твоё число больше
    это 5? - Нет, твоё число меньше
    это 8? - Нет, твоё число меньше
    это 9? - Нет, твоё число меньше
    это 10? - Да
    ==============================
    загадано 27
    это 50? - Нет, твоё число больше
    это 24? - Нет, твоё число меньше
    это 37? - Нет, твоё число больше
    это 30? - Нет, твоё число больше
    это 27? - Да
    ==============================
    загадано 50
    это 50? - Да
    ==============================
    загадано 100
    это 50? - Нет, твоё число меньше
    это 75? - Нет, твоё число меньше
    это 88? - Нет, твоё число меньше
    это 94? - Нет, твоё число меньше
    это 97? - Нет, твоё число меньше
    это 99? - Нет, твоё число меньше
    это 100? - Да
    Ответ написан
  • Как спарсить сайт?

    @antares4045
    Большинство бесплатных прокси имеют гигантское количество проблем, особенно в сфере анонимизации: большинство пользователей пытается скрыть от своего провайдера, куда они идут, а не от целевого сервера свою личность.
    К тому же по таймауту может отвалиться исходящий запрос, но серверу плевать: он получил запрос и мгновенно выдал ответ -- проблема с выставленным вами таймаутом.
    Лично я сталкиваясь с анологичными задачами ставил конские задержки (до минуты) и получив временный бан замолкал на три-четыре часа (требует запастись некоторым количеством терпения, но является самым простым решением проблемы).

    С высокой степенью вероятности наличие случайных задержек и опрос списка не по порядку замедляет обнаружение бота-скарпера. но эту гипотезу стоит проверять отдельно.

    Можно также попытаться притвориться гуловским сканирующим ботом (но это в формате идеи).

    А бесплатные анонимизирующие https прокси сервера которые работают а не редиректят тебя на страницу с приглашением купить подписку вообще сродни единорогам по редкости.
    Ответ написан
    Комментировать
  • Как перемешать двумерный список?

    @antares4045
    Обычно преобразуют в одномерный список (честно или при помощи абстракции), перемешивают, и восстанавливают размеры.

    Набросал такой перемешиватель:

    import random
    class Shuffler:
        def __init__(self, lst, depth=2):
            self.lst = lst
            self.depth = depth
            random.shuffle(self)
            
        def __getlevel(self, index, depth):
            curr = self.lst
            curr_depth = depth
            while curr_depth > 0:
                curr_depth -= 1
                curr_size = len(curr)
                curr = curr[index % curr_size]
                index //= curr_size
            return curr, index
        
        
        def __getitem__(self, index):
            value, index = self.__getlevel(index, self.depth)
            if index > 0:
                raise IndexError('list index out of range')
            return value
        
        def __setitem__(self, index, value):
            last_line, line_index = self.__getlevel(index, self.depth - 1)
            last_line[line_index] = value
            return value
        
        def __len__(self):
            acc = 1
            curr = self.lst
            curr_depth = self.depth
            while curr_depth > 0:
                curr_depth -= 1
                acc *= len(curr)
                if acc:
                    curr = curr[0]
            return acc
    
    lst = [[i * 10 + j for j in range(10)] for i in range(10)]
    Shuffler(lst, 2)
    print(*lst, sep='\n')

    вывод:

    [45, 50, 74, 1, 3, 29, 43, 2, 93, 68]
    [41, 10, 51, 99, 85, 20, 95, 54, 59, 8]
    [46, 64, 24, 12, 26, 15, 6, 76, 39, 5]
    [58, 13, 44, 60, 36, 70, 63, 79, 42, 18]
    [9, 69, 25, 66, 67, 65, 35, 47, 23, 87]
    [78, 80, 22, 73, 97, 31, 91, 75, 82, 90]
    [57, 38, 49, 11, 84, 17, 62, 7, 89, 71]
    [40, 30, 86, 94, 21, 53, 14, 19, 0, 32]
    [33, 37, 61, 92, 81, 88, 56, 83, 98, 34]
    [96, 16, 52, 4, 27, 55, 48, 72, 77, 28]
    Ответ написан
    Комментировать
  • Как работает данный код?

    @antares4045
    ну вообще, писавший этот код, вероятно не очень здоров
    для начала предлагаю разобраться с деструктуризацией

    если вы напишите
    a,b = 2,3
    то в переменной a окажется значение 2
    а в переменной b -- значение 3

    это же можно использовать в циклах:
    words = [(0,'What'),(1,'the'),(2,'heck?')]
    for key,word in words:
        print('key:', key)
        print('word:', word)
        print()

    вывод:
    key: 0
    word: What

    key: 1
    word: the

    key: 2
    word: heck?


    если же при разборе кортежа, какой-то элемент вам не нужет, то можно просто использовать нижнее подчёркивание

    words = [(0,'What'),(1,'the'),(2,'heck?')]
    
    for _,word in words:
        print(word)


    Но автор вашего примера решил сделать нечто странное:
    {} -- создание пустого dict
    [()] -- присвоение в него по ключу "пустой кортеж" значения

    учитывая, что исходный dict никуда не сохраняется, это можно считать отчисткой, только вот зачем?
    a = {}
    a[()] = 5
    print(a)


    {(): 5}
    Ответ написан
    Комментировать
  • Как сделать так, чтобы бот с кнопками при перезагрузке реагировал на прошлые сообщения?

    @antares4045
    Соглашусь, с ораторами, рекомендующими сменить хостинг, но можно прикрутить бд (ну или просто файл) и сохранять контекст в неё (при помощи например pickle) и при заргрузке соответственно проверять на наличие сохранённого контекста. С ботскими api у меня такой необходимости, признаться, ни разу не возникало -- возможно вылезет какая-нибудь специфика, но при доработке напильником оно точно обязано взлететь.
    Ответ написан
    Комментировать
  • Хай, как мне разделить строчку из файла с разделением; на переменные на питоне?

    @antares4045
    зависит от очень могих факторов:
    если вы заранее знаете количество переменных, то достаточно

    with open('test.txt', 'r') as file:
        v1, v2 = file.readline().split(';')
    print(v1, v2)


    В противном случае всё повеселее

    with open('test.txt', 'r') as file:
        lineindex = 0
        for line in file:
            values = line.split(';')
            for colindex in range(len(values)):
                globals()[f'v_{lineindex}_{colindex}'] = values[colindex]
            lineindex += 1
    
    print(v_0_0, v_0_1)


    но возможно на глобальные переменные бить не надо, если достаточно просто сложить в список, то
    with open('test.txt', 'r') as file:
        acc = []
        for line in file:
            acc.append(line.split(';'))
    
    print(acc)
    Ответ написан
    Комментировать
  • Как вызывать по одной строке из txt?

    @antares4045
    Вы же ищите метод readline?
    P.S. Только помните о наличии \n и/или \r в конце возвращаемой им строки
    P.P.S Хотя для наибольшей чистоты, решение заданного вами вопроса должно выглядеть как-нибудь вот так.
    А в идеале, сразу "дружите" с sqlite.
    Ответ написан