Как можно сократить код слишком длинный?
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
→ Ссылка
Несколько замечаний на примере первой функции.
- Нет необходимости преобразовывать с типу данных
list, можно перебирать по символу в строке - Нет необходимости накапливать значение в счетчик, поскольку вам необходимо только одно совпадение, чтобы вернуть
True - Нет необходимости писать
if s.isdigit() == True:, поскльку под капотом это выглядит вот такif True == True. Пишите простоif s.isdigit(): - Нет необходимости пробегать по всем значениям последовательности, можно вернуть
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))