1. 程式人生 > >Python基礎筆記_Day05_列表、元組、字典、集合、生成器、迭代器

Python基礎筆記_Day05_列表、元組、字典、集合、生成器、迭代器

Day05_列表、元組、字典、集合、生成器、迭代器

 

05.01_Python語言基礎(列表List)(掌握)

05.02_Python語言基礎(建立列表)(掌握)

05.03_Python語言基礎(執行輸出列表)(掌握)

05.04_Python語言基礎(列表常用操作)(掌握)

05.05_Python語言基礎(元組概述)(熟練)

05.06_Python語言基礎(訪問元組)(熟練)

05.07_Python語言基礎(元組常用操作)(掌握)

05.08_Python語言基礎(字典概述)(掌握)

05.09_Python語言基礎(字典常用操作)(掌握)

05.10_Python語言基礎(字典常用函式)(掌握)

05.11_Python語言基礎(字典和列表優缺點比較)(掌握)

05.12_Python語言基礎(集合概述)(掌握)

05.13_Python語言基礎(集合的格式和建立)(掌握)

05.14_Python語言基礎(集合的常用操作)(掌握)

05.15_Python語言基礎(生成器)(熟練)

05.16_Python語言基礎(函式實現生成器)(熟悉)

05.17_Python語言基礎(生成器--yield)(熟悉)

05.18_Python語言基礎(迭代器概述)(掌握)

05.19_Python語言基礎(可迭代物件)(掌握)

05.20_Python語言基礎(迭代器)(掌握)

05.21_Python語言基礎(Iter()函式)(掌握)

05.22_Python語言基礎(迭代器總結)(掌握)

 

## 05.01_Python語言基礎(列表List)(掌握)

>想一想:
    前面學習的字串可以用來儲存一串資訊,那麼想一想,怎樣儲存咱們班所有同學的名字呢?
    定義100個變數,每個變數存放一個學生的姓名可行嗎?有更好的辦法嗎?
>答曰

    列表
* 列表介紹
>
    序列是Python中最基本的資料結構。
    序列中的每個元素都分配一個數字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推。
    列表是常用的Python資料型別,它可以作為一個方括號內的逗號分隔值出現。
    列表可以進行的操作包括索引,切片,加,乘,檢查成員。
    此外,Python已經內建確定列表的長度以及確定最大和最小的元素的方法。
    列表的資料項不需要具有相同的型別

##05.02_Python語言基礎(建立列表)(掌握)
* 列表格式: 列表名 = [列表選項1,列表選項2,....,列表選項n],示例如下:
#    
    # 建立列表
    list1 = [1, 2, 3, 4, 5]
    list2 = ["a", "b", "c", "d"]
    list3 = [True, False]
    list4 = ["a", 1, True, None]
    list5 = []
    # 控制檯執行輸出列表
    print(list1)
    print(list2)
    print(list3)
    print(list4)
    print(list5)
    print(type(list4))
    print(type(list5))
執行輸出結果:
#
    [1, 2, 3, 4, 5]
    ['a', 'b', 'c', 'd']
    [True, False]
    ['a', 1, True, None]
    []
    <class 'list'>
    <class 'list'>
想一想:list6 = [None],print(list6)在控制檯執行輸出的是什麼結果



##05.03_Python語言基礎(執行輸出列表)(掌握)


* A: 可以呼叫print()函式直接列印
#
    # 建立列表
    list1 = [1, 2, 3, 4, 5]
    list2 = ["a", "b", "c", "d"]
    # 執行輸出列表
    print(list1)
    print(list2)
執行輸出結果
#
    [1, 2, 3, 4, 5]
    ['a', 'b', 'c', 'd']


* B: 使用下標執行輸出列表中的每一個元素
#
    # 建立列表
    list1 = ["a", "b", "c", "d"]
    # 執行輸出列表
    print(list1[0])
    print(list1[1])
    print(list1[2])
    print(list1[3])
執行輸出結果:
#
    a
    b
    c
    d


* C: 使用for迴圈執行輸出列表的每個資料
#
    #使用for迴圈
    namesList = ['xiaoWang', 'xiaoZhang', 'xiaoHua']
    for name in namesList:
        print(name)
執行輸出結果:
#
    xiaoWang
    xiaoZhang
    xiaoHua


* D: 使用while迴圈執行輸出列表的每個資料
#
    #使用while迴圈
    namesList = ['xiaoWang', 'xiaoZhang', 'xiaoHua']
    length = len(namesList)
    i = 0
    while i < length:
        print(namesList[i])
        i += 1
執行輸出結果:
#
    xiaoWang
    xiaoZhang
    xiaoHua


* E: 列表重複執行輸出
#
    namesList = ['xiaoWang', 'xiaoZhang', 'xiaoHua']
    print(namesList * 2)
執行輸出結果:
#
    ['xiaoWang', 'xiaoZhang', 'xiaoHua', 'xiaoWang', 'xiaoZhang', 'xiaoHua']



