Python异常、推导特性、迭代器、生成器

一.异常

  1.语法:

        try:

            代码块

        except 异常类型:

             捕获异常后的操作

        else:

            没有异常发生,进入else

        finally:

            无论是否发生异常,finally总是进入

def testException():
    try:
        a=int(input("请输入被除数"))
        b=int(input("请输入除数"))
        c=a/b
    except ZeroDivisionError as Ex:
        print("捕获异常,异常信息是:",Ex) #Ex表示异常信息Message
        print("除数不能为0")
    except ValueError:
        print("输入值必须为数字")
    else:
        print("没有异常发生")
    finally:
        print("最终代码块")

    2.手动抛异常

        语法:raise Exception(message信息,args参数)

def testException():
    a=int(input("请输入被除数"))
    b=int(input("请输入除数"))
    if b==0:
        raise Exception("除数不能为0",b)
    a/b
try:
    testException()
except Exception as E:
    print(E)

二.推导特性

    推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,速度快等优点

#列表推导
numbers=[x for x in range(100) if x%3==0]
print(numbers)

def squared(x):
    return x*x

multiples=[squared(i) for i in range(30) if i%3 is 0]
print(multiples)


#字典推导
dic={'a':10,'b':34}
print(dic.items())

dic2={v:k for k,v in dic.items()}
print(dic2)


#集合推导
#返回的是set,相同值只有一个
squared={x**2 for x in [1,1,2]}
print(squared)

strs=['a','if','file','superman','el']
lens={len(str) for str in strs}
print(lens)

三.迭代器

    迭代器是一个可以记住遍历的位置的对象。

    迭代器有两个基本的方法:__iter__() 和 __next__()。 

    __iter__方法:返回迭代器自身。可以通过python内建函数iter()调用。

    __next__方法:当next方法被调用的时候,迭代器会返回它的下一个值,如果next方法被调用,但迭代器没有只可以返回,就会引发一个StopIteration异常。该方法可以通过 python 内建函数next()调用。 

    迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

    创建一个迭代器有3种方法,其中前两种分别是:
 1.为容器对象添加 __iter__() 和 __next__() 方法
     
 2. 内置函数 iter() 将可迭代对象转化为迭代器

 3.就是生成器(generator)。生成器通过 yield 语句快速生成迭代器,省略了复杂的 __iter__() & __next__() 方式

 迭代器使用细则:

迭代器不能回退
迭代器非线程安全
迭代器用一个对象,读取一个。节省空间
迭代器没有索引 可以用enumrate(iterable) 获取元素和索引的元组

ps:迭代器中,第二次循环不会取到值,因为第一次会把所有值取完

四.生成器

    第一种方式:将列表的[]改为(),里面可以写推导

     生成器只要调用next()方法即可得到下一个值,到最后一个后异常(StopIteration)退出

    用表达式做生成器

    例:

    test=(x for x in rang(10))

    next(test)或test.__next__()

    第二种方式:

    在方法内使用yield做生成器,这样调用此方法时,会得出一个结果:generator object...

    然后也是可以调用next(),每到yield时,就会停止,返回当前这个值,可以一次一次next()调用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章