请问一下如何改进以下代码?

做这个练习时发现代码存在问题,例如第一轮的AN和SN分别输入a和b,进入第二轮循环时AN输入'q',输出结果却变成了{‘An’: q, 'Sn': b},而不是{‘An’: a, 'Sn': b}


def make_album(AN, SN, SNU = None):
    """描述一个专辑的相关信息"""
    MA = {'An': AN, 'Sn': SN}
    if SNU:
        MA['SNU'] = SNU
    
    return print(MA)
    
while True:
    print("\nEnter 'q' at any time to quit")

    AN = input("Please enter album's name:")
    if AN == 'q':
        break

    SN = input("Please enter singer's name:")
    if SN == 'q':
        break
        
make_album(AN, SN)

因为前一轮AN的值没存入字典,然后AN又被第二轮的'q'覆盖了,所以打印出的结果就变了;

可以把make_album(AN, SN) 这一行,放到while循环里。

修改如下:


 
def make_album(AN, SN, SNU = None):
    """描述一个专辑的相关信息"""
    MA = {'An': AN, 'Sn': SN}
    if SNU:
        MA['SNU'] = SNU
    
    return print(MA)
    
while True:
    print("\nEnter 'q' at any time to quit")
 
    AN = input("Please enter album's name:")
    if AN == 'q':
        break
 
    SN = input("Please enter singer's name:")
    if SN == 'q':
        break
        
    make_album(AN, SN)

img

【以下回答由 GPT 生成】

以下是改进的代码:

def make_album(AN, SN, SNU = None):
    """描述一个专辑的相关信息"""
    MA = {'An': AN, 'Sn': SN}
    if SNU:
        MA['SNU'] = SNU
    return MA

while True:
    print("\nEnter 'q' at any time to quit")
    AN = input("Please enter album's name:")
    if AN == 'q':
        break
    SN = input("Please enter singer's name:")
    if SN == 'q':
        break

MA = make_album(AN, SN)
print(MA)

问题的原因是代码中错误地使用了return print(MA),这导致make_album函数返回None而不是字典。改进的方法是将return语句分开,先返回字典,然后在循环外部打印字典。

代码中还可以改进的地方包括函数名和变量名的命名规范,可以更具体地描述其含义。另外,可以考虑在用户输入时添加异常处理,以防止程序崩溃。以下是进一步改进的代码示例:

def create_album_info(album_name, singer_name, singer_nationality=None):
    """描述一个专辑的相关信息"""
    album_info = {'Album Name': album_name, 'Singer Name': singer_name}
    if singer_nationality:
        album_info['Singer Nationality'] = singer_nationality
    return album_info

while True:
    print("\nEnter 'q' at any time to quit")
    try:
        album_name = input("Please enter album's name:")
        if album_name == 'q':
            break
        singer_name = input("Please enter singer's name:")
        if singer_name == 'q':
            break

        album_info = create_album_info(album_name, singer_name)
        print(album_info)
    except Exception as e:
        print("An error occurred:", e)

请注意,上述改进的代码是根据代码片段提供的信息进行的假设和修改。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^