##05.04_Python語言基礎(列表常用操作)(掌握)
### 我們對資料常用的操作一般可以總結為:增、刪、改、查,下面我們來學習關於列表的常用操作


* A: 訪問列表元素
#
    namesList = ['xiaoWang', 'xiaoZhang', 'xiaoHua']
    print(namesList[0])
    print(namesList[1])
    print(namesList[2])
執行輸出結果:
#
    xiaoHua
    xiaoZhang
    xiaoHua
想一想:print(namesList[3])在控制檯執行輸出的結果是什麼


* B: 更改列表元素
#
    namesList = ['xiaoWang', 'xiaoZhang', 'xiaoHua']
    print("更改前的nameList:%s" % namesList)
    namesList[0] = "小王"
    print("更改後的nameList:%s" % namesList)
執行輸出結果:
#
    更改前的nameList:['xiaoWang', 'xiaoZhang', 'xiaoHua']
    更改後的nameList:['小王', 'xiaoZhang', 'xiaoHua']


* C: 增加列表元素--append(object)
    * 通過append可以向列表中新增元素,新增的元素放在最後
#
    # 列表增加元素
    namesList = ['xiaoWang', 'xiaoZhang', 'xiaoHua']
    print("新增元素前的nameList:%s" % namesList)
    namesList.append("xiaoMing")
    print("新增元素後的nameList:%s" % namesList)
執行輸出結果:
#
    新增元素前的nameList:['xiaoWang', 'xiaoZhang', 'xiaoHua']
    新增元素後的nameList:['xiaoWang', 'xiaoZhang', 'xiaoHua', '小明']


* D: 增加列表元素--insert(index,object)
    * 通過insert可以向列表指定位置新增元素
#
    # 列表增加元素--insert(index, object)
    namesList = ['xiaoWang', 'xiaoZhang', 'xiaoHua']
    print("新增元素前的nameList:%s" % namesList)
    namesList.insert(1, "小明")
    print("新增元素後的nameList:%s" % namesList)
執行輸出結果:
#
    新增元素前的nameList:['xiaoWang', 'xiaoZhang', 'xiaoHua']
    新增元素後的nameList:['xiaoWang', '小明', 'xiaoZhang', 'xiaoHua']


* E: 增加列表元素--extend(index,object)
#
    # 列表增加元素--extend(list)
    namesList1 = ['xiaoWang', 'xiaoZhang', 'xiaoHua']
    namesList2 = ['小王', '小張', '小華']
    print("新增元素後的nameList:%s" % namesList1)
    namesList1.extend(namesList2)
    print("新增元素後的nameList:%s" % namesList1)
執行輸出結果:
#
    新增元素後的nameList:['xiaoWang', 'xiaoZhang', 'xiaoHua']
    新增元素後的nameList:['xiaoWang', 'xiaoZhang', 'xiaoHua', '小王', '小張', '小華']


* F: 列表相加

    # 列表相加
    namesList1 = ['xiaoWang', 'xiaoZhang', 'xiaoHua']
    namesList2 = ['小王', '小張', '小華']
    namesList3 = namesList1 + namesList2
    print(namesList3)
執行輸出結果:
#
    ['xiaoWang', 'xiaoZhang', 'xiaoHua', '小王', '小張', '小華']


* G: 查詢元素(in, not in, index, count)
    * in(存在):如果存在返回的結果為True,反之False
     * not in(不存在):如果不存在結果為True,反之False
     * index(str, start, end)    查詢元素第一次出現的下標
     * count(str)    查詢元素個數目
#
    # 查詢列表元素
    namesList1 = ['xiaoWang', 'xiaoZhang', 'xiaoHua']
    # 獲取使用者要查詢的名字
    findName = input("請輸入需要查詢的名字:")
    # 查詢判斷,是否存在
    if findName in namesList1:
        print("找到有這個人...")
    elif findName not in namesList1:
        print("查無此人....")
執行輸出結果:
#
    請輸入需要查詢的名字:aaa
    查無此人....

    請輸入需要查詢的名字:xiaoHua
    找到有這個人...
 index()案例:
#
    # index /count
    a = ["a", "b", "c", "b", "d", "a"]
    print(a.index("b"))
    print(a.index("b", 2, 5))
    print(a.count("a"))
執行輸出結果:
#
    1
    3
    2
想一想:print(a.index("e"))和print(a.count("e"))執行輸出什麼結果


* G: 刪除元素(del/pop/remove)
    * del list[index] 刪除指定位置的元素
    * pop(index)  刪除一個元素,把刪除的這個元素返回,index不寫時預設是最後一個
    * remove(onject)
    
del案例:
#
    # 刪除元素(del list[index])
    word = ["a", "b", "c", "b", "d", "a"]
    print("刪除元素前的word:%s" % word)
    del word[1]
    print("刪除元素後的word:%s" % word)
執行輸出結果:
#
    刪除元素前的word:['a', 'b', 'c', 'b', 'd', 'a']
    刪除元素後的word:['a', 'c', 'b', 'd', 'a']

