【问题标题】:Python3 generate strings in for-loop, class variables not being redefined for each iterationPython3在for循环中生成字符串,每次迭代都不会重新定义类变量
【发布时间】:2019-04-07 17:23:57
【问题描述】:

我正在尝试从员工列表(每个员工在他们自己的嵌入式列表中)生成电子邮件列表。这是通过首先选择电子邮件的格式,然后对每个员工的姓名使用 for 循环来完成的。下面是代码。我的问题是,如果我给 self.first 和 self.last 空字符串,以便它们可以在下面的格式选择中调用,它们不会在 for 循环中重新分配实际的名字和姓氏,而是打印电子邮件带着他们的空弦。我看到获取名字和姓氏的方法有效,但由于某种原因,email = self.email_format 在以下输出(或类似输出)下无法正常工作:

['@gmail.com', '@gmail.com', '_@gmail.com']

如何解决此问题或重新排列数据?

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) first.last@domain.com
                2) last.f@domain.com
                3) f.last@domain.com
                4) last_first@domain.com
                5) firstl@domain.com
                6) flast@domain.com
                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]标签

标签: python python-3.x list for-loop


【解决方案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) first.last@domain.com
    2) last.f@domain.com
    3) f.last@domain.com
    4) last_first@domain.com
    5) firstl@domain.com
    6) flast@domain.com
    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
['Foo.Bar@gmail.com', 'Matthew.Gorand@gmail.com', 'Julia.Snyder@gmail.com']
# 2
['Bar.F@gmail.com', 'Gorand.M@gmail.com', 'Snyder.J@gmail.com']
# 3
['F.Bar@gmail.com', 'M.Gorand@gmail.com', 'J.Snyder@gmail.com']
# 4
['Bar_Foo@gmail.com', 'Gorand_Matthew@gmail.com', 'Snyder_Julia@gmail.com']
# 5
['Foo.B@gmail.com', 'Matthew.G@gmail.com', 'Julia.S@gmail.com']
# 6
['FBar@gmail.com', 'MGorand@gmail.com', 'JSnyder@gmail.com']

不需要self.firstself.last - 简单的函数作用域参数就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2016-01-09
    • 2012-12-02
    • 1970-01-01
    • 1970-01-01
    • 2017-02-09
    • 2014-12-01
    相关资源
    最近更新 更多