Как можно сократить код слишком длинный?

def isdigit1(a):
    n_list = list(a)
    count = 0
    for s in n_list:
        if s.isdigit() == True:
            count += 1
    if count >= 1:
        return True
    else:
        return False   

def isalpha1(a):
    n_list = list(a)
    count = 0
    for s in n_list:
        if s.isalpha() == True:
            count += 1
    if count > 0:
        return True
    else:
        return False

def islower1(a):
    n_list = list(a)
    count = 0
    for s in n_list:
        if s.islower() == True:
            count += 1
    if count >= 1:
        return True
    else:
        return False

def isupper1(a):
    n_list = list(a)
    count = 0
    for s in n_list:
        if s.isupper() == True:
            count += 1
    if count >= 1:
        return True
    else:
        return False


if __name__ == '__main__':
    s = input()
    print(s.isalnum())
    print(isalpha1(s))
    print(isdigit1(s))
    print(islower1(s))
    print(isupper1(s))

ругается валидатор проверки решения, для более ресурсоемких тестов


Ответы (4 шт):

Автор решения: Roman-Stop RU aggression in UA
def isdigit1(a):
    return any(s.isdigit() for s in a)

С остальными аналогично

→ Ссылка
Автор решения: Dmitry

Несколько замечаний на примере первой функции.

  1. Нет необходимости преобразовывать с типу данных list, можно перебирать по символу в строке
  2. Нет необходимости накапливать значение в счетчик, поскольку вам необходимо только одно совпадение, чтобы вернуть True
  3. Нет необходимости писать if s.isdigit() == True:, поскльку под капотом это выглядит вот так if True == True. Пишите просто if s.isdigit():
  4. Нет необходимости пробегать по всем значениям последовательности, можно вернуть True при первом попадании.

из всего вышесказанного

def isdigit1(a):
    for s in a:
        if s.isdigit():
            return True
    return False
→ Ссылка
Автор решения: Stanislav Volodarskiy
def isdigit1(a):
    n_list = list(a) # Преобразовывать строку в список не надо - цикл
                     # перебирает символы строки так же как элементы списка.

    count = 0
    for s in n_list:
        if s.isdigit() == True: # `== True` почти всегда бесполезен
            count += 1

    # if ...: return True; else: return False можно сократить до
    # return ...
    if count >= 1:
        return True
    else:
        return False  
def isdigit1(a):
    count = 0
    for s in a:
        if s.isdigit():
            count += 1 # зачем считать, достаточно одного раза
    return count >= 1
def isdigit1(a):
    for s in a:
        if s.isdigit(): # для подобных проверок есть any
            return True
    return False   
def isdigit1(a):
    return any(s.isdigit() for s in a)

Теперь видна ошибка: isdigit1 проверяет что в строке есть цифры. А нужно проверять что в строке все цифры:

def isdigit1(a):
    return len(s) > 0 and all(s.isdigit() for s in a)

Но встроенная str.isdigit уже это делает:

def isdigit1(a):
    return a.isdigit()

P.S. На правах шутки. a.isdigit() можно записать как str.isdigit(a). Функция которая вызывает другую и ничего больше не делает может быть записана как:

isdigit1 = str.isdigit
→ Ссылка
Автор решения: hellog888

еще короче код ;)

if __name__ == '__main__':
s = input()
print(any(c.isalnum() for c in s))
print(any(c.isalpha() for c in s))
print(any(c.isdigit() for c in s))
print(any(c.islower() for c in s))
print(any(c.isupper() for c in s))
→ Ссылка