pop()案例:
#
    # 刪除元素(pop(index))
    word = ["a", "b", "c", "b", "d", "e"]
    print("刪除指定位置元素", word.pop(1))
    print("刪除預設位置元素", word.pop())
執行輸出結果:
#
    刪除指定位置元素 b
    刪除預設位置元素 e

remove()案例:
#
    # 刪除元素(remove(object))
    word = ["a", "b", "c", "b", "d", "e"]
    print("刪除元素前的word:%s" % word)
    word.remove("a")
    print("刪除元素後的word:%s" % word)
    word.remove("a")


* H:列表排序sort()
    * sort將列表按照特定的順序重新的排列,預設由小到大
#
    # 列表排序sort(reverse=False)
    word = ["a", "b", "c", "b", "d", "e"]
    print("排序前的word:%s" % word)
    word.sort(reverse=False)
    print("順序排序後的word:%s" % word)
    word.sort(reverse=True)

    print("逆序排序後的word:%s" % word)
執行輸出結果:
#
    排序前的word:['a', 'b', 'c', 'b', 'd', 'e']
    順序排序後的word:['a', 'b', 'b', 'c', 'd', 'e']
    逆序排序後的word:['e', 'd', 'c', 'b', 'b', 'a']

* I:列表的巢狀
    * 類似while、for迴圈的巢狀,列表也支援巢狀
    * 一個列表中的列表作為一個元素
    * 格式:列表名 = [ [ ], [ ], [ ] ]
    * 例如:schoolNames = [["清華大學","北京大學"],["哈爾濱佛學院"],[]]
    * 練習: 一個學校,有3個辦公室,現在有8個老師等待分配工位,請編寫程式,完成隨機分配
#
    # 列表巢狀
    namesList = [["趙毅", "錢爾", "孫三"], ["里斯", "周武"], ["吳柳", "鄭琦"]]
    for cls in namesList:
        for name in cls:
            print(name, end=",")
        print()
執行輸出結果:
#
    趙毅,錢爾,孫三,
    里斯,周武,
    吳柳,鄭琦,


* J:獲取列表中的最大/最小值
    * max(list)
    * min(list)
#
    # 獲取最大值
    word = ["a", "b", "c", "b", "d", "e"]
    print(max(word))
    print(min(word))
執行輸出結果:
#
    e
    a



## 05.05_Python語言基礎(元組概述)(熟練)
* 元組概述
    * python的元組和列表類似,不同之處在於元組的元素不能修改,
* 元組格式:
    * 元組名 = (元組元素1,元組元素2.....元組元素n)
* 建立元組
#
    tuple1 = ()
    tuple2 = (1, 2, 3)
    tuple3 = (1, 2, 3, "hello", True)
    
    print(tuple1)
    print(tuple2)
    print(tuple3)
    
    print(type(tuple1))
    print(type(tuple2))
    print(type(tuple3))
執行輸出結果:
#
    (1, 2, 3)
    (1, 2, 3, 'hello', True)
    <class 'tuple'>
    <class 'tuple'>
>做一做:tuple0 = (1),print(type(tuple0))執行輸出結果是什麼



## 05.06_Python語言基礎(訪問元組)(熟練)
* 訪問元組內容
    * 通過下標訪問,格式:元組名[下標],下標從0開始
#
    # 訪問元組元素
    tuple4 = (1, 2, 3, "hello", True)
    print(tuple4[2])
    print(tuple4[3])
執行輸出結果:
#
    3
    hello
>試一試:print(tuole4[-2])執行輸出結果是什麼


#### 遍歷元組
    # 遍歷元組
    tuple5 = (1, 2, 3, "hello", True)
    for t in tuple5:
        print(t)
執行輸出結果:
#    
    1
    2
    3
    hello
    True
>做一做:使用while迴圈遍歷元組


* 重複執行輸出元組
#
    tuple1 = (1,2,3)
    print(tuple1 * 3)
執行輸出結果:
#
    (1, 2, 3, 1, 2, 3, 1, 2, 3)


## 05.07_Python語言基礎(元組常用操作)(掌握)
     
#
    # 修改元組
    tuple6 = (1, 2, 3, "hello", True)
    tuple6[1] = 100
    print(tuple6)
執行輸出結果:
#
    Traceback (most recent call last):
      File "Day06/Tuple_Demo01.py", line 26, in <module>
        tuple6[1] = 100
    TypeError: 'tuple' object does not support item assignment
>元組內一旦建立,不可更改

    tuple5 = (1, 2, 3, 4, True, [5, 6, 7])
    # tuple5[0] = 100        #報錯,元組不能修改
    # tuple5[-1] = [7,8,9]    #報錯,
    tuple5[5][0] = 500
    print(tuple5)
執行輸出結果
#    
    (1, 2, 3, 4, True, [500, 6, 7])
>元組被改變了,這個是什麼情況呢?


* 刪除元組
    * del可以刪除元組,但是後果很嚴重。。。
#
    tuple6 = (1, 2, 3)
    del tuple6
    print(tuple6)
