Учим питон (или пайтон)

Автор _Swetlana, 08 января 2024, 21:30

« назад - далее »

_Swetlana

Делюсь моим опытом.
Изучать начали одновременно с внуком на бесплатных курсах для школьников в одной широко разрекламированной онлайн-школе. Занятия 3 раза в неделю по 1,5 часа + перерыв, итого почти 2 часа. Курсы начались где-то в конце октября. И сразу после этого я серьёзно заболела (реактивный синовит колена), 3 недели почти не ставала, нужно было себя чем-то занять.
(В скобках замечу, что летом, наконец, купила смартфоны себе и мужу, изучила весь рынок и выбрала Cubot P60. Шикарный телефон за 8 т.р., неплохая камера, много памяти, андроид 12. На чем они сэкономили - монозвук. Впрочем, для нас это некритично. Отсутствие музыкального слуха - это у нас семейное.)
Ну вот я лежу на диване с распухшим коленом, в руках - новая игрушка. На онлайн-курсах дали ссылку на Sololearn (армяно-американская обучающая платформа, получившая тучу грантов, наград и т. д.) - захожу туда через свой гугл-аккаунт, создаю там свой аккаунт и записываюсь на курс Питон для начинающих, русифицированный. Там какая-то теория, после теории небольшие и очень простые задания, курс сделан хорошо, подробно. К каждому заданию люди из разных стран пишут комментарии, ощущение, что все побежали, и я побежала  ;D прохожу эту курс за один день. Получаю сертификат. Тут же записываюсь на курс Питон для продолжающих - сделан совершенно халтурно, ничему научиться невозможно. Дошла до середины, бросила, стала осматриваться. На сайте какая-то движуха, какие-то поединки, все что-то пишут. Главное хорошее, что там есть - тренажеры кода. Условие задачи обычно большое, приближенное к реальной жизни, на английском (заодно и английский освежить). Пишешь программу, запускаешь, она или проходит ряд тестов, и пишет ошибку.
Там я перерешала (на питоне) все задачи средней трудности и все сложные, кроме двух. Одна - парсер арифметических выражений, хочу сделать её с помощью классов. Вторая - вывести любой заданный знак числа π. Неохота разбираться с математикой, какой там ряд удобнее суммировать.
1. Первая моя рекомендация - если есть возможность пользоваться Sololearn, то воспользуйтесь их тренажерами.
Приложение чисто мобильное, но я зашла с десктопа в почту, попыталась подтвердить регистрацию, что-то пошло не так. В результате бесплатный 14-дневный период у меня давно закончился, подписки на них у меня нет, а приложение и аккаунт есть.

Потом я стала искать ещё курсы и нашла бесплатные курсы Code Basics от компании ООО «Хекслет Рус», 432071, г. Ульяновск, пр-т Нариманова, дом 1Г, оф. 23, Russian Federation. Курсы по языкам с самыми начальными сведениями бесплатно, продолжение с новогодней скидкой 120 т.р.
Курс по питону для начинающих сделан хорошо, есть тренажеры кода, все очень подробно и обстоятельно, на середине обрывается. Его тоже прошла очень быстро. Можно проходить и на десктопе, и на мобилке, но результаты не переносятся. Есть обсуждение, есть дежурные модераторы, от которых можно получить какую-то обратную связь.
https://code-basics.com/ru
2. Вторая моя рекомендация: если вы очень начинающий можно и там пройти курс.

Затем я нашла курсы на codebra, там с меня взяли 999 р. Тренажеры сделаны плохо. Собственно, нужно самому в чем-то написать программу, затем загрузить файл к ним на сайт, и ещё ждать, когда прострекочет. Где=то на середине курса, с началом функций, тренажеры вообще исчезли, остались одни тесты. Создают видимость каких-то заданий.
3. Но всё же рекомендую и этот курс: автор курса очень хорошо пишет про функции, про области видимости, про локальные и глобальные переменные, с примерами программ. Вот именно эта сложная тема очень хорошо разобрана.
 
Дальше функций я пока не читала, т.к. в поисках практики и тренажеров нашла другую платформу: Stepik.

     

_Swetlana

Это Stepik
https://stepik.org/learn

Там много чего, или бесплатно, или за небольшие деньги.
Я выбрала линейку "Поколение Пайтон" из трёх курсов: для начинающих, для продолжающих, для профессионалов. Первые два бесплатные, второй с новогодней скидкой около четырех тысяч.
Первый курс я полностью прошла, сегодня получила сертификат.
Огоромное количество задач и тренажеров кода!
Задачи советско-школьного типа, т.е. академические. Хотя явно делали под Sololearn.
Но для школьника и для начинающего - очень хорошо, натренироваться, руку набить на стандартных алгоритмических конструкциях. Есть, конечно, что мне не очень понравилось... С другой стороны, я уже и не совсем начинающий.
Так что всем рекомендую, а сама перехожу на второй курс - питон для продолжающих.

