Советы ученику по изучению Python с нуля

Где еще можно изучать Python кроме в pythontutor.ru и как надо изучать? И по каким учебникам стоит заниматься?

А какая цель изучения?

моя цель - участвовать на олимпиадах по программированию

Вообще, для изучения пайтона я бы порекомендовал небольшой курс от MIT

Но для олимпиад кажется лучше изучать языки более низкого уровня, а на каком этапе можно уходить с пайтона на них лучше @Zhabka пусть скажет.

4 лайка

Есть курс на stepik классный

ссылка

Но для олимпиад особо питон не рекомендуется, т.к. он банально медленее, но его знание тебе безусловно поможет, т.к. с его помощью можно написать например что то в длинной арифметике за пару строк, что на том же С++ ты бы писал очень долго.

Вот пример:
Длинная арифметика, если a и b к примеру больше, чем 10^100
С++:

#include<bits/stdc++.h>
using namespace std;
string apb(string x,  string y)
{
      while(x.size() < y.size())
        x = '0' + x;
      while(x.size() > y.size())
        y='0' + y;
      long long a, b, k = 0, i;
      string s = "";
      for(i = x.size() - 1; i>=0; i--)
      {
          a=int(x[i])-48;
          b=int(y[i])-48;
          s=char((a+b+k)%10+48)+s;
          k=(a+b+k)/10;
      }
      if(k==1)s='1'+s;
      return s;
}
string axb(string x, long long y)
{
    long long a, b, i, k = 0, j = 0;
    string sa = "", t = "", s = "";
    while(y > 0)
    {
        k = 0;
        b = y % 10;
        j ++;
        s = "";
        for(i = x.size() - 1; i >= 0; --i)
        {
            a = ((int(x[i]) - 48) * b + k);
            k = a / 10;
            s = char(a % 10 + 48) + s;
        }
        if (k != 0)s = char(k + 48) + s;
        s += sa;
        t = apb(t, s);
        sa += '0';
        y /= 10;
    }
    if(t[0] == '0')t = "0";
    if(t == "")t = "0";
    return t;
}
string nf(long long n)
{
    if(n > 1)
    {
       return axb(nf(n - 1), n);
    }
    else
        return "1";
}
string a;
long long n, b;
int main()
{
    cin >> a >> b ;
    cout << axb(a, b);
}
# на питоне
a = b = int(input())
print(a * b)
3 лайка

Питон подойдёт только для начала, если до этого уже занимался прогой то сразу используй c++,если нет то можешь с помощью любого курса узнать базовые вещи в проге, после базовых вещей начинай решать задачи(на acmp.ru много задач для начинающих), не знаешь как что-то реализовать гуглишь/спрашиваешь на аске.

Ну и питон на школьных олимпиадах вроде использовать не получится, начиная с области можно использовать только c++

2 лайка

(Про то, что питона нет на области)
Хз, у нас область на КФе была и там все языки доступны были, даже хаскелл

Ну я до этого вообще не занимался программированием

Тогда на респе не было питона

А че за ужас здесь творится? Че происходит?

Ну тип в плюсах числа хранятся в 16,32 или 64 битах. А в питоне если я не ошибаюсь единственное ограничение это количество свободной памяти.

Но на самом деле длинка почти бесполезна на школьных олимпиадах, а вне школьных олимпиад почти всегда можно приносить с собой готовую реализацию

и поэтому числа сначала конвертируется в строки, которые потом складываются?

Для того чтобы делать это на плюсах необязательно конвертировать в строки(но тут он так делал), а то как на питоне большие числа складываются я не знаю.

а че надо сделать?

1 лайк

Тогда питон отменяется, очень простое решение. Конечно, чисто теоретически можно попытаться прожить на нем, но это как стрелять себе в ногу, крайне нежелательно. Причины? Во-первых, зачастую авторские решения пишутся только на C++, и нередки случаи, когда на питоне ввиду его малой производительности решить задачу банально нельзя. Во-вторых, как мне кажется юзать более низкоуровневый язык очень полезно для понимания работы программы, мб это спорно но на питоне очень много вещей прячутся в “черную коробку” и для новичка непонимание таких вещей вредно

3 лайка

Хранить массив чисел A, первые 32 цифры будут храниться в A_0, следующие 32 цифры будут храниться в A_1 и т.д. , пусть n длина чисел которые мы храним. Тогда операция сложения будет работать за n/32 действия, а умножение будет работать за n^2/1024 действий(если я не туплю). Так как умножение слишком долгое обычно используют Быстрое Преобразование Фурье с помощью которого можно быстро умножать два многочлена.

1 лайк

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

Но есть просто люди, которые не потянут низкоуровневый в качестве первого и если выбор между “да катись оно все к фигам” и “войти во вкус на питоне, а потом перейти на плюсы”, то лучше, наверное (наверное), второй вариант

1 лайк

Ну и на самом деле можно просто взять и один раз написать(или скопировать) готовую структуру для всего этого, а потом просто пользоваться ею.

Там же вроде очень сложно уменьшить асимптотичность умножения, кажется есть какие-то хитрые алгоритмы, которые максимум до O(n^{3/2}) понижают или сколько-то, но буквально чуть меньше, чем O(n^2).

1 лайк

Это алгоритм Карацубы который работает за O(n^{log_2({3})})

Я там упомянул БПФ, с помощью которого можно умножать числа за O(nlogn)
(Идея очень прикольная и понятная)

1 лайк