• 第034讲:丰富的else语句及简洁的with语句 | 课后测试题及答案


    测试题:

    0. 在 Python 中,else 语句能跟哪些语句进行搭配?

    AG:可以跟if,elif搭配

    答:在 Python 中,else 语句不仅能跟 if 语句搭,构成“要么怎样,要么不怎样”的语境;Ta 还能跟循环语句(for 语句或者 while 语句),构成“干完了能怎样,干不完就别想怎样”的语境;其实 else 语句还能够跟我们刚刚讲的异常处理进行搭配,构成“没有问题,那就干吧”的语境。

    1. 请问以下例子中,循环中的 break 语句会跳过 else 语句吗?

    def showMaxFactor(num):
        count = num // 2
        while count > 1:
            if num % count == 0:
                print('%d最大的约数是%d' % (num, count))
                break
            count -= 1
        else:
            print('%d是素数!' % num)
    
    num = int(input('请输入一个数:'))
    showMaxFactor(num)

    AG:不会跳过,因为else语句是循环外的,break只会结束当前循环且是一层循环吧

    答:会,因为如果将 else 语句与循环语句(while 和 for 语句)进行搭配,那么只有在循环正常执行完成后才会执行 else 语句块的内容

    2. 请目测以下代码会打印什么内容?

    try:
            print('ABC')
    except:
            print('DEF')
    else:
            print('GHI')
    finally:
            print('JKL')

    AG:

    ABC

    GHI

    JKL

    答:只有 except 语句中的内容不被打印,因为 try 语句块中并没有异常,则 else 语句块也会被执行。

    3. 使用什么语句可以使你不比再担心文件打开后却忘了关闭的尴尬?

    AG:

    finally:
      if f in locals():   f.close()

    答:使用 with 语句。

    try:
        with open('data.txt', 'w') as f:
            for each_line in f:
                print(each_line)
    except OSError as reason:
        print('出错啦:' + str(reason))

    Python中with的用法(来自夏晓旭

    Python语法学习记录(1):关于WITH用法总结(CSDN呆呆象呆呆

    适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。

    4. 使用 with 语句固然方便,但如果出现异常的话,文件还会自动正常关闭吗?

    答:with 语句会自动处理文件的打开和关闭,如果中途出现异常,会执行清理代码,然后确保文件自动关闭。

    5. 你可以换一种形式写出下边的伪代码吗?

    with A() as a:
        with B() as b:
            suite

    答:with 语句处理多个项目的时候,可以用逗号隔开写成一条语句

    with A() as a, B() as b:
        suite

    动动手:

    0. 使用 with 语句改写以下代码,让 Python 去关心文件的打开与关闭吧。

    def file_compare(file1, file2):
        f1 = open(file1)
        f2 = open(file2)
        count = 0 # 统计行数
        differ = [] # 统计不一样的数量
    
        for line1 in f1:
            line2 = f2.readline()
            count += 1
            if line1 != line2:
                differ.append(count)
    
        f1.close()
        f2.close()
        return differ
    
    file1 = input('请输入需要比较的头一个文件名:')
    file2 = input('请输入需要比较的另一个文件名:')
    
    differ = file_compare(file1, file2)
    
    if len(differ) == 0:
        print('两个文件完全一样!')
    else:
        print('两个文件共有【%d】处不同:' % len(differ))
        for each in differ:
            print('第 %d 行不一样' % each)

    答:使用 with 语句处理文件可以减少需要编写的代码量和粗心的错误。(记得with语句后要缩进!!!!!缩进!缩进!)

    def file_compare(file1, file2):
        with open(file1) as f1, open(file2) as f2:
            count = 0 # 统计行数
            differ = [] # 统计不一样的数量
    
            for line1 in f1:
                line2 = f2.readline()
                count += 1
                if line1 != line2:
                    differ.append(count)
    
        return differ
    
    file1 = input('请输入需要比较的头一个文件名:')
    file2 = input('请输入需要比较的另一个文件名:')
    
    differ = file_compare(file1, file2)
    
    if len(differ) == 0:
        print('两个文件完全一样!')
    else:
        print('两个文件共有【%d】处不同:' % len(differ))
        for each in differ:
            print('第 %d 行不一样' % each)

    1. 你可以利用异常的原理,修改下面的代码使得更高效率的实现吗?

    print('|--- 欢迎进入通讯录程序 ---|')
    print('|--- 1:查询联系人资料  ---|')
    print('|--- 2:插入新的联系人  ---|')
    print('|--- 3:删除已有联系人  ---|')
    print('|--- 4:退出通讯录程序  ---|')
    
    contacts = dict()
    
    while 1:
        instr = int(input('
    请输入相关的指令代码:'))
        
        if instr == 1:
            name = input('请输入联系人姓名:')
            if name in contacts:
                print(name + ' : ' + contacts[name])
            else:
                print('您输入的姓名不再通讯录中!')
    
        if instr == 2:
            name = input('请输入联系人姓名:')
            if name in contacts:
                print('您输入的姓名在通讯录中已存在 -->> ', end='')
                print(name + ' : ' + contacts[name])
                if input('是否修改用户资料(YES/NO):') == 'YES':
                    contacts[name] = input('请输入用户联系电话:')
            else:
                contacts[name] = input('请输入用户联系电话:')
    
        if instr == 3:
            name = input('请输入联系人姓名:')
            if name in contacts:
                del(contacts[name])         # 也可以使用dict.pop()
            else:
                print('您输入的联系人不存在。')
                
        if instr == 4:
            break
    
    print('|--- 感谢使用通讯录程序 ---|')

    答:使用条件语句的代码非常直观明了,但是效率不高。因为程序会两次访问字典的键,一次判断是否存在(例如 if name in contacts),一次获得值(例如 print(name + ' : ' + contacts[name]))。

    如果利用异常解决方案,我们可以简单避开每次需要使用 in 判断是否键存在字典中的操作。因为只要当键不存在字典中时,会触发 KeyError 异常,利用此特性我们可以修改代码如下:

    print('|--- 欢迎进入通讯录程序 ---|')
    print('|--- 1:查询联系人资料  ---|')
    print('|--- 2:插入新的联系人  ---|')
    print('|--- 3:删除已有联系人  ---|')
    print('|--- 4:退出通讯录程序  ---|')
    
    contacts = dict()
    
    while 1:
        instr = int(input('
    请输入相关的指令代码:'))
        
        if instr == 1:
            name = input('请输入联系人姓名:')
            try:
                print(name + ' : ' + contacts[name])
            except KeyError:
                print('您输入的姓名不再通讯录中!')
    
        if instr == 2:
            name = input('请输入联系人姓名:')
            try:
                contacts[name] # 有点“为赋新词强说愁”的感觉
                print('您输入的姓名在通讯录中已存在 -->> ', end='')
                print(name + ' : ' + contacts[name])
                if input('是否修改用户资料(YES/NO):') == 'YES':
                    contacts[name] = input('请输入用户联系电话:')
            except KeyError:
                contacts[name] = input('请输入用户联系电话:')
    
        if instr == 3:
            name = input('请输入联系人姓名:')
            try:
                del(contacts[name]) # 也可以使用dict.pop()
            except KeyError:
                print('您输入的联系人不存在。')
                
        if instr == 4:
            break
    
    print('|--- 感谢使用通讯录程序 ---|')

    作者:Agiroy_70

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。

    博主的文章主要是记录一些学习笔记、作业等。文章来源也已表明,由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。

    博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的文章,请原谅博主成为一个无耻的文档搬运工!

  • 相关阅读:
    Ubuntu18.04下搭建LNMP教程-超详细图文(Nginx+MySQL+PHP含各种解决报错问题)
    win10下Ubuntu18.04安装的简单教程
    Bugku-CTF加密篇之富强民主
    PHP中PHP $_POST和PHP $_REQUEST及PHP $_GET的用法及区别
    Base系列编码浅析【base16 base32 base64 base85 base36 base 58 base91 base 92 base62】
    Bugku-CTF加密篇之贝斯家族(@iH<,{bdR2H;i6*Tm,Wx2izpx2!)
    Bugku-CTF加密篇之这不是md5(666c61677b616537333538376261353662616566357d)
    Bugku-CTF加密篇之告诉你个秘密(ISCCCTF)
    攻防世界—pwn—guess_num
    攻防世界—pwn—level2
  • 原文地址:https://www.cnblogs.com/hale547/p/13299598.html
Copyright © 2020-2023  润新知