Теперь о курсах той самой онлайн-школы. Пока я два месяца била по клавишам на всех тренажерах кода, внук смотрел на вебинарах, как преподаватель (хороший, кстати) самозабвенно пишет программы. Никаких тренажеров кода, никаких дз написать программу. Да и кто ее будет проверять, если у препода 3 группы, в каждой 50 человек и цель не научить программировать, а сохранить контингент. Т.е. довести максимальное количество бездельников до выпуска, давая им несложные заданья. Собственно, как и везде с подушевым финансированием.
Отправила его на степик, уже что-то пишет.

Vesle Anne

Есть еще литкод - там много разных задачек. Также рекомендую Хирьянова (правда, это внуку, наверное, еще рано - в открытом доступе вроде только его университетский курс есть, а фоксфордовский, для школьников, за денежку, насколько мне известно).

_Swetlana

Вот самое сложное заданье из первого курса - запрограммировать шифровку/дешифровку кода Цезаря для русского и английского языков. Вчера полдня писала. С английским программа заработала - с русским не работает. С русским языком чего только не узнаешь.  Например, что буква ё не находится среди букв русского алфавита.
Вот моё решение

# шифр Цезаря
# ввод языка
def input_lang():
    lang = input('Укажите язык ru/en ').lower()
    while lang != 'ru' and lang != 'en':
        lang = input('Укажите язык ru/en ').lower()
    return lang   

# ввод ключа шифрования
def input_key(lan):
# lan - язык, en или ru
    s = input('Укажите ненулевое целое число k ключ шифровки/дешифровки k/-k ')
    if len(s) >= 2 and s
  • == '-' and s[1:].isdigit():
        k = -1*int(s[1:])
    elif s.isdigit():
        k = int(s)
    else:
        print("Ошибка ввода!")
        return input_key(lan)
   
    if lan == "ru":
        len_lan = 32 # мощность русского алфавита
        return k % len_lan 
    elif lan == "en":
        len_lan = 26 # мощность английского алфавита
        return k % len_lan
   
# ввод текста
def input_text():
    return input("Укажите строку ")

# замена одного символа
def replace_up_and_low(lang, k, i, text, f):
# lang - язык, k - ключ шифрования/дешифровки, text - строка, i - позиция символа в строке, f - регистр, up или low 
    if f == 'up' and lang == "en":
        len_lan = 26
        num = ord("A")
    elif f == 'low' and lang == "en":
        len_lan = 26
        num = ord("a")
    elif f == 'up' and lang == "ru":
        len_lan = 32
        num = ord("А")
    elif f == 'low' and lang == "ru":
        len_lan = 32
        num = ord("а")       
    p = (ord(text) - num + k) % len_lan
    p = p + num
    return text[:i] + text[i:].replace(text, chr(p), 1)

# шифрование
def encryption(lan, k, text):
    for j in range(len(text)):
        if text[j].islower():
            text = replace_up_and_low(lan, k, j, text, "low")
        elif text[j].isupper():
            text = replace_up_and_low(lan, k, j, text, "up")
    return text       

# main
language = input_lang()
key = input_key(language)
user_text = input_text()
print(encryption(language, key, user_text))


_Swetlana

Цитата: Vesle Anne от 08 января 2024, 21:51Есть еще литкод - там много разных задачек. Также рекомендую Хирьянова (правда, это внуку, наверное, еще рано - в открытом доступе вроде только его университетский курс есть, а фоксфордовский, для школьников, за денежку, насколько мне известно).
Извините, вам запрещён просмотр содержимого спойлеров.

Vesle Anne


Hellerick

#6
@_Swetlana
пользуйтесь тэгом [code], пожалуйста, он специально для этого и придуман. А то движок форума ваш код гробит.
Что до шифра Цезаря, то зачем пользователю выбирать между русским и английским алфавитом? Пусть программа работает сразу с обоими.

lammik


Hellerick

#8
Написал свой вариант.
Любую введенную строку программа пытается и зашифровать, и расшифровать.
Так что можно побаловаться, посмотреть, как происходит преобразование.

alphabets = (
        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'abcdefghijklmnopqrstuvwxyz',
        'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ',
        'абвгдеёжзийклмнопрстуфхцчшщъыьэюя',
    )

key = int(input('Enter the key: '))
print()

go_on = True

