Объясните пожалуйста, как это работает

Ivan Petrov

Новичок
Пользователь
Окт 19, 2022
6
0
1
Доброго времени. Происходит индексация от 1 до к примеру 10, но как не могу понять, подскажите пожалуйста

Python:
name = input('Введите буквенное выражение с цифрой(например от C1 до C10): ')
note = name[0]
octave = int(name[1])
C4_FREQ = 261.63
freq = C4_FREQ / 2 ** (4 - octave)
print(freq)
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
Ну а что тут тебе не понятно? Тут все очень просто! :)
  1. name = input('Введите буквенное выражение с цифрой(например от C1 до C10): ') - Эта строка выводит в консоль сообщение (из скобок) и ждет, когда пользователь что-то введет в консоль и нажмет "Enter". Когда пользователь выполнит ожидаемое программой действие, то, что он ввел (строка string), допустим, "С0" присваивается переменной "name"
  2. note = name[0] - Тут из строки, что находится в переменной "name" (С0) берется символ по индексу "0". То есть символ "С". Индексация в строке начинается с "0", то есть первый символ строки имеет индекс "0", второй - индекс "1", третий - "2" и так далее. Данный взятый из строки символ присваивается переменной "note". Однако далее эта переменная в программе никак не используется. Вопрос - зачем тогда она?
  3. octave = int(name[1]) - Далее из той же переменной "name", в которой, как мы помним, находится строка "С0", берется второй по счету символ с индексом "1" (name[1]). Далее, поскольку взятый от строки (тип string) кусок тоже является строкой (тип string) и не может участвовать в арифметических операциях, он преобразуется в цельно-численный тип с помощью метода "int()". В итоге переменной "octave" присваивается число "0". Понятно?
  4. C4_FREQ = 261.63 - Здесь объявляется константа "C4_FREQ" и ей присваивается дробное (тип float) значение "261.63". Константа - это неизменная переменная. То есть, присвоив ей значение, его уже нельзя изменить. И название константы, в отличие от обычной переменной, пишется только заглавными буквами.
  5. freq = C4_FREQ / 2 ** (4 - octave) - Ну а здесь пошла основная логика программы. ;) Здесь пошли вычисления. Из переменной "octave" берется ее значение и подставляется в выражение. Также подставляется в выражение значение константы "C4_FREQ". В итоге мы имеем "261.63 / 2 ** (4 - 0)". По закону порядка арифметических действий сперва выполняется действие в скобках. После этого выполнения у нас остается "261.63 / 2 ** 4". Выражение "2 ** 4" означает число "2" в 4-ой степени. Возведение в степень выполняется во вторую очередь после действия в скобках. После возведения двойки в степень четыре мы имеем "261.63 / 16". Производим деление и получаем ответ "16.351875". Теперь этот ответ присваивается переменной "freq".
  6. print(freq) - Ну и в финале команда "print()" выводит в консоль результат расчетов, то есть число "16.351875"
Однако, в данной программе в самой первой ее строке нет никаких проверок ввода от пользователя. Можно ввести "С0" и русскими буквами, и английскими. Можно вообще не вводить букву "С", а вместо нее ввести букву "В". Или вообще не вводить букву в начале, а ввести две цифры, допустим "11". Также можно ввести и больше символов, и меньше. Если ввести только один символ, допустим "1", то программа на кадре "octave = int(name[1])" выдаст ошибку "IndexError: string index out of range", так как в строке из одного символа есть только символ с индексом [0] и нет второго символа с индексом [1]. Если ввести строку длиннее, например, "12345" то из нее в программу возьмутся только 2 первых символа, а остальные будут просто проигнорированы. Если же вместо цифр ввести 2 буквы, допустим "ас", то программа опять же выдаст ошибку
"ValueError: invalid literal for int() with base 10: 'с'". Выдаст она ее на том же кадре "octave = int(name[1])", так как команда "name[1]" возьмет из строки "ас" символ (букву) "с". А при попытке выполнить инструкцию "int('c')" вылезет ошибка, так как невозможно трансформировать буквенный символ в целое число.

