Python3 генерирует строки в цикле for, переменные класса не переопределяются для каждой итерации

Я пытаюсь создать список электронных писем из списка сотрудников (каждый сотрудник в собственном встроенном списке). Это делается путем выбора формата электронного письма, а затем использования цикла for для имени каждого сотрудника. Ниже приведен код. Моя проблема в том, что если я даю пустые строки self.first и self.last, чтобы их можно было вызывать в выборе формата ниже, им не переназначаются фактические имена и фамилии в цикле for, а скорее печатаются электронные письма со своими пустыми строками. Я вижу, что метод получения имени и фамилии работает, но по какой-то причине email = self.email_format не работает должным образом с выводом (или аналогичным выводом):

['@gmail.com', '@gmail.com', '[email protected]']

Как я могу исправить это или изменить порядок данных?

class email_generator():

    def __init__(self):
        self.domain = 'gmail'
        self.generated_emails = []
        self.employees = [['Foo Bar', 'job title'], ['Matthew Gorand', 'job title'], ['Julia Snyder', 'job title']]

    def format_choice(self):
        self.last = ''
        self.first = ''
        choice = input('''
                Choose a format for generating emails:

                1) [email protected]
                2) [email protected]
                3) [email protected]
                4) [email protected]
                5) [email protected]
                6) [email protected]
                7) Pass
                ''')

        if choice == '1':
            self.email_format = f'{self.first}.{self.last}@{self.domain}.com'
        elif choice == '2':
            self.email_format = f'{self.last}.{self.first}@{self.domain}.com'
        elif choice == '3':
            self.email_format = f'{self.first[:1]}.{self.last}@{self.domain}.com'
        elif choice == '4':
            self.email_format = f'{self.last}_{self.first}@{self.domain}.com'
        elif choice == '5':
            self.email_format = f'{self.first}.{self.last[:1]}@{self.domain}.com'
        elif choice == '6':
            self.email_format = f'{self.first[:1]}{self.last}@{self.domain}.com'
        elif choice == '7':
            pass
        else:
            print('Invalid Input')
            self.format_choice()

        for employee in self.employees:
            split = employee[0].split(' ')
            self.first = split[0]
            self.last = split[1]
            email = self.email_format
            self.generated_emails.append(email)

        print(self.generated_emails)

test = email_generator()
test.format_choice()

пожалуйста, используйте общий тег [python] для вопросов все python

juanpa.arrivillaga 07.04.2019 20:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя использование f-strings приятно, они сразу интерполируются и не помогают вам из-за вашей структуры кода. str.format() однако:

class email_generator(): 
    def __init__(self):
        self.domain = 'gmail'
        self.generated_emails = []
        self.employees = [['Foo Bar', 'job title'], ['Matthew Gorand', 'job title'], 
                          ['Julia Snyder', 'job title']]

Выберите, какой формат использовать, теперь обрабатывается в отдельной функции:

    def get_format(self):
        """Loops until a valid choice was made, returns a format string using f,l and d
        as variable names for first,last and domain."""
        while True:
            choice = input('''
    Choose a format for generating emails:

    1) [email protected]
    2) [email protected]
    3) [email protected]
    4) [email protected]
    5) [email protected]
    6) [email protected]
    7) Pass
    ''')

            if choice == '1':
                return '{f}.{l}@{d}.com' 
            elif choice == '2':
                return '{l}.{f[0]}@{d}.com' 
            elif choice == '3':
                return '{f[0]}.{l}@{d}.com' 
            elif choice == '4':
                return '{l}_{f}@{d}.com' 
            elif choice == '5':
                return '{f}.{l[0]}@{d}.com' 
            elif choice == '6':
                return '{f[0]}{l}@{d}.com'
            elif choice == '7':
                return None

        print("Invalid.")

Сам форматер - сокращен, потому что средство выбора строки формата было преобразовано в собственную функцию:

    def format_choice(self):
        email_format = self.get_format()
        if not email_format:
            return

        for employee in self.employees:
            split = employee[0].split(' ')
            fir = split[0]
            las = split[1]
            dom = self.domain
            # the str.format can use positional or named formatting - I use named
            # this must correlate with the names inside the format string:
            #                   '{f[0]}.{l}@{d}.com'     --> f=fir, l=las, d=dom 
            self.generated_emails.append(email_format.format(f=fir, l=las, d=dom))

        print(self.generated_emails)

test = email_generator() 
test.format_choice() # 6 times for all different formats to get all outputs

Выход:

# 1
['[email protected]', '[email protected]', '[email protected]']
# 2
['[email protected]', '[email protected]', '[email protected]']
# 3
['[email protected]', '[email protected]', '[email protected]']
# 4
['[email protected]', '[email protected]', '[email protected]']
# 5
['[email protected]', '[email protected]', '[email protected]']
# 6
['[email protected]', '[email protected]', '[email protected]']

Нет необходимости в self.first или self.last — достаточно простых параметров области действия.

Другие вопросы по теме