Вернуть все буквы алфавита?

Не получается вернуть все буквы алфавита с помощью метода 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 шт):

Автор решения: Dmitry

В принципе вам дали пояснение по подводу вашей ошибки. Сдвинуть 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 влево.

→ Ссылка