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()調用

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