while go_on:
    text = input('Enter text: ')
    if text == '':
        go_on = False
    if go_on:
        encrypted = text
        decrypted = text
        for i in range(len(text)):
            for alphabet in alphabets:
                if text[i] in alphabet:
                    pos = [j for j in range(len(alphabet)) if alphabet[j] == text[i]][0]
                    encrypted = encrypted[:i]+alphabet[(pos+key)%len(alphabet)]+encrypted[i+1:]
                    decrypted = decrypted[:i]+alphabet[(pos-key)%len(alphabet)]+decrypted[i+1:]
        print('Encrypted: ', encrypted)
        print('Decrypted: ', decrypted)
        print()

Образец исполнения:

Enter the key: 10

Enter text: Куда идём мы с Пятачком is a very big secret.
Encrypted:  Фэнй тнпц це ы Щиьйбфшц sc k fobi lsq combod.
Decrypted:  Бйъц яъьг гс з Ёхицнбег yi q luho ryw iushuj.

Enter text: Фэнй тнпц це ы Щиьйбфшц sc k fobi lsq combod.
Encrypted:  Южчу ьчща ао е Гтёукюва cm u pyls vca mywlyn.
Decrypted:  Куда идём мы с Пятачком is a very big secret.

Enter text:

Зато проблем с Ё нет.

Hellerick

#9
Можно находить номер буквы в алфавите и покороче: через метод find, но я об этом методе не знал, и ребенок, наверное, тоже знать не должен. Такие вещи нагугливаются по мере необходимости.
А вот без list comprehensions в питоне делать нечего.

alphabets = (
        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'abcdefghijklmnopqrstuvwxyz',
        'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ',
        'абвгдеёжзийклмнопрстуфхцчшщъыьэюя',
    )

key = int(input('Enter the key: '))
print()

go_on = True

while go_on:
    text = input('Enter text: ')
    if text == '':
        go_on = False
    if go_on:
        encrypted = text
        decrypted = text
        for i in range(len(text)):
            for alphabet in alphabets:
                if text[i] in alphabet:
                    pos = alphabet.find(text[i])
                    encrypted = encrypted[:i]+alphabet[(pos+key)%len(alphabet)]+encrypted[i+1:]
                    decrypted = decrypted[:i]+alphabet[(pos-key)%len(alphabet)]+decrypted[i+1:]
        print('Encrypted: ', encrypted)
        print('Decrypted: ', decrypted)
        print()

_Swetlana

#10
Спасибо, Hellerick!
Сейчас буду изучать ваш код))

Цитата: lammik от 09 января 2024, 06:02А сколько лет внуку?
Внук в 10 классе, в след. году будем готовиться к сдаче ЕГЭ по информатике на питоне.
Соответственно, план такой. В этом году изучаем питон, а в след. году бессмысленное и беспощадное натаскивание на решение егэшных задач.
Интересно, что каждый год в егэ добавляют какой-нибудь самый простой вариант из тех задач, что я читала второкурсникам. То на графе найти центр или медиану, только граф такого вида, что матрицу расстояний можно вручную сделать, без алгоритма Флойда, то что-нибудь из динамического программирования. 

Цитата: Vesle Anne от 08 января 2024, 22:03С Хирьяновым? Там разные преподы есть вроде.
Нет, Хирьянова на этих курсах нет.

Hellerick

#11
Самая страшная строка моего скрипта выглядет особенно страшной из-за использования там слайсинга: разрезания строки выражениями типа word[:1].
Мне пришлось прибегнуть к нему из-за того, что формат данных строковых переменных в питоне не позволяет их значения изменять, он позволяет их значения только заменять.
Нельзя написать

word = "мама"
word[0] = "р"

и надеяться, что теперь word равно "рама". Интерпретатор выдаст TypeError.
Вот и приходится строку разрезать, заменять кусок и обратно соединять.
Зато в списках отдельные их элементы заменять можно.
К счастью, строки и списки можно легко преобразовывать друг в друга.

word = list("мама")
word[0] = "р"
word = ''.join(word)

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

alphabets = (
        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        'abcdefghijklmnopqrstuvwxyz',
        'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ',
        'абвгдеёжзийклмнопрстуфхцчшщъыьэюя',
    )

key = int(input('Enter the key: '))
print()

go_on = True

while go_on:
    text = input('Enter text: ')
    if text == '':
        go_on = False
    if go_on:
        encrypted = list(text)
        decrypted = list(text)
        for i in range(len(text)):
            for alphabet in alphabets:
                if text[i] in alphabet:
                    pos = alphabet.find(text[i])
                    encrypted[i] = alphabet[(pos+key)%len(alphabet)]
                    decrypted[i] = alphabet[(pos-key)%len(alphabet)]
        print('Encrypted: ', ''.join(encrypted))
        print('Decrypted: ', ''.join(decrypted))
        print()


_Swetlana

