Задать вопрос
  • В чем отличия C++ и C# ?

    Deerenaros
    @Deerenaros
    Программист, математик, задрот и даже чуть инженер
    Тут все пишут про отличия. Рискну написать про сходства.

    Во-первых, о чём бы ни писала Елена и Си++ и C# - оба языки общего назначения. Даже больше, оказывается - C# ни разу не заточён под объёмную библиотеку (или фреймворк) .NET, однако с ним намного, много проще. Но если таки учитывать .NET, то для Си++ есть Boost и Qt, так что здесь скорее паритет - библиотек для обоих хватает.
    Во-вторых, сложность разработки на Си++ часто преувеличена. Разве только дисциплины надо поболее - выстрелить в ногу здесь попроще. Однако при этом Си++ будет чутка более гибкий и без танцев с бубнами unmanaged код не запустить на C#. Если внезапно потребуется.
    В-третьих, оба языка, раз они общего назначения, таки мультипарадигмальные. То есть они реализуют большинство практик. И хотя Си++ развивается довольно медленно, сейчас Си++ резко догнал C# в плане нереализованных фич (здесь как минимум лямбды). Ну и метапрограммирования у Си++ поболее будет (наглая ложь).
    В-четвёртых, оба языка кроссплатформеные. Впрочем, C# будет более кроссплатформенный, чем Си++. Разве только тот же Qt резко стёр границы, но это не значит почти ничего - C# компилируется в тот же самый CIL для всех платформ, Си++ - в совершенно разный код для разных платформ (i386, amd64, ARM Cortex-AXX).
    Наконец, в пятых, синтаксис у них действительно очень похож. Оба языка принадлежат к семейству Алгол-подобных, так что и брейсы, и остальные скобки здесь имеют примерно одно предназначение.

    Различия, которые казалось бы делают языки совершенно разными, таки не столь принципиальны на том уровне абстракции, на котором был задан вопрос. А различия действительно колоссальны: C# - managed код, что означает, что скомпилированный код будет исполнятся не на прямую в CPU, а на специальной виртуальной машине. Это съедает производительность, но сильно облегчает перенос кода. Ну и потом, C# - полупроприетарный ответ Java (что интересно, так как получается, что C# - более свободный, чем Java), которая была создана как замена сложному и небезопасному C++ в том числе.

    В общем, как человек, который начал давно с C#, продолжив C++ и по пути изучив Python, Java, D и другую ООП-чушь могу с уверенностью сказать, что разницы в общем-то и нет... То есть придётся немного проникнуться в чуть другую философию и выяснить, какие проблемы более новый язык пытался решить. Но если подходить к этому, как подошёл lookid, то это скорее не как изучать языки одной языковой группы, а как изучать один и тот же язык в разное время или в разных сферах.

    Почему так? Потому что ООП... Оно как бы ООП, ничего сверхъестесственного ни один язык не предлагает, это не Haskell, и тем более не Brainfuck. Так что принципиально общие вещи в них будут. То подмножество, что реализует машину Тьюринга - у них общие. Сами посмотрите: циклы, ветвления, передача аргументов, арифметика... С небольшими правками всё совершенно одинаковое. Да, Дмитрий совершенно прав, traits на C# не повторишь, ибо та аналогия будет уже не traits, однако... Это уже [programming_language] related, то есть это попытка совладать с особенностями.

    Немного пруфов: лично я ходящий пруф. Зная C++ и C# и немного Java я просто начал программировать на Python. При том, что Python даже алголоподобным не принадлежит. А всё потому, что логика одна и та же, хотя различий между Python и C(++|#) намного, много больше. Но не читая почти никаких туториалов, пройдясь галопом по европам с документацией сейчас я знаю python достаточно для серьёзного проекта.

    UPD. По поводу метапрограммирования... Таки рантайм рефлекшн шарпа тащит. И хотя ни макросов, ни шаблонов, ничего. Но изменять код на лету - это уже очень круто. По дефолту плюсы так не умеют, и хотя шаблоны с макросами тащат, сильно, очень сильно тащат и вытаскивают его, Си++, со дна, надо признать - рефлешн у шарпа будет поинтереснее. Извиняюсь за дезу.
    Ответ написан
    6 комментариев
  • Что не так с моим парсером на python?

    kshnkvn
    @kshnkvn
    yay ✌️ t.me/kshnkvn
    В блоке <script id="json-extras" type="application/json"> вся нужная тебе информацию представлена в формате JSON:
    json elem
    {
       "scoresBest":[
          {
             "id":3211927044,
             "best_id":3211927044,
             "user_id":16873295,
             "accuracy":0.8836257309941521,
             "mods":[
                
             ],
             "score":1981044,
             "max_combo":377,
             "perfect":false,
             "statistics":{
                "count_50":1,
                "count_100":41,
                "count_300":238,
                "count_geki":29,
                "count_katu":21,
                "count_miss":5
             },
             "pp":69.7365,
             "rank":"B",
             "created_at":"2020-08-25T08:26:10+00:00",
             "mode":"osu",
             "mode_int":0,
             "replay":false,
             "beatmap":{
                "difficulty_rating":4.84,
                "id":1385399,
                "mode":"osu",
                "version":"Fanteer's Insane",
                "accuracy":7.5,
                "ar":9,
                "beatmapset_id":653534,
                "bpm":110,
                "convert":false,
                "count_circles":123,
                "count_sliders":162,
                "count_spinners":0,
                "cs":3.5,
                "deleted_at":null,
                "drain":6,
                "hit_length":95,
                "is_scoreable":true,
                "last_updated":"2018-01-08T11:05:04+00:00",
                "mode_int":0,
                "passcount":772659,
                "playcount":3155157,
                "ranked":1,
                "status":"ranked",
                "total_length":96,
                "url":"https:\/\/osu.ppy.sh\/beatmaps\/1385399"
             },
       ]
    }

    Можешь хоть регуляркой вытягивать этот JSON, преобразовывать его в словарь Python и доставать нужные тебе данные.
    Так получается, потому что все элементы на странице рендерятся JS'ом, а requests не умеет интерпретировать JS-код, по-этому исходный код отличается от конечного, который отображается в твоём браузере. Проверить то, какой изначально страница представляется до отработки JS можешь так, как подсказал Gennady S
    Ответ написан
    Комментировать
  • Что не так с моим парсером на python?

    hottabxp
    @hottabxp Куратор тега Python
    Сначала мы жили бедно, а потом нас обокрали..
    Я уже здесь неоднократно советовал, возьмите себе за правило, перед любым парсингом, загрузите страницу с помощью скрипта себе на диск. Далее откройте страницу в текстовом редакторе, и поищите - есть ли нужный элемент с нужным классом(или id) в html. Если есть, значит можно работать requests'том. В противном случае - Selenium (есть еще XHR...).
    Вот сам код:
    import requests
    
    headers = {'user-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0',
    			'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
    }
    
    url = 'ссылка'
    filename = 'index.html'
    
    response = requests.get(url,headers=headers)
    if response.status_code == 200:
        with open(filename,'w') as file:
            file.write(response.text)
    else:
    	print(response)

    Вписываете ссылку и запускаете скрипт. Если все ОК - на диске появится файл index.html(на этом файле можно дальше тренироваться с парсингом). В противном случае - в консоль вылетит HTTP код ошибки. Если ошибка, подставляете заголовки, cookies ... и заново.

    Конкретно в данном случае, элемента div с классом play-detail в html нет. Он появиться после обработки js скриптов js движком. Но выход есть. Все данные есть. Но они в формате json в теге script с id (если не ошибаюсь) - json-extras.
    Ответ написан
    Комментировать