Вот для того, чтобы предотвратить подобные ошибки, юный программист и должен вводить в программу всевозможные условия "if-elif-else", 'in-not in', чтобы оградить юзера (пользователя) от неверного ввода данных. Так называемая "защита от дурака". Учитесь, мой друг! Успехов! :giggle:
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 661
474
83
оно не работает, я ввел "от C1 до C10", ошибку дает...

PS
не понятно, что нужно объяснить, я думаю дебагер вам все расскажет...
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
СПАСИБО) Как все разжёвано, я аж офигел от ответа)
Незачто! С тебя 2000 рублей! Шучу! :D С тебя лайк и стрелочка вверх!
 

Ivan Petrov

Новичок
Пользователь
Окт 19, 2022
6
0
1
Извиняюсь , забыл упомянуть, нужно на английской раскладке вводить c заглавной буквы
оно не работает, я ввел "от C1 до C10", ошибку дает...

PS
не понятно, что нужно объяснить, я думаю дебагер вам все расскажет...
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
А еще вместо двух последних строк
Python:
freq = C4_FREQ / 2 ** (4 - octave)
print(freq)
можно написать проще:
Python:
print(freq = C4_FREQ / 2 ** (4 - octave))
То есть можно не присваивать значение вычислений промежуточной переменной "freq", а сразу записать арифметическое выражение в скобки метода "print()". Только не напутайте ничего с количеством круглых скобок "()"! Иначе код читаться не будет и интерпретатор выдаст синтаксический "error".
Данное сокращение кода называется ОПТИМИЗАЦИЕЙ. Но для сохранения удобочитаемости Вашего кода и его понятности Вы можете пользоваться промежуточными переменными, давая им понятные Вам имена. Также Вы можете смело использовать в Вашем коде комментарии для пояснения самому себе тех или иных участков кода. Допустим:
Python:
'''
Это
многострочный
комментарий
;)
'''

# А это однострочный комментарий

name = input('Введите буквенное выражение с цифрой(например от C1 до C10): ') # Ожидание ввода в консоль от юзера
note = name[0] # Берем первый символ строки
octave = int(name[1]) # Берем 2-ой символ строки и делаем из него число
C4_FREQ = 261.63 # Объявление константы
freq = C4_FREQ / 2 ** (4 - octave) # Рассчеты
print(freq) # Итоговый вывод
 
Последнее редактирование:

Ибрагим

Новичок
Пользователь
Ноя 18, 2022
10
0
1
Ну а что тут тебе не понятно? Тут все очень просто! :)
  1. name = input('Введите буквенное выражение с цифрой(например от C1 до C10): ') - Эта строка выводит в консоль сообщение (из скобок) и ждет, когда пользователь что-то введет в консоль и нажмет "Enter". Когда пользователь выполнит ожидаемое программой действие, то, что он ввел (строка string), допустим, "С0" присваивается переменной "name"
  2. note = name[0] - Тут из строки, что находится в переменной "name" (С0) берется символ по индексу "0". То есть символ "С". Индексация в строке начинается с "0", то есть первый символ строки имеет индекс "0", второй - индекс "1", третий - "2" и так далее. Данный взятый из строки символ присваивается переменной "note". Однако далее эта переменная в программе никак не используется. Вопрос - зачем тогда она?
  3. octave = int(name[1]) - Далее из той же переменной "name", в которой, как мы помним, находится строка "С0", берется второй по счету символ с индексом "1" (name[1]). Далее, поскольку взятый от строки (тип string) кусок тоже является строкой (тип string) и не может участвовать в арифметических операциях, он преобразуется в цельно-численный тип с помощью метода "int()". В итоге переменной "octave" присваивается число "0". Понятно?
  4. C4_FREQ = 261.63 - Здесь объявляется константа "C4_FREQ" и ей присваивается дробное (тип float) значение "261.63". Константа - это неизменная переменная. То есть, присвоив ей значение, его уже нельзя изменить. И название константы, в отличие от обычной переменной, пишется только заглавными буквами.
  5. freq = C4_FREQ / 2 ** (4 - octave) - Ну а здесь пошла основная логика программы. ;) Здесь пошли вычисления. Из переменной "octave" берется ее значение и подставляется в выражение. Также подставляется в выражение значение константы "C4_FREQ". В итоге мы имеем "261.63 / 2 ** (4 - 0)". По закону порядка арифметических действий сперва выполняется действие в скобках. После этого выполнения у нас остается "261.63 / 2 ** 4". Выражение "2 ** 4" означает число "2" в 4-ой степени. Возведение в степень выполняется во вторую очередь после действия в скобках. После возведения двойки в степень четыре мы имеем "261.63 / 16". Производим деление и получаем ответ "16.351875". Теперь этот ответ присваивается переменной "freq".
  6. print(freq) - Ну и в финале команда "print()" выводит в консоль результат расчетов, то есть число "16.351875"