執行輸出結果:
#
    Traceback (most recent call last):
      File "/Day06/Tuple_Demo01.py", line 61, in <module>
        print(tuple6)
    NameError: name 'tuple6' is not defined
>元組被刪除的很徹底,直接從記憶體中抹去了

    * 試一試:del tuple6[1]執行輸出什麼結果


* 元組相加
#
    # 元組相加
    tuple1 = (1, 2, 3)
    tuple2 = (4, 5, 6)
    tuple3 = tuple1 + tuple2
    print(tuple3)
    print(type(tuple3))
    print(tuple1)
    print(tuple2)
執行輸出結果:
#
    (1, 2, 3, 4, 5, 6)
    <class 'tuple'>
    (1, 2, 3)
    (4, 5, 6)


* 判斷元組是否存在XX元素
    * 使用in,not in可以判斷某個元素是否在目標元組
#
    # in, not in
    tuple4 = (1, 2, 3)
    print(3 in tuple4)
    print(3 not in tuple4)
    print(tuple_demo009.index("c"))
    print(tuple_demo009.count("c"))
執行輸出結果:
#
    True
    False
>對比一下列表的in,not in


* 擷取元組內容
    * 格式: 元組名[開始 : 結束 :步長](含頭不含尾)
    * 案例:
#
    # 擷取元組內容
    tuple6 = (1, 2, 3, 4, 5, 6, 7, 8)
    print(tuple6[:])
    print(tuple6[3:7])
    print(tuple6[3:])
    print(tuple6[:7])
    print(tuple6[:-1])
    print(tuple6[-1::-1])
執行輸出結果:
#
    (1, 2, 3, 4, 5, 6, 7, 8)
    (4, 5, 6, 7)
    (4, 5, 6, 7, 8)
    (1, 2, 3, 4, 5, 6, 7)
    (1, 2, 3, 4, 5, 6, 7)
    (8, 7, 6, 5, 4, 3, 2, 1)


* 元組巢狀
     * 元組的巢狀(二維元組),元素是一維元組
    * 格式:元組名 = ((),(),().....)
    * 案例:
#
    # 元組巢狀
    tuple7 = ((1, 2, 3), (4, 5, 6), (True, False))
    print(tuple7[1][1])
    for tuple0 in tuple7:
        for num in tuple0:
            print(num, end=",")
        print()
執行輸出結果:
#    
    5
    1,2,3,
    4,5,6,
    True,False,


## 05.08_Python語言基礎(字典概述)(掌握)
* 字典概述
#
想一想:

    如果有列表如下:
         nameList = ['xiaoZhang', 'xiaoWang', 'xiaoLi'];

    需要對"xiaoWang"這個名字寫錯了,通過程式碼修改:
         nameList[1] = 'xiaoxiaoWang'

    如果列表的順序發生了變化,如下
         nameList = ['xiaoWang', 'xiaoZhang',  'xiaoLi'];

    此時就需要修改下標,才能完成名字的修改
         nameList[0] = 'xiaoxiaoWang'

>**有沒有方法,既能儲存多個數據,還能在訪問元素的很方便就能夠定位到需要的那個元素呢?**

### 》》》字典能很好的解決這種問題,你印象中的字典是什麼樣的?
#
    》》》另一個場景:
    學生資訊列表,每個學生資訊包括學號、姓名、年齡等,如何從中找到某個學生的資訊?
    >>> studens = [[1001, "王寶強", 24], [1002, "馬蓉", 23], [1005, "宋喆",24], ...]


* 字典格式
    * 格式:{key1 : value1, key2 : value2, key3 : value3, ....}


* 建立字典
    * 定義一個變數info為字典型別
#
    info = {"name" : "zhangsan", "id" : 1234, "address" : "北京"}


* 說明:
    * 字典和列表相似,儲存多種資料
    * 字典中找元素,根據名字(就是:前面的那個值--》key)
    * 字典中的每一個元素分為兩個部分,鍵   值
       * 例如:
      name   --------->   key
      zhangsan    ----->  value


## 05.09_Python語言基礎(字典常用操作)(掌握)
* 新增字典內容
    * 變數名["鍵"] = 資料時,如果該鍵在字典中不存在,會自動建立
#
    # 字典新增元素
    info = {"id": 100, "address": "北京", "name": "zhangsan"}
    print("新增元素前的字典info:", info)
    info["phoneNum"] = 10086
    print("新增元素後的字典info:", info)
執行輸出結果:
#
    新增元素前的字典info: {'id': 100, 'address': '北京', 'name': 'zhangsan'}
    新增元素後的字典info: {'id': 100, 'address': '北京', 'name': 'zhangsan', 'phoneNum': 10086}


* 修改字典內容
    * 變數名["鍵"] = 資料時,如果該鍵在字典中存在,會改變原值
    * 變數名["鍵"] = 資料時,如果該鍵在字典中不存在,會自動建立
