• Соответствует ли мой код парадигме ООП?

    longclaps
    @longclaps
    Совсем нет.
    Мне не хочется переделывать твой код построчно, он плох (это нормально, а то, что он работает - просто отлично). Надо бы как-то так:
    from abc import ABC, abstractmethod
    from math import sin, cos, pi
    
    
    class Figure(ABC):
        def __init__(self, height=2):
            assert 1 < height < 20  # незачем больше
            self.height = height
    
        @abstractmethod
        def draw(self):
            pass
    
    
    class Triangle(Figure):
        def draw(self):
            for i in range(self.height - 1):
                print(f'{"/":>{self.height - i}}{"":>{i * 2}}\\')
            print('─' * (self.height * 2))
    
    
    class Square(Figure):
        def draw(self):
            w = self.height * 2 - 2
            print('┌', '┐', sep='─' * w)
            for _ in range(self.height - 2):
                print('│', '│', sep=' ' * w)
            print('└', '┘', sep='─' * w)
    
    
    class Ellipse(Figure):
        def __init__(self, height=7, width=None):
            assert 6 < height < 20  # меньше никак
            if width is None:
                width = height
            else:
                assert 6 < width < 20
            self.height, self.width = height, width
    
        def draw(self):
            buf = [[' '] * (self.width * 2) for _ in range(self.height)]
            rx, ry = self.width - 1., self.height / 2 - .5
            for i in range(100):
                φ = i * pi / 50
                buf[round(ry * (1 + sin(φ)))][round(rx * (1. + cos(φ)))] = '*'
            for row in buf:
                print(''.join(row))
    
    
    Triangle(7).draw()
    Square(7).draw()
    Ellipse(7).draw()
    Ellipse(17, 7).draw()

    Смотри на иерархию классов, о реализации методов не запаривайся.
    Ответ написан
    1 комментарий
  • Как решить ошибку Identation error?

    Assargin
    @Assargin
    Перед ответом смотрю наличие ✔ в ваших вопросах
    Это все из-за кнопки "Хакнуть Пентагон" (Да, я успел увидеть, потом вы отредактировали текст вопроса).

    Видите ли, в питоне встроена защита от причинения любого ущерба национальной безопасности США. Если интерпретатор при анализе текста программы видит, что вы собираетесь сделать что-то непоправимое, он выбрасывает ошибку и отказывается выполнять такую программу. Спецы говорят, обойти эту защиту вряд ли получится.
    Ответ написан
    1 комментарий
  • Какой наиболее оптимальный алгоритм поиска в текстовом файле?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    with open("1.txt", "r") as f1, open("2.txt", "r") as f2:
            same = set(f1).difference(f2)
    
    same.discard("\n")
    
    with open("3.txt", "w") as fo:
        for line in same:
            fo.write(line)


    UPD. Извиняюсь, не обратил внимания, что нужны строки из файла 1 которых нет в файле 2, обновил.
    Ответ написан
    2 комментария
  • Как спарсить значения?

    Так как ты используешь find_all (да, можно писать маленькими буквами), то у тебя получается список с искомыми значениями.
    С помощью цикла, прокручиваешь список, и получаешь значение, с помощью .text
    for i in b:
        print(i.text) #Ну или делаешь что тебе надо.

    Кстати, когда указываешь класс, можно делать это так:
    soup.findAll("a", class_= "ui-link review-votes__item review-votes__dislike review-votes__dislike_with_count")


    Это когда класс, ещё так можно id указывать.

    Лучше использовать 'lxml' вместо 'html.parser', он работает быстрее, так как написан на Си.
    Ставится так: pip install lxml
    Ответ написан
    Комментировать
  • Как исправить ошибку 'set' object has no attribute 'get' в телеграм боте?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    apihelper.proxy = {'http': 'http://88.204.154.155:8080'}

    Как вообще вы пришли к тому, что-бы ставить открывающие кавычки " а закрывающие '?
    Ответ написан
    Комментировать
  • Как на компьютере скрытно установить прокси?

    Zoominger
    @Zoominger Куратор тега Компьютерные сети
    System Integrator
    наверное это мне нужно

    Нет, не это.
    Вам нужен Уголовный Кодекс.
    Читать до просветления.
    Ответ написан
    Комментировать
  • Были приведен пример в Python 3.7. Список не открывается в программе, почему?

    @Sir_MaNiAl
    Материал рассчитан на постепенный ввод в консоли Python команда-за-командой: то что отмечено как <class 'int'> - это то, что вы увидите в ответ на введенную команду type(a).
    Эта строка не является допустимой коммандой языка Python и не должна присутствовать в исходном коде. Удалите её и ей подобные из файла test.py.
    Скорректируйте содержимое файла:
    a = 10
    b = "hello"
    c = (1, 2)
    #При запуске кода из файла видно только то, что выводится командой "print()"
    print(type(a))
    print(type(b))
    print(type(c))

    Вывод в консоль:
    <class 'int'>
    <class 'str'>
    <class 'tuple'>
    Ответ написан
    Комментировать
  • Как найти код блога на django?

    @MAGistr_MTM
    Учусь программировать
    Ответ написан
    Комментировать
  • Какова суть фреймворков и библиотек?

    Stalker_RED
    @Stalker_RED
    Библиотека это инструмент или набор каких-то инструментов.
    Бибилиотека для скачивания видео с ютуба
    Бибилиотека для кропа и ресайза картинок
    Бибилиотека для определения города по IP

    Фреймворк может использовать десятки или сотни разных библиотек. Это набор не только инструментов, но и готовых компонентов, и еще и рекомендация по их использованию.

    "набор для постройки скворечника"
    В комплекте молоток, гвозди, столярный клей, 20 деревянных досточек разных форм и расцветок и инструкция с тремая вариантами скворечника на выбор.

    Или вот два фреймворка:
    Ezva9I.pngzC6ZHT.png
    Можно ли их использовать вместе? (Конечно, никто не запрещает)
    Можно ли из этих деталей построить что-то совсем другое, не такое как в инструкции? (Конечно да)
    Можно ли с этими фреймворками использовать детали еще и из этого?
    lGjE1A.png
    (конечно можно, но придется что-то придумать для совместимости деталек. Быть может придется применить клей, изоленту, пластилин или жвачку. Или шуруповерт, или сварочный аппарат. Но ни в один комплект эти дополнительные инструменты не входят, как и скиллы к ним.)

    Можете посмотреть еще сюда, этот ответ частично покрывает ваш вопрос:
    Для чего нужны фреймворки, а-ля Laravel?
    Ответ написан
    Комментировать
  • Какой язык программирования даёт возможность пользователю самостоятельно добавлять/редактировать/удалять свои записи?

    Stalker_RED
    @Stalker_RED
    Если на средней стадии изучения вы начали подозревать, что html и css это не языки программирования, то у меня для вас хорошие новости: похоже это не средняя стадия, а самое-самое начало начальной стадии. А все самое интересное еще впереди :)

    Подойдет любой серверный язык программирования. Это не полный список, но все популярные языки в нем есть.
    А дальше выбирайте какой вам больше нравится, какой проще учить, на каком легче работу найти или за какой больше денег дают, или по какому-то другому признаку.
    Ответ написан
    Комментировать
  • Как итерировать по вложенные списки неопределенной глубины?

    aRegius
    @aRegius
    Python Enthusiast
    >>> x = [1, 2, [3, 4, 5, [6, 7], [8, [9, [10, 11], 12]], 13, 14], 15]
    >>> from collections import Iterable
    >>> def nested_to_flat(items):
    	        for i in items:
    		            if isinstance(i, Iterable):
    			                yield from nested_to_flat(i)
    		            else:
    			                yield i
    >>> list(nested_to_flat(x))
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
    Ответ написан
    Комментировать
  • Почему не правильно работает?

    @lega
    >>> max(list('1736'))
    '7'
    Ответ написан
    Комментировать
  • Как обойти anti-adblock на qaru.site?

    AngReload
    @AngReload
    Кратко о себе
    Зайди в настройки uBlock Origin > Мои фильтры, и добавь строчку:
    http://qaru.site/*.js
    Потом нажми «Сохранить изменения».

    Какой-то он подозрительный этот сайт, он только переводит stackoverflow?
    Ответ написан
    6 комментариев
  • Можно ли использовать глобальные переменные в классе?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Технически можно, но с позиции правильности архитектуры - это ужасное решение. У каждого объекта должно быть собственное состояние:
    class A:
        def method(self):
            self.a = 1
            self.b = 2
    Ответ написан
    Комментировать
  • Как написать drag and drop приложение?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    import sys
    
    from PyQt5.QtWidgets import QApplication, QLabel, QWidget
    from PyQt5.QtGui import QDrag, QPixmap, QImage, QPainter, QCursor
    from PyQt5.QtCore import QMimeData, Qt
    
    
    class DraggableLabel(QLabel):
        def __init__(self, parent, image):
            super(QLabel, self).__init__(parent)
            self.setPixmap(QPixmap(image).scaledToWidth(64))    
            self.show()
    
        def mousePressEvent(self, event):
            if event.button() == Qt.LeftButton:
                self.drag_start_position = event.pos()
    
        def mouseMoveEvent(self, event):
            if not (event.buttons() & Qt.LeftButton):
                return
            if (event.pos() - self.drag_start_position).manhattanLength() < QApplication.startDragDistance():
                return
            drag = QDrag(self)
            mimedata = QMimeData()
            mimedata.setText(self.text())
            mimedata.setImageData(self.pixmap().toImage())
    
            drag.setMimeData(mimedata)
            pixmap = QPixmap(self.size())
            painter = QPainter(pixmap)
            painter.drawPixmap(self.rect(), self.grab())
            painter.end()
            drag.setPixmap(pixmap)
            drag.setHotSpot(event.pos())
            drag.exec_(Qt.CopyAction | Qt.MoveAction)
    
    
    class DropLabel(QLabel):
        def __init__(self, *args, **kwargs):
            QLabel.__init__(self, *args, **kwargs)
            self.setAcceptDrops(True)
    
        def dragEnterEvent(self, event):
            if event.mimeData().hasImage():
                print('event accepted')
                event.accept()
            else:
                print('event rejected')
                event.ignore()
    
        def dropEvent(self, event):
            if event.mimeData().hasImage():
                self.setPixmap(QPixmap.fromImage(QImage(event.mimeData().imageData())))
    
    
    class Widget(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            label = DropLabel('drop there', self)
            label.setGeometry(190, 65, 100, 100)
    
            label_to_drag = DraggableLabel(self, 'image.png')
            self.show()
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = Widget()
        w.show()
        sys.exit(app.exec_())
    Ответ написан
    Комментировать
  • Cмысл декоратора property?

    @abcd0x00
    >>> class Person:
    ...     first_name = 'First'
    ...     last_name = 'Last'
    ...     
    ...     @property
    ...     def full_name_1(self):
    ...         return ' '.join([self.first_name, self.last_name])
    ...     
    ...     def full_name_2(self):
    ...         return ' '.join([self.first_name, self.last_name])
    ... 
    >>> p = Person()
    >>> p.full_name_1
    'First Last'
    >>> p.full_name_2()
    'First Last'
    >>> p.full_name_2
    <bound method Person.full_name_2 of <__main__.Person object at 0xb739a5ec>>
    >>>
    Ответ написан
    1 комментарий
  • Как происходит доработка верстки на фрилансе?

    Stalker_RED
    @Stalker_RED
    Расскажите как вообще происходит предоставление исполнителю доступа к коду в готовом проекте, который уже на хостинге.


    Возможно тебе дадут готовый докер или вагрант где уже все окружение настроено. И подробное описание-инструкцию, как у заказчика построен рабочий процесс.

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

    Или, если проект еще не запущен, тебе дают архивчик с трудами твоего предшественника, и после ты возвращаешь обновленную версию.

    Или тебе дают ФТП-доступ к уже запущенному проекту. Ты пытаешься у себя поднять копию, но оно не работает, потому что там же уже серверный код, а не просто верстка, и оно хочет БД, и еще 100500 зависимостей, которые ты не умеешь разруливать, потому что ты верстальщик же, а не админ и совсем не программист. Тогда ты призываешь какого-то шамана, который научит тебя великому колдунству - внедрить проверку прям на живом сайте, типа "если есть такая-то кука - подключить такую-то css-ку". И ты фигачишь прям по живому, непрерывно подергиваясь, и проклиная всю индустрию.
    При этом тешишь себя надеждой, что ты ввязался в этот кошмар в последний раз, и в следующий раз заказы без гита идут лесом, ну в крайнем случае пусть будет архив, хотя сколько-сколько вы предлагаете за добавление двух пунктов в меню?
    Ответ написан
    Комментировать
  • Кодировка в Pycharm?

    @Fixid
    В самом начале файла
    # -*- coding: utf-8 -*-
    # !/usr/bin/env python
    Ответ написан
    1 комментарий
  • Как правильно использовать super()?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Django
    Седой и строгий
    1. Зависит от логики вашего кода. В некоторых случаях метод суперкласса можно вообще не вызывать.
    2. Прежде всего надо заметить, что требования передавать класс в вызов super относится только к Python2. В Python3 можно просто super().__init__(*args, **kwargs) Но если класс всё-таки передаётся, то это должен быть тот класс, в методе которого происходит вызов.
    Ответ написан
    1 комментарий
  • Хочу сделать API, с чего начать?

    zoonman
    @zoonman
    ⋆⋆⋆⋆⋆
    Следует начать с проектирования API. Возмите https://swagger.io/ и набросайте все, что нужно.
    Swagger вам позволяет объединить роутинг, документацию и примеры вызовов в единое целое.
    Кроме этого он позволяет сгенерировать заглушки для разных языков программирования и фреймворков.
    В принципе вы можете найти значительное количество интеграций для разных фреймоворков.

    В целом API лучше делать с помощью фреймворков, поскольку в них уже реализованы тривиальные моменты по безопасности, аутентификации и авторизации. Вы можете использовать микрофреймворки, например тот же Slim. Вы даже можете сгенерировать роутинг для него используя генератор от Swagger.

    В REST есть 6 принципов, прекрасно изложенных в Wiki. В REST нет ничего сложного и особенного. Это просто надстройка над стандартным протоколом HTTP. Именно поэтому нет никаких особенных уроков. Изучите работу HTTP и вы поймете как работает веб в целом и REST в частности.

    По поводу отдельного сервера для API. Есть множество разных подходов. В последнее время все более актуальными становятся Serverless-приложения. Serverless архитектура идеально вписывается в REST. Но думаю для вас это пока рановато и сложновато. Слишком много для начала.

    Логичнее всего держать проект в моно-репозитарии, если он не будет большим. Если вы точно не знаете насколько большим он будет, то можно разбить проект на компоненты и использовать Composer для управления зависимостями (советую полность прочитать эту страницу от корки до корки).

    По поводу best practices есть очень хороший ресурс https://12factor.net/ru/
    Он в целом применяется для всех приложений.

    Запомните: первый блин всегда комом. Прочитайте все ресурсы, которые я привел для вас. В них много ссылок на другие, походите по ним, присмотритесь. Напишите первую версию API так, как вам кажется удобно. Постарайтесь применить практики из статей.
    Вам нужен опыт и вы его не наберетесь, пока не сделаете что-то сами. Вы можете потратить год на чтение, но останетесь на том же месте, с которого начали. А другой человек напишет на коленке API за неделю, а потом перепишет его 20 раз за год и он вам расскажет в 10 раз больше, чем то, что вы изучили за год.
    Дерзайте!
    Ответ написан
    16 комментариев