Вернуть все буквы алфавита?
Не получается вернуть все буквы алфавита с помощью метода eng_letters(). Возвращает только букву "А". Подскажите, что я упускаю
class Alphabet:
def __init__(self, lang):
self.lang = lang
"""Возвращаем язык"""
def which_lang(self):
return self.lang
"""Английские буквы"""
def eng_letters(self):
list = ' '
for i in range(ord('A'),ord('Z')+1):
list+=chr(i)
return list
a = Alphabet("eng")
print(a.eng_letters())
Ответы (2 шт):
В принципе вам дали пояснение по подводу вашей ошибки. Сдвинуть return list влево. Ваш код заходит в for, делает одну итерацию, по окончанию, которой вы вызываете return.
Я бы хотел еще обратить внимание на то, что результат вы конкатенируете строку. Строка - не изменяемый тип данных, поэтому при данном использовании вы каждый раз создаете новый объект. Это значит, что построение последовательности будет занимать квадратичную стоимость по времени выполнения в общей длине последовательности.
Есть несколько способов избежать этого и один из - это собрать результат в список, а затем использовать метод join().
def eng_letters(self):
list_ = []
for i in range(ord('A'),ord('Z')+1):
list_.append(chr(i))
return ''.join(list_)
Более подробную информацию можно найти в документации, подраздел Notes -> 6 пункт (англ.)
Если вы хотите использовать зарезервированное слово, как свою переменную, то хорошим тоном будет добавить нижнее подчеркивание после имени переменной list_, dict_, str_ и так далее.
В комментариях возникли сомнения по поводу выводов из документации, относительно времени исполнения, указанные мной в ответе. Прикладываю код для тестирования, чтобы можно было проверить, и результаты на моей машине. Последовательность увеличина до 10000 знаков, и сделаны по 1000 тестов на каждую функцию
code1 = """
def eng_letters():
list_ = []
for i in range(10000):
list_.append(chr(i))
return ''.join(list_)
eng_letters()
"""
import timeit
print(timeit.timeit(code1, number=1000)/1000)
code2 = """
def eng_letters1():
list_ = ""
for i in range(10000):
list_ += (chr(i))
return list_
eng_letters1()
"""
print(timeit.timeit(code2, number=1000)/1000)
Результаты
0.0015904509999999999
0.0022290120000000003
0.0014631717
0.0024775018000000003
0.0014995999999999998
0.002166277
0.001480243
0.00212604
Результат с оригинальными последовательностями
3.012499999999998e-06 # list
3.1453000000000036e-06 # string
2.8779999999999985e-06 # list
2.9080000000000008e-06 # string
2.581899999999998e-06 # list
3.1011000000000024e-06 # string
Значения очень малы, но даже здесь подтвержден тезис из документации.
А если отказаться от for и использовать list comprehension, результаты в скорости выполнения будут еще более хороши
def eng_letters2():
list_ = [chr(i) for i in range(ord('A'),ord('Z')+1)]
return ''.join(list_)
Результат времени c оригинальной последовательностью, будет отличаться в лучшую сторону
2.4053000000003876e-06
А с 10000 знаков, как в тестовом скрипте, результат
code3 = """
def eng_letters2():
list_ = [chr(i) for i in range(10000)]
return ''.join(list_)
eng_letters2()
"""
print(timeit.timeit(code3, number=1000)/1000)
# OUT
# 0.001160491
class Alphabet:
def __init__(self, lang):
self.lang = lang
# Возвращаем язык
def which_lang(self):
return self.lang
# Английские буквы
def eng_letters(self):
list_ = ''
for i in range(ord('A'), ord('Z') + 1):
list_ += chr(i)
return list_
a = Alphabet('eng')
print(a.eng_letters())
Во-первых, старайтесь всегда писать код по правилам PEP-8.
Во-вторых, нельзя называть переменные ключевыми словами, ставьте подчеркивание, например list_.
В-третьих, return нужно сместить на один TAB влево.