#
    info = {"id": 100, "address": "北京", "name": "zhangsan"}
    print("修改前的字典info:", info)
    # 格式:
    # 變數名["鍵"] = 資料時,如果該鍵在字典中存在,會改變原值
    # 變數名["鍵"] = 資料時,如果該鍵在字典中不存在,會自動建立
    newAddr = input("請輸入您所在的城市:")
    info["address"] = newAddr
    newAge = int(input("請輸入您的年齡:"))
    info["age"] = newAge
    print("修改後的字典info:", info)
執行輸出結果:
#
    修改前的字典info: {'id': 100, 'address': '北京', 'name': 'zhangsan'}
    請輸入您所在的城市:上海
    請輸入您的年齡:18
    修改後的字典info: {'id': 100, 'address': '上海', 'name': 'zhangsan', 'age': 18}


* 刪除字典元素
    * del  :刪除指定的元素
    * clear():清空字典
    * 案例:
del案例
#
    # 刪除字典元素
    info = {"id": 100, "address": "北京", "name": "zhangsan"}
    print("刪除元素前的字典info:", info)
    del info["address"]
    print("刪除元素後的字典info:", info)
執行輸出結果:
#
    刪除元素前的字典info: {'id': 100, 'address': '北京', 'name': 'zhangsan'}
    刪除元素後的字典info: {'id': 100, 'name': 'zhangsan'}


clear()案例
#
    # clear()
    print("clear()前的字典info:", info)
    info.clear()
    print("clear()後的字典info:", info)
執行輸出結果:
#
    clear()前的字典info: {'id': 100, 'name': 'zhangsan'}
    clear()後的字典info: {}
>使用clear()會把字典清空,不會把字典從記憶體中抹去


* 檢視字典元素
    * get()函式:在我們不確定字典中是否存在某一個鍵而又想獲取它的值,可以使用get(),可以設定預設值
    * 案例:
#
    # get()函式
    info = {"id": 100, "address": "北京", "name": "zhangsan"}
    age = info.get("age")  # age鍵不存在,所以age的值為None
    print(age)
    # 如果info中不存在age,設定預設值
    age = info.get("age", 18)
    print(age)
執行輸出結果:
#
    None
    18


## 05.10_Python語言基礎(字典常用函式)(掌握)
* 字典長度
    * len(dict)
* 獲取所有的鍵key
    * dict.keys()
* 獲取所有的值value
    * dict.values() 
* 獲取所有的鍵值對
    * dict.items()
* 遍歷字典
    * 使用for迴圈可以搞定
* 案例:

    # 字典常用函式
    info = {"id": 100, "address": "北京", "name": "zhangsan"}
    # len()
    len0 = len(info)
    print("字典info的長度是:", len0)
    # keys()
    keys = info.keys()
    print("字典info的鍵集合是:", keys)
    # values()
    values = info.values()
    print("字典info的值集合是:", values)
    # items()
    items = info.items()
    print("字典info的鍵值對集合是:", items)
執行輸出結果:
#
    字典info的長度是: 3
    字典info的鍵集合是: dict_keys(['id', 'address', 'name'])
    字典info的值集合是: dict_values([100, '北京', 'zhangsan'])
    字典info的鍵值對集合是: dict_items([('id', 100), ('address', '北京'), ('name', 'zhangsan')])

字典的遍歷:
#
    # 字典的遍歷
    # 遍歷字典中的key
    info = {"id": "100", "address": "北京", "name": "zhangsan"}
    print("--------遍歷字典中的key--------")
    b = info.keys()
    print(type(b))
    for key in b:
        print(key, end=",")
    
    print("\n--------遍歷字典中的value--------")
    # 遍歷字典獲取字典中所有的值
    c = info.values()
    for value in c:
        print(value, end=",")
    
    print("\n--------遍歷字典中的鍵值對--------")
    # 獲取鍵值對
    itmes = info.items()
    for itme in itmes:
        print(itme)
    print("\n--------遍歷字典中的鍵值對改良版--------")
    # 改進
    for key, value in itmes:
        print("key = %s,value = %s" % (key, value))
執行輸出結果:
#
    --------字典的遍歷--------
    --------遍歷字典中的key--------
    <class 'dict_keys'>
    id,address,name,
    --------遍歷字典中的value--------
    100,北京,zhangsan,
    --------遍歷字典中的鍵值對--------
    ('id', '100')
    ('address', '北京')
    ('name', 'zhangsan')
    key = id,value = 100
    key = address,value = 北京
    key = name,value = zhangsan

>想一想,如何實現帶下標索引的遍歷
第一種方式:輸出時直接加上
#
    chars = ['a', 'b', 'c', 'd']
    i = 0
    for chr in chars:
         print("%d %s"%(i, chr))
         i += 1
    執行輸出結果:
    0 a
    1 b
    2 c
    3 d
* 第二種方式:使用enumerate()解決
#
    print("第二種方式:")
    for i, c in enumerate(chars):
        print(i, c)
    執行輸出結果:
    0 a
    1 b
    2 c
    3 d

## 05.11_Python語言基礎(字典和列表優缺點比較)(掌握)
* 字典和列表比較:
    * 優點
        * 字典查詢和插入的速度較快,不會隨著key-value的增加而變慢
        * 列表需要從頭遍歷,列表的順序變化後查詢引數也要改變
    * 缺點
        * 字典需要佔用較大的記憶體
        * 列表結構比較簡單,佔用記憶體比較小

