[19/09/18-星期三] Python中的序列

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
相關文章
相關標籤/搜索