zoukankan      html  css  js  c++  java
  • 零基础入门学习Python(34)--丰富的else语句及简洁的with语句

    知识点

    else语句的用法:

    • 1)配合if语句
    if a>b:
        print(a)
    else:
        print(b)
    • 2)配合while和for循环

      只在循环完成后才执行,如果循环中执行使用到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) 
    • 3)与异常处理语句搭配

    如果没有出错,则打印出‘没有任何错误!’

    try:  
        print(int('abc'))  
    except ValueError as reason:  
        print('出错啦:' + reason)  
    else:  
        print('没有任何异常!')  

    with语句

    可以参考浅谈 Python 的 with 语句文章

    • with 语句的语法格式如下:
    with context_expression [as target(s)]:
        with-body

    这里 context_expression要返回一个上下文管理器对象,该对象并不赋值给as 子句中的 target(s) ,如果指定了 as 子句的话,会将上下文管理器的 __enter__()方法的返回值赋值给 target(s)。target(s) 可以是单个变量,或者由()括起来的元组(不能是仅仅由“,”分隔的变量列表,必须加“()”)。

    Python 对一些内建对象进行改进,加入了对上下文管理器的支持,可以用于 with 语句中,比如可以自动关闭文件、线程锁的自动获取和释放等。假设要对一个文件进行操作,使用 with 语句可以有如下代码:

    #*********************************************#  
    #        异常处理配合with语句                   #  
    #            可以避免已打开文件没关闭的情况      #  
    #*********************************************#  
    try:  
        with open('data.txt','w') as f:  
            for each_line in f:  
                print(each_line)  
    except OSError as reason:  
        print('出错啦:' + str(reason))  

    这里使用了 with 语句,不管在处理文件过程中是否发生异常,都能保证 with 语句执行完毕后已经关闭了打开的文件句柄。
    如果使用传统的try/finally 范式,则要使用类似如下代码:

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

    课后习题

    测试题:

    • 使用with语句固然方便,但如果出现异常的话,文件还会自动正常关闭吗?
    
    with语句会自动处理文件的打开和关闭,如果中途出现异常,会执行清理代码,然后确保文件自动关闭。
    
    
    • 你可以换一种形式写出下边的伪代码吗?
    with A() as a:
        with B() as b:
            suite
    

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

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

    动动手:

    • 使用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语句处理文件可以减少需要编写的代码量和粗心的错误

    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)
    
    • 你可以利用异常的原理,修改下面的代码使得更高效率的实现吗?
    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判断是否key存在字典中的操作。

    因为只要当key不存在字典中时,会触发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('|--- 感谢使用通讯录程序 ---|')
  • 相关阅读:
    归档模式与非归档模式之间的转换
    Cognos 常见错误解决办法
    Informatica 错误信息解决办法汇总
    转摘:解决动态列固定行月季年组合式报表
    数据库名、实例名、全局数据库名、服务名的区别
    转摘:维度与指标混合嵌入(合计)设计
    WinForm使用XML动态加载多语言
    windows中最重要的三个动态链接库及功能
    什么是.Net的异步机制(Invoke,BeginInvoke,EndInvoke) step 2
    深入理解.net服务器控件
  • 原文地址:https://www.cnblogs.com/wanbin/p/9514674.html
Copyright © 2011-2022 走看看