## 05.12_Python語言基礎(集合概述)(掌握)
* 集合與之前的列表和元組類似,可以儲存多個型別資料,這些資料不能重複
    * 理解
        * 相對於字典,是一組key,沒有value
    * 本質:
        * 無序,無重複元素元素的集合
        * 集合的物件支援union(聯合),intersection(交),difference(差),system-difference(系統差集)等運算
    * 特點:
        * 不能儲存重複元素

## 05.13_Python語言基礎(集合的格式和建立)(掌握)
* 建立集合:
    * 集合的建立 ,需要列表、元組、字典等可迭代型別作為元素輸入集合
    * 重複的元素在集合中會被自動過濾掉
    * set = {},print(type(set))執行得到的結果不是集合
    * set = set()
    
建立集合案例:
#
    set01 = set([1, 6, 9, 3, 6])
    set02 = set({"id": "100", "address": "北京", "name": "zhangsan"})
    set03 = {}        # 建立的不是集合,是字典
    set04 = set("abcde")
    print(set01)
    print(set02)
    print(set03)
    print(set04)
    print(type(set03))
    print(type(set04))
執行輸出結果:
#
    {1, 3, 6, 9}
    {'name', 'id', 'address'}
    {}
    {'e', 'a', 'c', 'd', 'b'}
    <class 'dict'>
    <class 'set'>



## 05.14_Python語言基礎(集合的常用操作)(掌握)
* 向集合新增元素
    * 集合新增元素使用add()
    * 格式:set.add(obj)

集合新增資料案例:
#
    # 集合新增元素
    print("---------add---------")
    # 新增add
    s1 = set([1, 2, 3, 4, 5])
    s1.add(6)
    print(s1)
    s1.add(3)  # 新增重複的元素,沒有效果
    print(s1)
執行輸出結果:
#
    ---------add---------
    {1, 2, 3, 4, 5, 6}
    {1, 2, 3, 4, 5, 6}
>向集合內新增重複元素不報錯,也沒作用

讀一下程式碼,說出執行結果:
#
    s1.add([7, 8, 9])          # set的元素不能是列表,列表是可變的
    print(s1)
    s1.add({1: "haha"})      # set的元素不能是字典,字典也是可變的
    print(s1)
    s1.add(7, 8, 9)          # set的元素不能連續新增
    print(s1)
    s1.add((7, 8, 9))          # set的元素可以是字典,字典也是不可變的
    print(s1)

* 集合更新update()
    * 插入(更新)update()
    * 可以插入list/tuple/String打碎插入(無序,去重)
    
update()案例:
#
    # 插入(更新)update()
    # 可以插入list/tuple/String打碎插入(無序,去重)
    print("----------Update()----------")
    s2 = set([1, 2, 3])
    s2.update([4, 5, 6])
    print(s2)
    
    s2.update((9, 10))
    print(s2)
    s2.update("haha")
    print(s2)
    s2.update("哈哈")
    print(s2)
執行輸出結果:
#
    ----------Update()----------
    {1, 2, 3, 4, 5, 6}
    {1, 2, 3, 4, 5, 6, 9, 10}
    {'h', 1, 2, 3, 4, 5, 6, 9, 10, 'a'}
    {'h', 1, 2, 3, 4, 5, 6, 9, 10, '哈', 'a'}

>可迭代元素被打碎放入集合,
>重複元素會被消除,
>更新後的集合無序


* 刪除集合元素
    * 刪除集合元素使用remove(object)

刪除元素案例:
#
    # 刪除集合元素
    print("------remove------")
    # 刪除remove()
    s3 = set([1, 2, 3, 4, 5])
    s3.remove(4)  # 刪除是具體的元素
    print(s3)
    s3.remove(9)  # 這個元素是不存在的
    print(s3)
執行輸出結果:
#
    ------remove------
    {1, 2, 3, 4, 5}
    {1, 2, 3, 5}
    
刪除不存在元素:
#
    # 刪除集合元素
    print("------remove------")
    # 刪除remove()
    s3 = set([1, 2, 3, 4, 5])
    s3.remove(9)  # 這個元素是不存在的
    print(s3)
執行輸出結果:
#
    Traceback (most recent call last):
    File "/Day06/Set_Demo01.py", line 58, in <module>
    s3.remove(9)  # 這個元素是不存在的
    KeyError: 9


* 遍歷集合
    * 集合是可迭代型別資料
    * 使用for迴圈可以遍歷集合
    * set集合沒有索引,無法使用while進行遍歷
    * 如果想要得到索引和對應的值,使用enumerate


遍歷集合案例:
#
    # 遍歷集合
    print("---------for迴圈遍歷集合——----")
    s4 = set([1, 2, 3, 4, 5])
    for i in s4:
        print(i, end=",")

    print("-------帶索引的遍歷方式-------")
    s5 = set("床前明月光")
    for index, i in enumerate(s5):
        print(index, i)
