1. 程式人生 > >python學習筆記:集合set,函式基礎

python學習筆記:集合set,函式基礎

1、遍歷字典
    for k,v in d:
    則k,v分別是字典中鍵值對的鍵和值
2、字典的推導式
    比如d = {x:x**2 for x in range(10)}
    # d = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
3、例題:生成{'A1':'A_1','A2':'A_2',’A3':'A_3','B1':'B_1',...}字典,直到C3結束
    程式碼:d = {chr(a) + chr(b) : chr(a) + '_' + chr(b) for a in range(ord('A'),ord('C')+1) for b in range(ord('1'),ord('3')+1)}

4、字典vs列表
    都是可變物件
    索引方式不同,列表用於整數索引,字典用任意型別不可變物件做索引
    字典的查詢速度要快於列表
    列表的儲存是有序的,字典的儲存是無序的
5、集合set
    集合是可變物件
    集合內的資料物件都是唯一的,不能有重複
    集合是無序的儲存結構,集合中的數值沒有先後關係
    集合內的元素必須是不可變物件(元組、字串、單個數據)
    集合是可迭代物件
    集合相當於只有鍵沒有值的字典,鍵就是集合的資料
6、建立空集合
    s = set()
    注意:不能使用s = {} 建立集合,那樣建立的物件的字典
7、建立非空集合
    集合內部變數必須都是不可變物件
    s = {1,2,3}
    s = {'a','b','c'}
    s = {1,'A'}
    s = {'a',[1,2,3]} #這樣是錯誤的,列表不能加入集合
    a = 1234 
    s = {a,1,2,3}這裡a的不是引用,而是代表一個實際的數值
8、集合set的建構函式
    s = set()
    s = set(iterable)用可迭代物件生成一個物件
    #s = set("hello") = {'h','e','l','o'}且並不保證其順序,重複的元素算一次 
9、集合的運算
    交集、並集、補集、子集、超集
    &     |     ^     -
    &:生成兩個集合的交集
    |:生成兩個集合的並集
    -:生成兩個集合的補集,s1-s2代表從s1中減去存在於s2中的資料元素
    ^:生成兩個集合的對稱補集,s1^s2代表從s1和s2的並集中減去交集中的元素
    s1 = {1,2,3}
    s2 = {2,3,4}
    s1 & s2 = {2,3}
    s1 | s2 = {1,2,3,4}
    s1 - s2 = {1}
    s1^s2 = {1,4}
10、集合的比較
    > >= < <= == !=
    s1 > s2 True if s1是s2的超集
    s1 < s2 True if s1是s2的子集
    <= 和 >= 比上述多了一個等於,即集合是否相同
    == != 判斷集合是否相等
11、in 和 not in 運算子
    優點:運算速度快於列表和字串

12、集合常用方法
    S.add(e)    向集合中新增元素e
    S.remove(e)    從集合中刪除元素e,若不存在,產生錯誤
    S.discard(e)    刪除元素,不存在不產生錯誤
    S.clear()    清空集合
    S.copy()    淺拷貝一個集合
    S.pop()        從集合中刪除一個隨機元素,返回被刪除的值,若集合為空則產生錯誤
    S.update(S2)    將S2並如S中,更新變數S
    其他常用方法均可用上述算術運算代替

13、集合的推導式
    例子:
    l = {"Jenny","Tony","Animal","Oliga","Jim"}
    s = {x for x in l if len(x)>=4}
    #從list中篩選長度大於4的字串加入集合
    if 語句可以省略
14、固定集合frozenset
    是不可變的,無序的,含有唯一元素的容器
    可以作為字典和集合的鍵
    發現:python中有一個可變的可迭代物件,就會有一個對應的不可變物件,比如
    list -> tuple
    set -> frozenset
    在通訊(傳輸)過程中能夠避免錯誤
    
15、建立固定集合
    frozenset()
    frozenset(iterable)
16、運算子和集合完全一樣
    方法相當於去掉集合的全部方法中修改集合的方法
17、函式
    函式的作用:封裝語句塊,提高程式碼重用性;允許使用者定義使用者級別的函式
18、定義一個函式
    def 函式名(引數列表):
        語句塊(程式碼塊)
    說明:函式的名字就是語句塊的名稱
    函式名的命名規則和變數相同
    函式名是一個變數,不要對其輕易賦值
    函式的引數列表可以為空
    語句部分不能為空,如果為空需要空pass填充
    例子:
    def say_hello():
        print("hello world!")
19、呼叫函式
    函式名(實際傳入引數(實參))
    說明:
    如果函式內部沒有return語句,汗珠執行完畢後返回None物件
    如果函式需要返回其他物件,需要用到return語句
    函式的傳參是引用傳參
20、return語句
    return [表示式]    
    []代表可以省略
    如果沒有return,函式最後自動加上return None,函式呼叫返回一個物件的引用    
21、練習:常用的篩素數函式
    #篩出0-a之間的素數,並返回列表
    def ShaiSushu(a):
    if a < 2:
        return None
    l = list()
    l.append(2)
    for i in range(3,a+1):
        flag = 1
        for j in range(0,len(l)):
            if i % l[j] == 0:
                flag = 0
        if flag == 1:
            l.append(i)
    return l
    執行ShaiSushu(100000)時感覺很慢,測了一下時間,運行了56.26162052154541s!!!!!!(不列印)
    What?
    有點汗顏,寫了份c++程式碼,只用了2.005s(不列印)
    
    是誰在網上分析一大堆,說pypy直譯器一直在優化效能,有些時候效能能夠接近C速度??!
    效能差了30倍!
    看來還是的學好C和C++啊