Цитата: Hellerick от 09 января 2024, 17:24Самая страшная строка моего скрипта выглядет особенно страшной из-за использования там слайсинга: разрезания строки выражениями типа word[:1].
Вспомнился американский лингвистический анекдот:
Вам сыр послайсить, или целым писом возьмёте?

_Swetlana

Подоспело новое заданье из курса для продвинутых.

Задача Иосифа Флавия
В 67 году н.э. во время иудейско-римской войны Иосиф Флавий и сорок мятежников оказались в ловушке в пещере. Предпочтя самоубийство плену, они решили встать в круг и убивать каждого третьего из оставшихся в живых. Иосиф Флавий хотел остаться в живых и понял, где он должен стоять в кругу, чтобы остаться в живых в череде казней. Так он выжил, чтобы рассказать эту легенду.

Хорошие картинки вот здесь
https://habr.com/ru/articles/709540/
В обсуждении ссылка на библиотеку алгоритмов, там собраны все алгоритмы решения.

_Swetlana

Вначале, конечно, пыталась вывести аналитическую формулу, тихо сетовала, что совсем дура стала. Потом погуглила и выяснила, что формулы нет. Что, в общем, не противоречит предыдущему высказыванию.
Рекурсивное соотношение тоже не сразу вывела. Но вывела  :)

# задача Иосифа Флавия, нумерация с 0
n = int(input()) # количество игроков, нумерация начинается с 0
k = int(input()) # вычеркиваем каждого k-го

# граничное условие рекурсии:
    # при одном игроке он же оставшийся: flavius(1, _) = 0
# рекуррентное соотношение для n игроков:
    # flavius(n, k) = (flavius(n-1, k) + k) mod n

def flavius(nn, kk):
    if nn == 1: return 0
    elif nn == 2:
        if kk % 2 == 0: return 0
        else: return 1
    else:
        return (flavius(nn-1, kk) + kk) % nn

res_rek = flavius(n, k)

f0 = 0 # n = 1, номер оставшегося - 0
for i in range(2, n + 1):
    f1 = (f0 + k) % i # n = i, f1 - номер оставшегося при нумерации с 0
    f0 = f1

res_vector = f1   

if res_rek == res_vector:
    print(res_vector + 1) # номер при нумерации с 1

_Swetlana

Потом открыла правильное решение.
Нужно было так делать
res = 0
for i in range(1, n+1):
    res = (res + k) % i

Hellerick

#16
Честно говоря, ничего в этих алгоритмах не понимаю.
Нельзя было просто так сделать?
n = int(input('Number of people: '))
k = int(input('Count for execution: '))
people = [i+1 for i in range(n)]
while len(people)>=k:
    people = people[3:]+people[:2]
print('Survivors:', people)

Hellerick

Почему у вас вообще один человек остается? Разве их не двое должно быть? Кто третий среди двоих?
Кстати, на эту тему был неплохой сериал. https://www.kinopoisk.ru/series/405546/

lammik


lammik

#19
Так что в конце останется только один.

lammik

Цитата: Vesle Anne от 08 января 2024, 21:51а фоксфордовский, для школьников, за денежку, насколько мне известно).

Лежит на Рутрекере.

Hellerick

Цитата: lammik от 11 января 2024, 09:59Среди двоих третьим станет первый по счёту.

Не убивал Иосиф первого.

Цитата: Иудейская война (Иосиф Флавий; Черток)/Книга третьяПо счастливой ли случайности, а быть может по божественному предопределению, остался последним именно Иосиф ещё с одним. А так как он не хотел ни самому быть убитым по жребию, ни запятнать свои руки кровью соотечественника, то он убедил и последнего сдаться римлянам и сохранить себе жизнь.

А в Англовики первого вообще называют его сообщником.

_Swetlana

Цитата: lammik от 11 января 2024, 10:01
Цитата: Vesle Anne от 08 января 2024, 21:51а фоксфордовский, для школьников, за денежку, насколько мне известно).

Лежит на Рутрекере.
БПЧ! (большое человеческое спасибо)
Извините, вам запрещён просмотр содержимого спойлеров.

lammik

#23
Цитата: _Swetlana от 11 января 2024, 16:27БПЧ! (большое человеческое спасибо)

Да не за что, я всегда там изначально ищу что угодно. Но связи "БПЧ" и "большого человеческого спасибо" не уловил. :)

_Swetlana

Цитата: lammik от 11 января 2024, 17:51
Цитата: _Swetlana от 11 января 2024, 16:27БПЧ! (большое человеческое спасибо)

Да не за что, я всегда там изначально ищу что-угодно. Но связи "БПЧ" и "большого человеческого спасибо" не уловил. :)
Это я на смартфоне набирала. Куда палец попадёт, туда и ладно  ;D

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
ALT+S — отправить
ALT+P — предварительный просмотр