執行輸出結果:
#    
    1,2,3,4,5,
    -------帶索引的遍歷方式-------
    0 前
    1 床
    2 月
    3 光
    4 明


* 集合的交集和並集
    * 交集:返回兩個集合相同的元素,返回資料型別是集合
    * 並集:返回兩個集合內多有的元素並去除重複,返回資料型別是集合

交集和並集案例:
#
    print("--------交集-------")
    # 交集,使用運算子    "&"
    s5 = set([1, 2, 3])
    s6 = set([4, 5, 6, 2, 3])
    # 交集  &
    s7 = s5 & s6
    print(s7)
    
    print("--------並集-------")
    # 並集,使用運算子    "|"
    s8 = s5 | s6
    print(s8)
    print(type(s8))
執行輸出結果:
#
    --------交集-------
    {2, 3}
    --------並集-------
    {1, 2, 3, 4, 5, 6}
    <class 'set'>



## 05.15_Python語言基礎(生成器)(熟練)
* Python的生成器是一個返回可以迭代物件的函式。
* 先看案例:
建立一個列表,元素為0--20以內的偶數
#
    list01 = [2, 4, 6, 8, 10, 12, 14, 16, 18]
    list02 = [x * 2 for x in range(1, 10)]
    Generator01 = (x * 2 for x in range(1, 10))
    print(list01)
    print(list02)
    print(Generator01)
    for i in Generator01:
        print(i, end=",")
執行輸出結果:
#
    [2, 4, 6, 8, 10, 12, 14, 16, 18]
    [2, 4, 6, 8, 10, 12, 14, 16, 18]
    <generator object <genexpr> at 0x0000014043D37200>
    2,4,6,8,10,12,14,16,18,

* 建立生成器的方式有多種,只要把一個列表生成式的[]改成()
* 建立list和Generator區別在於外層[],(),list表示一個列表,Generator表示生成器
* 遍歷生成器內容:
    * next()
    * for迴圈
    
next()讀取生成器內容
#
    # next
    # 定義一個生成器
    Generator = (x * 2 for x in range(5))
    temp = next(Generator)
    print(temp)
    temp = next(Generator)
    print(temp)
    temp = next(Generator)
    print(temp)
    temp = next(Generator)
    print(temp)
    temp = next(Generator)
    print(temp)
    
    temp = next(Generator)# 注意:如果一直寫next()函式,當超出了元素的個數範圍的時候會直接報錯
    print(temp)
執行輸出結果:
#
    0
    2
    4
    6
    8
    Traceback (most recent call last):
      File "/Day06/Generator_Demo01.py", line 24, in <module>
    temp = next(Generator)
    StopIteration

for迴圈遍歷生成器內容:
#
    # 迴圈遍歷
    Generator = (x*2 for x in range(5))
    for temp in Generator:
        print(temp)
執行輸出結果:
#
    0
    2
    4
    6
    8
>讀取到最後一個元素自動結束,不會報錯

#
    總結:
    生成器儲存的是一個演算法,每次呼叫next()函式,就能計算出生成器下一個元素的值,直到最後一個元素,
    如果超出了元素的最大長度範圍,報錯,
    通過for迴圈來迭代他,並且不用關心超出界限的問題



## 05.16_Python語言基礎(函式實現生成器)(熟悉)
* 函式來實現生成器(函式後面學習)
#
    函式的定義:
    格式: def 函式名():
        方法體語句

    函式的呼叫:函式名()

* 練習:菲波拉鍥數列
#
    1 1 2 3 5 8 13    除第一個和第二個外,任意的數都是由前兩個數相加得到

    a = 0
    b = 0
    c = 1
    while a < 5:
        temp = c
        c = b + c
        b = temp
         a += 1
        print(b)


* 函式(方式一)
#
    def fib1():
        a = 0
        b = 0
        c = 1
        while a < 5:
            temp = c
            c = b + c
            b = temp
            a += 1
            print(b)
    fib1()


* 函式(方式二)
#
    def fib2():
        a = 0
        b,c = 0,1
        while a < 5:
            print(c)
            b, c = c , b + c
            # b = c
            # c = b + c
            a += 1

    fib2()
解釋一下程式碼:
#
    a = 0
    b = 1
    a,b = b, a + b
    相當於
    temp = b
    b = a + b
    a = temp
    
    或者:
       a, b = b , a + b 


## 05.17_Python語言基礎(生成器--yield)(熟悉)
* 先看程式碼:
#
    print("-----fib3()---------")
    def fib3():
        a = 0
        b, c = 0, 1
        while a < 5:
            # print(c)
            yield c
            b, c = c, b + c
            a += 1

    f = fib3()#生成器
    print(f)
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))
執行輸出結果:
#
    -----fib3()---------
    <generator object fib3 at 0x000002352A007360>
    1
    1
    2
    3
    5
