Python学习笔记:错误、异常、生成器、迭代器

小编 2026-06-27 阅读:232 评论:0
#错误&异常     程序逻辑或者语法问题产生错误,是一个事件     产生错误之后,会进入异常状态,到调用函数的地方寻找解决方法,将程序恢复为正常执行状态     异常的作用:通知上层调用者有错误...

#错误&异常
    程序逻辑或者语法问题产生错误,是一个事件
    产生错误之后,会进入异常状态,到调用函数的地方寻找解决方法,将程序恢复为正常执行状态
    异常的作用:通知上层调用者有错误发生,用作信号通知
#try语句的try-excpetion语法
    try:
        可能触发异常的语句
    except    错误类型1 [as 变量1]:
        异常处理语句
    except    (错误类型2,错误类型3,错误类型4):
        异常处理语句
    ......
    [except:
        异常处理语句other
    else:
        未发生异常时动作
    finally:
        最终语句]
    至少应该保留一个except
    出现异常之后,接下来的代码将不会执行,错误将返回给上层调用者    

#示例
    def fenpingguo():
        str1 = input(\"please input a num\")
        s = int(str1)
        a = 100/s
        print(\"over\")

    try:
        fenpingguo()
    except ValueError:    #出现数值错误,即int()函数内部不是一个int字符串
        print(\"Error\")    
    except ZeroDivisionError:    #出现除0错误    
        print(\"Error2\")
    except (ValueError,ZeroDivisionError) as err:    #出现这两个错误,并且两个错误元组绑定在变量Error上
        print(err)
    except:        #如果发生了其他类型的异常
        print(\"Error occurs\")
    else:
        print(\"No error occuers\")    #未发生异常时执行else下方的语句块
    finally:
        print(\"try have been excuted\")    #finally语句最终一定会被执行
#常用的Error    
    ZeroDivisionError
    ValueError:传入无效参数
    AssertionError:断言语句失败
    StopIteration:迭代器没有更多索引值
    IndexError:序列中没有此索引
    IndentationError:缩进错误
    ImportError:导入错误
    NameError:未命名错误
    IOError:输入输出错误
    AttributeError:对象没有这个属性
    BaseException:基类
    SystemExit:解释器请求退出
    

#try-finally用法
    没有except语句,只有
    try:
        xxx
    finally:
        xxx
    无论是否产生异常,一定会执行finally下的语句;finally语句不会改变程序的执行状态

#raise
    抛出一个错误,让程序进入异常状态
    raise    异常类型
    或者
    raise     异常对象
    比如:
    def make_except():
        print(\"function start\")
        myerror = ValueError(\"This is an ValueError\")
        raise myerror
        print(\"end of function\")

    try:
        make_except()
    except ValueError:
        print(\"Error has been dealt\")

#assert 断言语句
    assert 真值表达式,数据错误(通常是字符串)
    当真值表达式为False时,用错误数据创建一个AssertionError类型的错误,并触发此错误并进入异常状态
    相当于:
    if 真值表达式 == False:
        raise AssertionError(错误数据)    

#迭代器 Iterator
    迭代器,用于对可迭代对象做遍历的工具
    两个相关函数    
    iter(iterable)    可从可迭代对象返回一个迭代器iterator
    next(iterator)    从迭代器对象实例中获取下一个记录,如果没有下一条记录,则抛出StopInteration#
    示例:用迭代器遍历一个list
    for x in range(1,10,3):
        print(x)
    it = iter(range(1,10,3))
    while True:
        try:
            print(next(it))
        except StopIteration:
            break

#生成器 Generator
    生成器能够动态的提供数据对象,生成器对象也是可迭代对象
    它不像列表那种静态可迭代对象,它是动态的
    生成器函数的定义:
    yield 表达式
    yield仅用于def 函数中,该函数称为生成器函数
    该函数被调用时会生成并返回一个可迭代对象,这个对象是一个生成器对象
    之后每次用next访问该生成器函数,都会执行一遍非yield语句,然后返回下一个yield的值
    生成器可以再生成一个迭代器,next(迭代器)时,会寻找生成器对象要数据,生成器会找生成器函数要数据,当生成器函数遇到一个yield时,会返回该值,然后生成器函数卡在这条yield函数之后,待下次取用,直到最后生成StopIteration异常

#练习题:写一个myrange代替range
    def myrange(stop,start = None,step = None):
    if start == None:
        start = 0
    else:
        stop,start = start,stop
    if step == None:
        step = 1
    if step == 0:
        myerror = ValueError(\"argv step cannot be 0\")
        raise myerror
    if step > 0:
        while start < stop:
            yield start
            start += step
    else:
        while start > stop:
            yield start
            start += step

    it = iter(myrange(100,150,1))
    try:
        while True:
            print(next(it))
    except ValueError as err:
        print(\"ValueError:\",err)
    except StopIteration as err:
        print(\"StopIteration Error\")
    print(\"Program exit!\")

#生成器函数得到的数据现用现生成,不会占用大量内存空间!!!这是一个非常优越的优点
#python3中range本身就是这样实现的

#生成器表达式
    gen = (x**2 for x in List1)
    it = iter(gen)
    next(it)

#迭代工具函数
    生成一个个性化的可迭代对象
    zip(iter1,iter2,iter3,...)用多个可迭代对象,生成一个元组,元组中每个元素也是一个元组,玫每个这样的元组即(iter1[x],iter[x],iter3[x]),x是一个确定的数,x最大是min(len(iter1),len(iter2)......)
    枚举函数enumerate(iterable)
    names = [1,2,3]
    for x in enumerate(names):
        print(x)

#练习题:输入多个字符串,打印输入的行号和字符串
    l = list()
    while True:
        str1 = input(\"please input a string\")
        if str1 == \'\':
            break
        l.append(str1)

    for x in zip(range(1,len(l)+1),l):
        print(\"%d:%s\"%(x[0],x[1]))
    
#练习题:用生成器函数计算斐波那契数列前n项
    def fn(n):
    cnt = 0
    a = 1
    b = 1
    yield 1
    cnt += 1
    if cnt > n:
        return 
    yield 1
    cnt += 1
    if cnt > n:
        return 
    while True:
        a,b = b,a+b
        yield b
        cnt += 1
        if cnt > n:
            return

    for x in fn(20):
        print(x)


 

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表