Задание просто убило. Как решить в Python
В онлайн-школе BEEGEEK имя ученика считается корректным, если оно начинается с заглавной латинской буквы, за которой следуют строчные латинские буквы. Например, имена Timur и Yo считаются корректными, а имена timyrik, Yo17, TimuRRR нет. Также у каждого ученика имеется идентификационный номер, представленный натуральным числом, который выдается при поступлении в школу. К примеру, если в школе обучается 1010 учеников, то новый прибывший ученик получит идентификационный номер равный 1111.
Реализуйте функцию get_id(), которая принимает два аргумента:
names — список имен учеников, обучающихся в школе
name — имя поступающего ученика
Функция должна возвращать идентификационный номер, который получит поступающий в школу ученик, при этом
если имя ученика name не является строкой (тип str), функция должна возбуждать исключение:
TypeError('Имя не является строкой')
если имя ученика name является строкой (тип str), но не представляет собой корректное имя, функция должна возбуждать исключение:
ValueError('Имя не является корректным')
Примечание 1. В тестирующую систему сдайте программу, содержащую только необходимую функцию get_id(), но не код, вызывающий ее.
Нейросети...
Для программистов
Adrenaline — исправит ошибки в коде.
Tabnine — допишет код за вас.
CodePal — напишет код, исправит баги и выдаст ревью.
Code GPT — плагин-генератор кода для VSCode.
Autobackend — поможет с бэкендом.
Codesnippets — генерит код из текстовых запросов, подходит для команд.
Buildt AI — поисковик для VSCode, найдет готовый код в инете.
def get_id(names: list, name: str):
try:
return len(names) + 1
except TypeError:
print("Имя не является строкой!")
except ValueError:
print("Имя не является корректным")
что это за айди с шагом в 101?
Путем чтения документации решить.
1. В задании уже буквально прописан сам код. Обход исключений (см. гугл):
def get_id(name, names) #функция с аргументами name и names
try: #обход исключений
if <условие>: #Проверяем подходит ли name по двум критериям, один из которых - любая операция возможная только над строкой. Например, попытка сложить name + 'str'.
id = #Если подходит, то присваиваем id
else:
raise ValueError #Если не подходит то вызываем исключение ValueError
except TypeError: #Первое исключение
print('Имя не является строкой')
except ValueError: #Второе исключение
print('Имя не является корректным')
finally:
return id #Вывод значения id
Остаётся только придумать как проверить данные. Вариантов тьма. Самый простой и топорный - перебирать строку и проверять if-ами. Изящное решение - регулярные выражения (см.гугл, модуль re). Если прописать в основной if() проверку совпадения по маске:
'[A-Z][a-z]+$'
, то в него "пройдут" только строки (в силу того что сравнение будет строки со строкой и при попытке сравнить с чем угодно кроме строки само собой вылезет TyreError) с одной заглавной латинской буквой в начале [A-Z] и одной и более строчных букв до конца строки [a-z]+$. Цифры даже в виде str такой фильтр уже не пройдут. Чтобы работало как самостоятельная функция, import re надо поставить сразу перед try:
3. Использовать в качестве id количество элементов списка - это дурь. Во-первых первый элемент списка имеет индекс = 0, т.е. 1010-й ученик имеет id = 1009. Очень удобно(нет). Во-вторых при сортировке или удалении всё это "поплывёт" и id перераспределятся. Такой себе идентификатор, который внезапно может измениться из-за операций над списком. Но посчитать длину списка и прибавить к нему единицу вы вполне можете самостоятельно.
Ничего "убийственного" тут нет. Например реализуем проверку на то что Первая буква обязательно заглавная, остальные - только строчные.
Не решение ВСЕГО задания, только демонстрация логики решений таких штук
def f(n):
first = n[:1].isupper()
other = n[1:]
second = True
for i in other:
if i.isupper():
second = False
break
return all([first, second])
print(f('Timur'))
print(f('TimuRRR'))