Top.Mail.Ru
Ответы

Задание просто убило. Как решить в 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. В задании уже буквально прописан сам код. Обход исключений (см. гугл):

12345678910111213
 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 
  1. Остаётся только придумать как проверить данные. Вариантов тьма. Самый простой и топорный - перебирать строку и проверять if-ами. Изящное решение - регулярные выражения (см.гугл, модуль re). Если прописать в основной if() проверку совпадения по маске:

1
 '[A-Z][a-z]+$' 

, то в него "пройдут" только строки (в силу того что сравнение будет строки со строкой и при попытке сравнить с чем угодно кроме строки само собой вылезет TyreError) с одной заглавной латинской буквой в начале [A-Z] и одной и более строчных букв до конца строки [a-z]+$. Цифры даже в виде str такой фильтр уже не пройдут. Чтобы работало как самостоятельная функция, import re надо поставить сразу перед try:

3. Использовать в качестве id количество элементов списка - это дурь. Во-первых первый элемент списка имеет индекс = 0, т.е. 1010-й ученик имеет id = 1009. Очень удобно(нет). Во-вторых при сортировке или удалении всё это "поплывёт" и id перераспределятся. Такой себе идентификатор, который внезапно может измениться из-за операций над списком. Но посчитать длину списка и прибавить к нему единицу вы вполне можете самостоятельно.

Аватар пользователя
Мудрец

Ничего "убийственного" тут нет. Например реализуем проверку на то что Первая буква обязательно заглавная, остальные - только строчные.
Не решение ВСЕГО задания, только демонстрация логики решений таких штук

123456789101112
 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'))