Однако, в данной программе в самой первой ее строке нет никаких проверок ввода от пользователя. Можно ввести "С0" и русскими буквами, и английскими. Можно вообще не вводить букву "С", а вместо нее ввести букву "В". Или вообще не вводить букву в начале, а ввести две цифры, допустим "11". Также можно ввести и больше символов, и меньше. Если ввести только один символ, допустим "1", то программа на кадре "octave = int(name[1])" выдаст ошибку "IndexError: string index out of range", так как в строке из одного символа есть только символ с индексом [0] и нет второго символа с индексом [1]. Если ввести строку длиннее, например, "12345" то из нее в программу возьмутся только 2 первых символа, а остальные будут просто проигнорированы. Если же вместо цифр ввести 2 буквы, допустим "ас", то программа опять же выдаст ошибку
"ValueError: invalid literal for int() with base 10: 'с'". Выдаст она ее на том же кадре "octave = int(name[1])", так как команда "name[1]" возьмет из строки "ас" символ (букву) "с". А при попытке выполнить инструкцию "int('c')" вылезет ошибка, так как невозможно трансформировать буквенный символ в целое число.

Вот для того, чтобы предотвратить подобные ошибки, юный программист и должен вводить в программу всевозможные условия "if-elif-else", 'in-not in', чтобы оградить юзера (пользователя) от неверного ввода данных. Так называемая "защита от дурака". Учитесь, мой друг! Успехов! :giggle:
афигенно легко 😅
 

Malenkey

Пользователь
Пользователь
Ноя 3, 2022
140
11
18
Ибрагим, тебе что-то непонятно? Оставайся после уроков! :geek:
 

Ivan Petrov

Новичок
Пользователь
Окт 19, 2022
6
0
1
А еще вместо двух последних строк
Python:
freq = C4_FREQ / 2 ** (4 - octave)
print(freq)
можно написать проще:
Python:
print(freq = C4_FREQ / 2 ** (4 - octave))
То есть можно не присваивать значение вычислений промежуточной переменной "freq", а сразу записать арифметическое выражение в скобки метода "print()". Только не напутайте ничего с количеством круглых скобок "()"! Иначе код читаться не будет и интерпретатор выдаст синтаксический "error".
Данное сокращение кода называется ОПТИМИЗАЦИЕЙ. Но для сохранения удобочитаемости Вашего кода и его понятности Вы можете пользоваться промежуточными переменными, давая им понятные Вам имена. Также Вы можете смело использовать в Вашем коде комментарии для пояснения самому себе тех или иных участков кода. Допустим:
Python:
'''
Это
многострочный
комментарий
;)
'''

# А это однострочный комментарий

name = input('Введите буквенное выражение с цифрой(например от C1 до C10): ') # Ожидание ввода в консоль от юзера
note = name[0] # Берем первый символ строки
octave = int(name[1]) # Берем 2-ой символ строки и делаем из него число
C4_FREQ = 261.63 # Объявление константы
freq = C4_FREQ / 2 ** (4 - octave) # Рассчеты
print(freq) # Итоговый вывод
СПАСИБО) Как все разжёвано, я аж офигел от ответа)
 

Ибрагим

Новичок
Пользователь
Ноя 18, 2022
10
0
1
Ибрагим, тебе что-то непонятно? Оставайся после уроков! :geek:
с радостью;):)😋
 
Последнее редактирование:

Форум IT Специалистов