* yield是一個類似return的關鍵字,迭代一次遇到yield的時候返回(右側,後面的值)
* 重點:
    * 下一次迭代時,從上一次迭代遇到yield後面的程式碼(下一行)開始執行
        * return返回一個值,並且記住返回值的位置,
        * 下次迭代的時候就從這個記錄的位置開始
    * 輸出時注意呼叫next()的次數,超出內容會報錯



## 05.18_Python語言基礎(迭代器概述)(掌握)
* 迭代:
   * 迭代是重複反饋過程的活動,其目的通常是為了逼近所需目標或結果。
   * 每一次對過程的重複稱為一次“迭代”,而每一次迭代得到的結果會作為下一次迭代的初始值。
   * 計算機中的迭代:對計算機特定程式中需要反覆執行的子程式*(一組指令),進行一次重複,即重複執行程式中的迴圈,直到滿足某條件為止,亦稱為迭代
   * Python中的迭代是訪問集合元素的一種方式
* 迭代器:
   * 可以被next()函式呼叫並且不斷的返回下一個值的物件(迭代器 Iterator)
* 迭代物件:
   * 是一個可以記住遍歷位置的物件
   * 迭代器物件從集合的第一個元素開始訪問,直到所有的元素訪問完畢為止
* 迭代器的特點:
  * 只能往前,不會後退


## 05.19_Python語言基礎(可迭代物件)(掌握)
* 直接可用for迴圈遍歷的資料型別有哪些?
    * 一類:list  tuple  dict  set  str
    * 一類:生成器
* 這些可以直接作用與for迴圈的物件的統稱----》可迭代物件(Iterable)
* **怎麼判斷是否可以迭代?**
    * 可以使用isinstance()來判斷一個物件是否是Iterable,返回值是True或者False
    * 需要使用一個模組collections

#
    from collections import Iterable
    a = isinstance([],Iterable)
    b = isinstance((),Iterable)
    c = isinstance({},Iterable)
    d = isinstance("aaaa",Iterable)
    e = isinstance(1000,Iterable)#false
    f = isinstance((x for x in range(5)),Iterable)
    print(a)
    print(b)
    print(c)
    print(d)
    print(e)
    print(f)
執行輸出結果:
#
    True
    True
    True
    True
    False
    True


## 05.20_Python語言基礎(迭代器)(掌握)
* 迭代器:
   * 可以被next()函式呼叫並且不斷的返回下一個值的物件(迭代器 Iterator)
* 判斷一個元素是不是迭代器:isinstance(ocject, Iterator)
#
    print("--------Iterator---------")
    from collections import Iterator
    
    a = isinstance([], Iterator)
    b = isinstance((), Iterator)
    c = isinstance({}, Iterator)
    d = isinstance("aaaa", Iterator)
    e = isinstance(1000, Iterator)
    f = isinstance((x for x in range(5)), Iterator)
    print(a)
    print(b)
    print(c)
    print(d)
    print(e)
    print(f)

    執行輸出結果:
    
    --------Iterator---------
    False
    False
    False
    False
    False
    True

#
    Python中 list、truple、str、dict這些都可以被迭代,但他們並不是迭代器。為什麼?

    因為和迭代器相比有一個很大的不同,list、truple、map、dict這些資料的大小是確定的,
    也就是說有多少事可知的。
    但迭代器不是,迭代器不知道要執行多少次,所以可以理解為不知道有多少個元素,
    每呼叫一次next(),就會往下走一步,是惰性的。

    判斷是不是可以迭代,用Iterable
    判斷是不是迭代器,用Iterator

    所以,
    凡是可以for迴圈的,都是Iterable
    凡是可以next()的,都是Iterator

    集合資料型別如list、truple、dict、str都是Itrable不是Iterator,
    但可以通過iter()函式獲得一個Iterator物件

    Python中的for迴圈就是通過next實現的
 


## 05.21_Python語言基礎(Iter()函式)(掌握)
* 生成器都是Iterator物件,但是list、dict、str都是迭代物件但是不是迭代器
* 使用iter()函式可以把這些可迭代物件轉換為迭代器
案例程式碼:
#
    print("-----------Iter()-------------")
    from collections import Iterator
    
    words = [1, 5, 8, 3, 5]
    a = isinstance(iter(words), Iterator)
    b = isinstance(iter(()), Iterator)
    c = isinstance(iter({}), Iterator)
    d = isinstance(iter("hhaha"), Iterator)
    f = isinstance((x for x in range(5)), Iterator)
    print(a)
    print(b)
    print(c)
    print(d)
    print(f)
    
    words = iter(words)
    print(next(iter(words)))
    print(next(iter(words)))
    print(next(iter(words)))
執行輸出結果:
#
    -----------Iter()-------------
    True
    True
    True
    True
    True
    1
    5
    8



## 05.22_Python語言基礎(迭代器總結)(掌握)
#
    1.凡是可以作用與for迴圈物件都是Iterable型別
    2.可以作用與next()函式的物件都是Iterator型別
    3.集合資料型別list、tuple、dict、str等是Iterable但不是Iterator
    4.集合資料型別list、tuple、dict、str等通過iter()可以將其轉換為Iterator