1、express
# 第四章 序列(視頻58-76) ## 列表(list) - 列表是Python中的一個對象 - 對象(object)就是內存中專門用來存儲數據的一塊區域 - 以前咱們學習的對象,像數值,它只能保存一個單一的數據 - 列表中能夠保存多個有序的數據 - 列表是用來存儲對象的對象 - 列表的使用: 1.列表的建立 2.操做列表中的數據 - 練習: - 建立一個列表,在列表中保存你最好的5個朋友的名字 而後分別經過索引來獲取每個朋友的名字 ## 序列(sequence) - 序列是Python中最基本的一種數據結構 - 數據結構指計算機中數據存儲的方式 - 序列用於保存一組有序的數據,全部的數據在序列當中都有一個惟一的位置(索引) 而且序列中的數據會按照添加的順序來分配索引 - 序列的分類: 可變序列(序列中的元素能夠改變): > 列表(list) 不可變序列(序列中的元素不能改變): > 字符串(str) > 元組(tuple) - 剛剛咱們所講全部操做都是序列的通用操做01 02 03 三個文件中的操做 ## EMS(Employee Manager System 員工管理系統) 練習 - 作命令行版本的員工管理系統 - 功能: 四個: 1.查詢 - 顯示當前系統當中的全部員工 2.添加 - 將員工添加到當前系統中 3.刪除 - 將員工從系統當中刪除 4.退出 - 退出系統 - 員工信息要保存到哪裏? 列表,在系統中應該有一個列表,專門用來保存全部員工信息的 ## 可變對象 - 每一個對象中都保存了三個數據: id(標識) type(類型) value(值) - 列表就是一個可變對象 a = [1,2,3] - a[0] = 10 (改對象) - 這個操做是在經過變量去修改對象的值 - 這種操做不會改變變量所指向的對象 - 當咱們去修改對象時,若是有其餘變量也指向了該對象,則修改也會在其餘的變量中體現 - a = [4,5,6] (改變量) - 這個操做是在給變量從新賦值 - 這種操做會改變變量所指向的對象 - 爲一個變量從新賦值時,不會影響其餘的變量 - 通常只有在爲變量賦值時纔是修改變量,其他的都是修改對象 ## 字典(dict) - 字典屬於一種新的數據結構,稱爲映射(mapping) - 字典的做用和列表相似,都是用來存儲對象的容器 - 列表存儲數據的性能很好,可是查詢數據的性能的不好 - 在字典中每個元素都有一個惟一的名字,經過這個惟一的名字能夠快速的查找到指定的元素 - 在查詢元素時,字典的效率是很是快的 - 在字典中能夠保存多個對象,每一個對象都會有一個惟一的名字 這個惟一的名字,咱們稱其爲鍵(key),經過key能夠快速的查詢value 這個對象,咱們稱其爲值(value) 因此字典,咱們也稱爲叫作鍵值對(key-value)結構 每一個字典中均可以有多個鍵值對,而每個鍵值對咱們稱其爲一項(item) ## 集合(set) - 集合和列表很是類似 - 不一樣點: 1.集合中只能存儲不可變對象 2.集合中存儲的對象是無序(不是按照元素的插入順序保存) 3.集合中不能出現重複的元素
2、數據結構
# 建立列表,經過[]來建立列表 my_list = [] # 建立了一個空列表 # print(my_list , type(my_list)) # 列表存儲的數據,咱們稱爲元素 # 一個列表中能夠存儲多個元素,也能夠在建立列表時,來指定列表中的元素 my_list = [10] # 建立一個只包含一個元素的列表 # 當向列表中添加多個元素時,多個元素之間使用,隔開 my_list = [10,20,30,40,50] # 建立了一個保護有5個元素的列表 # 列表中能夠保存任意的對象 my_list = [10,'hello',True,None,[1,2,3],print] # 列表中的對象都會按照插入的順序存儲到列表中, # 第一個插入的對象保存到第一個位置,第二個保存到第二個位置 # 咱們能夠經過索引(index)來獲取列表中的元素 # 索引是元素在列表中的位置,列表中的每個元素都有一個索引 # 索引是從0開始的整數,列表第一個位置索引爲0,第二個位置索引爲1,第三個位置索引爲2,以此類推 my_list = [10,20,30,40,50] # 經過索引獲取列表中的元素 # 語法:my_list[索引] my_list[0] # print(my_list[4]) # 若是使用的索引超過了最大的範圍,會拋出異常 # print(my_list[5]) IndexError: list index out of range # 獲取列表的長度,列表中元素的個數 # len()函數,經過該函數能夠獲取列表的長度 # 獲取到的長度的值,是列表的最大索引 + 1 print(len(my_list)) # 5
3、app
# 切片 # 切片指從現有列表中,獲取一個子列表 # 建立一個列表,通常建立列表時,變量的名字會使用複數 stus = ['孫悟空','豬八戒','沙和尚','唐僧','蜘蛛精','白骨精'] # 列表的索引能夠是負數 # 若是索引是負數,則從後向前獲取元素,-1表示倒數第一個,-2表示倒數第二個 以此類推 # print(stus[-2]) # 經過切片來獲取指定的元素 # 語法:列表[起始:結束] # 經過切片獲取元素時,會包括起始位置的元素,不會包括結束位置的元素 # 作切片操做時,總會返回一個新的列表,不會影響原來的列表 # 起始和結束位置的索引均可以省略不寫 # 若是省略結束位置,則會一直截取到最後 # 若是省略起始位置,則會從第一個元素開始截取 # 若是起始位置和結束位置所有省略,則至關於建立了一個列表的副本 # print(stus[1:]) # print(stus[:3]) # print(stus[:]) # print(stus) # 語法:列表[起始:結束:步長] # 步長表示,每次獲取元素的間隔,默認值是1 # print(stus[0:5:3]) # 步長不能是0,可是能夠是負數 # print(stus[::0]) ValueError: slice step cannot be zero # 若是是負數,則會從列表的後部向前邊取元素 print(stus[::-1])
4、通用操做函數
# + 和 * # +能夠將兩個列表拼接爲一個列表 my_list = [1,2,3] + [4,5,6] # 輸出[1,2,3,4,5,6] # * 能夠將列表重複指定的次數 my_list = [1,2,3] * 5 # print(my_list) # 建立一個列表 stus = ['孫悟空','豬八戒','沙和尚','唐僧','蜘蛛精','白骨精','沙和尚','沙和尚'] # in 和 not in # in用來檢查指定元素是否存在於列表中 # 若是存在,返回True,不然返回False # not in用來檢查指定元素是否不在列表中 # 若是不在,返回True,不然返回False # print('牛魔王' not in stus) # print('牛魔王' in stus) # len()獲取列表中的元素的個數 # min() 獲取列表中的最小值 # max() 獲取列表中的最大值 arr = [10,1,2,5,100,77] # print(min(arr) , max(arr)) # 兩個方法(method),方法和函數基本上是同樣,只不過方法必須經過 對象.方法() 的形式調用 # xxx.print() 方法實際上就是和對象關係緊密的函數。//與Java中方法相似。 # s.index() 獲取指定元素在列表中的第一次出現時索引 # print(stus.index('沙和尚')) //方法的重載 # index()的第二個參數,表示查找的起始位置 , 第三個參數,表示查找的結束位置 # print(stus.index('沙和尚',3,7)) # 若是要獲取列表中沒有的元素,會拋出異常 # print(stus.index('牛魔王')) ValueError: '牛魔王' is not in list # s.count() 統計指定元素在列表中出現的次數 print(stus.count('牛魔王'))
5、修改元素性能
# 建立一個列表 stus = ['孫悟空','豬八戒','沙和尚','唐僧','蜘蛛精','白骨精'] # print("修改前:",stus) # 修改列表中的元素 # 直接經過索引來修改元素 stus[0] = 'sunwukong' stus[2] = '哈哈' # 經過del來刪除元素 del stus[2] # 刪除索引爲2的元素 # print('修改後:',stus) stus = ['孫悟空','豬八戒','沙和尚','唐僧','蜘蛛精','白骨精'] # print("修改前:",stus) # 經過切片來修改列表 # 在給切片進行賦值時,只能使用序列,就是加上中括號[ ] # stus[0:2] = ['牛魔王','紅孩兒'] 使用新的元素替換舊元素 [0,2]實際就是選中下標0-1的元素 # stus[0:2] = ['牛魔王','紅孩兒','二郎神'] 能夠傳多個元素超過2個限制。 # stus[0:0] = ['牛魔王'] # 向索引爲0的位置插入元素 # 當設置了步長時,序列中元素的個數必須和切片中元素的個數一致 # stus[::2] = ['牛魔王','紅孩兒','二郎神'] # 經過切片來刪除元素 # del stus[0:2] # del stus[::2] //刪除從0開始步長爲2的元素 指的是0 2 4 # stus[1:3] = [] 也表示刪除從1-2的元素 # print('修改後:',stus) # 以上操做,只適用於可變序列 s = 'hello' # s[1] = 'a' 不可變序列,沒法經過索引來修改 # 能夠經過 list() 函數將其餘的序列轉換爲list s = list(s) #輸出結果['h','e','l','l','o'] print(s)
6、列表的方法學習
# 列表的方法 stus = ['孫悟空','豬八戒','沙和尚'] # print('原列表:',stus) # append() # 向列表的最後添加一個元素 # stus.append('唐僧') # insert() # 向列表的指定位置插入一個元素 # 參數: # 1.要插入的位置 # 2.要插入的元素 # stus.insert(2,'唐僧') # extend() # 使用新的序列來擴展當前序列 # 須要一個序列做爲參數,它會將該序列中的元素添加到當前列表中 # stus.extend(['唐僧','白骨精']) # stus += ['唐僧','白骨精'] #跟上邊的效果是同樣的 # clear() # 清空序列 # stus.clear() # pop() # 根據索引刪除並返回被刪除的元素 # result = stus.pop(2) # 刪除索引爲2的元素 # result = stus.pop() # 刪除最後一個 # print('result =',result) # remove() # 刪除指定值的元素,若是相同值得元素有多個,只會刪除第一個。沒有返回值,沒有意義。 # stus.remove('豬八戒') # reverse() # 用來反轉列表 # stus.reverse() # sort() # 用來對列表中的元素進行排序,默認是升序排列 # 若是須要降序排列,則須要傳遞一個reverse=True做爲參數 my_list = list('asnbdnbasdabd') my_list = [10,1,20,3,4,5,0,-2] print('修改前',my_list) my_list.sort(reverse=True) print('修改後',my_list) # print('修改後:',stus)
7、遍歷列表spa
# 遍歷列表,指的就是將列表中的全部元素取出來 # 建立列表 stus = ['孫悟空','豬八戒','沙和尚','唐僧','白骨精','蜘蛛精'] # 遍歷列表 # print(stus[0]) # print(stus[1]) # print(stus[2]) # print(stus[3]) # 經過while循環來遍歷列表 # i = 0 # while i < len(stus): # print(stus[i]) # i += 1 # 經過for循環來遍歷列表 # 語法: # for 變量 in 序列 : # 代碼塊 # for循環的代碼塊會執行屢次,序列中有幾個元素就會執行幾回 # 每執行一次就會將序列中的一個元素賦值給變量, # 因此咱們能夠經過變量,來獲取列表中的元素 for s in stus : print(s)
練習:員工管理系統命令行
# 顯示系統的歡迎信息 print('-'*20 , '歡迎使用員工管理系統', '-'*20) # 建立一個列表,用來保存員工的信息,員工的信息以字符串的形式統一保存到列表 emps = ['孫悟空\t18\t男\t花果山','豬八戒\t28\t男\t高老莊'] # 建立一個死循環 while True: # 顯示用戶的選項 print('請選擇要作的操做:') print('\t1.查詢員工') print('\t2.添加員工') print('\t3.刪除員工') print('\t4.退出系統') user_choose = input('請選擇[1-4]:') print('-'*62) # 根據用戶的選擇作相關的操做 if user_choose == '1' : # 查詢員工 # 打印表頭 print('\t序號\t姓名\t年齡\t性別\t住址') # 建立一個變量,來表示員工的序號 n = 1 # 顯示員工信息 for emp in emps : print(f'\t{n}\t{emp}') n += 1 elif user_choose == '2': # 添加員工 # 獲取要添加員工的信息,姓名、年齡、性別、住址 emp_name = input('請輸入員工的姓名:') emp_age = input('請輸入員工的年齡:') emp_gender = input('請輸入員工的性別:') emp_address = input('請輸入員工的住址:') # 建立員工信息 # 將四個信息拼接爲一個字符串,而後插入到列表中 emp = f'{emp_name}\t{emp_age}\t{emp_gender}\t{emp_address}' # 顯示一個提示信息 print('如下員工將被添加到系統中') print('-'*62) print('姓名\t年齡\t性別\t住址') print(emp) print('-'*62) user_confirm = input('是否確認該操做[Y/N]:') # 判斷 if user_confirm == 'Y' or user_confirm == 'yes' or user_confirm == 'y' : # 確認 emps.append(emp) # 顯示提示信息 print('添加成功!') else : # 取消操做 print('添加已取消!') elif user_choose == '3': # 刪除員工,根據員工的序號來刪除員工 # 獲取要刪除的員工的序號 del_num = int(input('請輸入要刪除的員工的序號:')) # 判斷序號是否有效 if 0 < del_num <= len(emps) : # 輸入合法,根據序號來獲取索引 del_i = del_num - 1 # 顯示一個提示信息 print('如下員工將被刪除') print('-'*62) print('\t序號\t姓名\t年齡\t性別\t住址') print(f'\t{del_num}\t{emps[del_i]}') print('-'*62) user_confirm = input('該操做不可恢復,是否確認[Y/N]:') # 判斷 if user_confirm == 'y' or user_confirm == 'yes'or user_confirm == 'Y' : # 刪除元素 emps.pop(del_i) # 顯示提示 print('員工已被刪除!') else : # 操做取消 print('操做已取消!') else : # 輸入有誤 print('您的輸入有誤,請從新操做!') elif user_choose == '4': # 退出 print('歡迎使用!再見!') input('點擊回車鍵退出!') break else : print('您的輸入有誤,請從新選擇!') # 打印分割線 print('-'*62)
8、隨機數code
# range()是一個函數,能夠用來生成一個天然數的序列 r = range(5) # 生成一個這樣的序列[0,1,2,3,4] r = range(0,10,2) r = range(10,0,-1) # 該函數須要三個參數 # 1.起始位置(能夠省略,默認是0) # 2.結束位置 # 3.步長(能夠省略,默認是1) # print(list(r)) # 經過range()能夠建立一個執行指定次數的for循環 # for()循環除了建立方式之外,其他的都和while同樣, # 包括else、包括break continue均可以在for循環中使用 # 而且for循環使用也更加簡單 # 將以前使用while循環作的練習,再使用for循環完成一次! for i in range(30): print(i) # for s in 'hello': # print(s)
9、元組視頻
# 元組 tuple # 元組是一個不可變的序列 # 它的操做的方式基本上和列表是一致的 # 因此你在操做元組時,就把元組當成是一個不可變的列表就ok了 # 通常當咱們但願數據不改變時,就使用元組,其他狀況都使用列表 # 建立元組 # 使用()來建立元組 my_tuple = () # 建立了一個空元組 # print(my_tuple,type(my_tuple)) # <class 'tuple'> my_tuple = (1,2,3,4,5) # 建立了一個5個元素的元組 # 元組是不可變對象,不能嘗試爲元組中的元素從新賦值 # my_tuple[3] = 10 TypeError: 'tuple' object does not support item assignment # print(my_tuple[3]) # 當元組不是空元組時,括號能夠省略 # 若是元組不是空元組,它裏邊至少要有一個, 加個逗號 my_tuple = 10,20,30,40 my_tuple = 40, # print(my_tuple , type(my_tuple)) my_tuple = 10 , 20 , 30 , 40 # 元組的解包(解構) # 解包指就是將元組當中每個元素都賦值給一個變量 a,b,c,d = my_tuple # print("a =",a) # print("b =",b) # print("c =",c) # print("d =",d) a = 100 b = 300 # print(a , b) # 交互a 和 b的值,這時咱們就能夠利用元組的解包 a , b = b , a # print(a , b) my_tuple = 10 , 20 , 30 , 40 # 在對一個元組進行解包時,變量的數量必須和元組中的元素的數量一致 # 也能夠在變量前邊添加一個*,這樣變量將會獲取元組中全部剩餘的元素 a , b , *c = my_tuple #剩下的30和40都給c a , *b , c = my_tuple *a , b , c = my_tuple a , b , *c = [1,2,3,4,5,6,7] a , b , *c = 'hello world' # 不能同時出現兩個或以上的*變量 # *a , *b , c = my_tuple SyntaxError: two starred expressions in assignment print('a =',a) print('b =',b) print('c =',c)
10、可變對象
# # 可變對象,改變對象中的value值 # a = [1,2,3] # print('修改前:', a , id(a)) # # 經過索引修改列表 # a[0] = 10 # print('修改後:', a , id(a)) #id並無改變,和上邊同樣 # # 爲變量從新賦值 # a = [4,5,6] #id也變了,是個新的對象。 # print('修改後:', a , id(a)) a = [1,2,3] b = a # b[0] = 10 b = [10,2,3] # print("a",a,id(a)) # print("b",b,id(b)) # == != is is not # == != 比較的是對象的值是否相等 # is is not 比較的是對象的id是否相等(比較兩個對象是不是同一個對象) a = [1,2,3] b = [1,2,3] print(a,b) print(id(a),id(b)) #id值不一樣 print(a == b) # a和b的值相等,使用==會返回True print(a is b) # a和b不是同一個對象,內存地址不一樣,使用is會返回False