1

Тема: Покращення функції-генератора

Доброго дня.

Є функція-генератор слів заданої довжини, простенький brute force, по суті.

def generate(alphabet, max_len):

    if max_len <= 0:
        return
    for c in alphabet:
        yield c
    for c in alphabet:
        for next_character in generate(alphabet, max_len-1):
            yield c + next_character

Усе чудово працює. Мені просто цікаво, чи можна якось покращити
код цієї функції з точки зору Python?

2

Re: Покращення функції-генератора

def generate(alphabet, max_len): 
    if max_len <= 0: 
        yield '' 
    else: 
        for c in alphabet: 
            for next_character in generate(alphabet, max_len-1): 
                yield c + next_character 

for combination in generate('ABCD', 2): 
    print(combination)
Подякували: Teg Miles, Betterthanyou2

3

Re: Покращення функції-генератора

ось такий варіант може бути

import itertools

def generate(alphabet, max_len):
    return [''.join(combination)
            for length
            in range(1, max_len+1)
            for combination
            in itertools.product(
                alphabet, repeat=length)]

print(generate('ABCD', 3))

дана функція теж має таку ж складність як і функція в першому повідомленні, але вона є більш ефективную, оскільки функція itertools.product є ефективнішою за рекурсивну генерацію комбінацій.

Подякували: Teg Miles1

4

Re: Покращення функції-генератора

Vitaliy_Danmer написав:

Є функція-генератор слів заданої довжини, простенький brute force, по суті.

Слова людської мови мають певні залежності в своїй будові. Почитайте про ланцюги Маркова. У вас генератор комбінацій з заданих літер, а не слів.

5

Re: Покращення функції-генератора

Tarpan87 написав:
Vitaliy_Danmer написав:

Є функція-генератор слів заданої довжини, простенький brute force, по суті.

Слова людської мови мають певні залежності в своїй будові. Почитайте про ланцюги Маркова. У вас генератор комбінацій з заданих літер, а не слів.

Там були потрібні лише комбінації літер, то був простий приклад демонстрації слабкості паролів, що складаються лише з літер.