• 第四章-序列


    一、列表(list)

      - 列表是Python中的一个对象

      - 对象(object)就是内存中专门用来存储数据的一块区域

      - 之前我们学习的对象,像数值,它只能保存一个单一的数据

      - 列表中可以保存多个有序的数据

      - 列表是用来存储对象的对象

      - 列表的使用:

        1.列表的创建

          (1)通过中括号[]来创建列表,my_list = []  #创建 一个空列表

          (2)列表中存储的数据称为元素

          (3)一个列表中可以存储多个元素,也可以在创建列表时,来指定列表中的元素

          (4)当向列表中添加多个元素时,多个元素之间使用逗号(,)隔开       

    my_list = [10,20,30,40,50]
    print(my_list)

          (5)列表中可以保存任意的对象

    my_list = [10,'hello',None,40,50]
    print(my_list)

          (6)列表中都会按照插入的顺序存储到列表中

          (7)我们可以通过索引(index)来获取列表中的元素

            索引是元素在列表中的位置,列表中的每一个元素都有一个索引,第一个位置的索引为0,第二个位置的索引为1...

            通过索引来获取列表的元素

              - 语法:my_list[索引] my_list[0] 

    my_list[10,'hello',None,40,50]
    print(my_list[0])   #打印结果为10

              - 如果使用的索引超过了最大范围,会抛出异常

          (8)获取列表的长度,列表中元素的个数

             len()函数,通过该函数可以获取列表的长度

    my_list = [10,'hello',None,40,50]
    print(len(my_list))    #打印结果为5

            获取到的长度的值,是列表的最大索引 + 1

        2.切片

          (1)切片指从现有的列表中,获取一个子列表

          (2)创建一个列表,一般创建列表时,变量的名字会使用复数

          (3)列表的索引可以是负数

          (4)如果索引是负数,则从后向前获取元素,-1表示倒数第一个,-2表示倒数第二个,以此类推

          (5)通过切片来获取指定的元素

            - 语法:列表[起始:结束]

    my_lists = [10,'hello',None,40,50]
    print(my_lists[0:2]) #只打印10,hello

            - 通过切片获取元素时,会包括起始位置的元素,不会包括结束位置的元素

            - 做切片操作时,总会返回一个新的列表,不会影响原来的列表

            - 起始和结束位置的索引都可以省略不写

              如果省略结束位置,则会一直截取到最后

              如果省略开始位置,则会从第一个元素开始截取

              如果起始位置和结束位置全部省略,则相当于创建了一个列表的副本

          (6)步长

            - 语法:列表[起始:结束:步长]

            - 步长表示,每次获取元素的间隔,默认值是1

            - 步长不能是0,但是可以是负数

              如果是负数,则会从列表的后部向前截取元素

        3.操作列表的数据

          (1)+ 和  * 

            + 号可以将两个列表拼接为一个列表

    my_list = [1,2,3] + [4,5,6]
    print(my_list)   #打印结果为1,2,3,4,5,6

            * 号可以将列表重复指定的次数

    my_list = [1,2,3] * 5
    print(my_list)  # 打印结果为1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3

          (2)in 和 not in

            in用来检查指定元素是否存在于列表中,如果存在返回true,否则返回false

    my_list = [1,2,3] * 5
    print(1  in my_list)  #返回true

            not in用来检查指定元素是否并不存在于列表中,如果存在返回false,否则返回true

    my_list = [1,2,3] * 5
    print(1 not in my_list)   #返回false

          (3)len()获取列表元素的个数

    my_list = [1,2,3] * 5
    print(len(my_list))  # 打印结果为15

          (4)min()获取列表元素的最小值

    my_list = [1,2,3] * 5
    print(min(my_list))  # 打印结果为1

          (5)max()获取列表元素的最大值

    my_list = [1,2,3] * 5
    print(max(my_list))  # 打印结果为3

         两个方法(method),方法和函数基本是一样,只不过方法必须通过对象.方法()的形式调用

        xxx.print()方法实际上就是和对象关系紧密的函数

        1)s.index()获取指定元素在列表中第一次出现时的索引

          index()第2个参数,表示查找的起始位置,第3个参数表示查找的结束位置

          如果要获取列表中没有的元素,则会抛出异常

        2)s.count()

          s.count()是统计元素在列表中出现的次数

    二、序列(sequence)

    序列是Python中最基本的一种数据结构

    数据结构指计算机中数据存储的一种方式

    序列用于保存一组有序的数据,所有的数据在序列中都有唯一的位置(索引)

      并且序列中的数据会按照添加的顺序来分配索引

    序列的分类:

      (1)可变序列(序列中元素可以改变):

        列表(list)

      (2)不可变序列(序列中元素不可以改变):

        字符串(str)

        元祖(tuple)

      前面我们讲的列表的所有操作都是序列的通用操作

    三、修改列表的元素

    1.通过索引直接修改列表元素

    可通过del来删除元素

     

     2.通过切片来修改列表元素

      在给切片赋值时,只能使用序列

      在替换时,可以替换多个元素

      向索引为0的位置插入元素(在前插入一个新元素):my_list[0:0]=[555]

      当设置了步长时,序列中元素的个数必须和切片中元素的个数一致: my-list[::2]  =  [7,8,9]

     通过切片来删除元素:del my_list[::2]

    注意:
    以上操作只针对于可变序列
    若要对不可变序列进行修改,先将其转化为可变序列
    方法:s = list(s)

    3.列表的方法

    (1)插入

      1)s.append()   

        向列表的最后添加一个元素

      2)s.insert(i,x) 

        向列表的指定位置插入一个元素,i 代表位置,x代表插入的元素

       3)s.extend([t])

        使用新的序列来扩展当前序列

        需要一个序列作为参数,它会将该序列中的元素添加到当前列表中

        与append()区别:

          append()是传一个元素,而extend([])是传一个列表(多个元素)

     (2)删除

      1)clear()

        清空序列

      2)pop()

        根据索引删除并返回被删除元素

      

         如果没有指定删除元素,默认删除最后一个元素

       3)remove()

        删除指定元素

        如果相同值的元素有多个,只会删除第一个

       4)reverse()

        反转列表

        4)sort()

          对列表中元素进行排序(默认是升序排列)

         修改排列方式为降序

     四、遍历列表

    遍历列表,指的就是将列表中的所有元素取出来

    1.通过while循环来遍历列表

    i = 0
    my_list = ['唐小妹','谢小妹','茜茜妹','丫丫妹','小妹妹']
    while i < len(my_list):     #采用len()输出所有元素长度
        print(my_list[i])       #打印列表所有元素
        i += 1

    2.通过for循环来遍历列表

    语法:

    for 变量 in 序列 :
        代码块

    for循环的代码块会执行多次,序列中有几个元素就会执行几次

    每执行一次,就会将序列中的一个元素赋值给变量

    可以通过变量,来获取列表中的元素

    # 通过for循环来遍历列表
    
    my_list = ['唐小妹','谢小妹','茜茜妹','丫丫妹','小妹妹']
    for i in my_list :
        print(my_list)

     五、range()函数

    range()可以用来生成一个自然数的序列

    s = range(5)
    print(list(s))  #打印结果为0,1,2,3,4

    该函数需要三个参数

      - 起始位置(可以省略,默认是0)

      - 结束位置

      - 步长(可以省略,默认是1)

    s = range(0,9,3)
    print(list(s))  #打印结果为0,3,6

    通过range()可以创建一个指定次数的for循环

      for循环除了创建方式以外,其余都和while一样

      像else、break、continue都可以在for循环中使用

    #通过range()可以创建一个指定次数的for循环
    for
    i in range(30): print(i) #打印结果为0到30的自然数

    六、元祖tuple(不可变序列)

    元祖是不可变的序列,操作方式基本和列表一致

    在操作元祖时,当成是一个不可变的列表就行了

    一般当我们希望数据不改变时,使用元祖,其他情况都使用列表

    元祖是不可变对象,不能尝试为元祖的元素重新赋值

    当元祖元素不是空元素时,括号可以省略,若元祖元素不是空元祖,里边至少要有一个逗号

    my_tuple = ()     #空元祖
    print(my_tuple,type(my_tuple))  #打印结果为() <class 'tuple'>
    my_tuple = 1,2,3,4,5  #非空元祖使用逗号隔开
    print(my_tuple)   #打印结果为(1, 2, 3, 4, 5)

    元祖的解包(解构):

      解包指将元祖的每个元素都赋值给变量

    my_tuple = 1,2,3,4
    a,b,c,d = my_tuple
    
    print('a=',a)
    print('b=',b)
    print('c=',c)
    print('d=',d)
    
    #打印结果为:
    a= 1
    b= 2
    c= 3
    d= 4
    #交换ab的值
    a = 10
    b = 20
    a,b = b,a
    print(a,b)

      在对元祖进行解包时,变量的数量必须和元祖的数量一致

      也可以在变量前面添加一个*号,这样变量将会获取元祖中所有剩余的元素

    my_tuple = 10,20,30,40
    a,b,*c = my_tuple
    print(a,b,c)  打印结果为10 20 [30, 40]

      注意:不能出现两个或两个以上的*号变量

    七、可变对象

    每个对象中都保存三个数据:

      id(标识)

      type(类型)

      value(值)

        - 可变是指的值可变。

        - 列表就是一个可变对象

    a[0] = 10  #通过变量修改对象的值,这种操作不会改变变量所指向的对象,id不变
    a = [4,5,6]  #给变量重新赋值,这种操作会改变变量所指向的对象,id改变

        - 当修改对象时,如果有其他变量也指向该对象,则修改也会在其他变量中体现

        - 为一个变量重新赋值时,不会影响其它变量

        一般只有在为变量赋值时,才是修改变量,其余的都是修改对象

    == 和 !=比较的是对象的值是否相等
    isis not 比较的是对象的id是否相等(比较两个对象是否是同一个对象)

    八、字典(dictionary)

    字典属于一种新的数据结构,称为映射(mapping)

    字典的作用和列表类似,都是用来存储对象的容器

    列表存储数据的性能很好,但是查询数据的性能很差

    在字典中,每一个元素都有一个唯一的名字,通过这个唯一的名字可以快速查找到指定的元素

    在查询元素时,字典的效率是非常快的

    在字典中可以保存多个对象,每一个对象都有一个唯一的名字

      - 这个唯一的名字称为键(key),通过key可以快速的查找value

      - 这个对象,我们称其为值(value)

      - 所以字典,我们也称为键值对(key-value)结构

      - 每个字典都可以有多个键值对,而每一个键值对我们都称其为一项(item)

    1.语法:

    {key:value,key:value,key:value,key:value}

      字典的值可以是任意对象

      字典的键可以是任意的不可变对象(int、str、bool、tuple...),但是一般使用字符串

        - 字典的键是唯一的不能重复的,如果出现重复,后边 会替换前面的

    d = {'name':'刘茜茜','age':18,'gender':''}
    print(d,type(d))  #打印结果为{'name': '刘茜茜', 'age': 18, 'gender': '女'} <class 'dict'>

      根据键来获取值

    d = {'name':'刘茜茜','age':18,'gender':''}
    print(d['name'])   #获取name的值,打印结果为刘茜茜

      如果使用了字典中不存在的键,会抛出异常

    2.字典的使用

    (1)获取的方法

      1)使用dict()函数来创建字典

    # 使用dict()函数来创建字典
    d = dict(name='刘茜茜',age=18,gender='')
    print(d)        #打印结果为{'name': '刘茜茜', 'age': 18, 'gender': '女'}

        每一个参数都是一个键值对,参数名就是键,参数值就是值(这种方式创建的字典,key都是字符串)

        也可以将一个包含有双值子序列的序列转换为字典

          双值序列,序列中只有两个值,[1,2] 、 ('a',4) 、 'ab'

          子序列,如果序列中的元素也是序列,那么我们就称这个元素为子序列

            [(1,2),(3,5)]

    d = dict([('name','茜茜妹'),('age',12)])
    print(d)  #打印结果为{'name': '茜茜妹', 'age': 12}

      2)len()获取字典中键值对的个数

    d = dict([('name','茜茜妹'),('age',12)])
    print(len(d))  #打印结果为2

      3)in和not in

         in是检查字典中是否包含指定的键

        not in是检查字典中是否不包含指定的键

    #in的用法
    d = dict([('name','茜茜妹'),('age',12)]) print('刘茜茜'in d) #打印结果为false
    #not in的用法
    d = dict([('name','茜茜妹'),('age',12)])
    print('刘茜茜' not in d)  #打印结果为true

      4)根据键值来获取字典中的值

        1'  语法:d[key] 

          通过[]来获取值时,如果不存在就会抛出异常keyError

    d = dict([('name','茜茜妹'),('age',12)])
    print(d['name'])  #打印结果为茜茜妹

          注意:变量不加引号,字符串加引号

        2' 语法:s.get(key[,default])

          与前面一个区别在于,如果获取的值不存在,会返回None

    d = dict([('name','茜茜妹'),('age',12)])
    print(d.get('刘茜茜'))  #打印结果为None

          也可以指定一个默认值来作为第二个参数,这样获取不到值时,将会返回默认值

    d = dict([('name','茜茜妹'),('age',12)])
    print(d.get('hello','刘茜茜'))  #因为hello不存在,所以打印结果为刘茜茜,如果存在,打印茜茜妹

     (2)修改的方法

      1)d[key] = value   

        如果key存在则覆盖 ,不存在则添加

    d = dict([('name','茜茜妹'),('age',12)])
    d['name'] = '刘茜茜'
    print(d)  #打印结果为{'name': '刘茜茜', 'age': 12}

      2)s.setdefault(key[,default])

        可以用来向字典中添加key-value

          - 如果key已经存在于字典中,则会返回key的值,不会对字典做任何操作

          - 如果key不存在,则向字典中添加这个key,并设置value

    d = dict([('name','茜茜妹'),('age',12)])
    d.setdefault('学名','刘茜茜') #'学名'不存在,所以进行添加操作
    print(d)  #打印结果为{'name': '茜茜妹', 'age': 12, '学名': '刘茜茜'}

       3)s.update([other])

        将其他的字典中的key-value添加到当前字典中

    d1 = {'a':1,'b':2,'c':3}
    d2 = {'d':4,'e':5,'f':6}
    d1.update(d2)    # 将字典d2添加到字典d1中
    print(d1)       # 打印结果为{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}

        如果other字典中key与当前字典重复,则直接覆盖当前字典的key-value

    d1 = {'a':1,'b':2,'c':3}
    d2 = {'d':4,'e':5,'f':6,'a':7}  # a的值与d1字典重复,直接覆盖d1的值
    d1.update(d2)    # 将字典d2添加到字典d1中
    print(d1)       # 打印结果为{'a': 7, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}

     (3)删除的方法

        1)del s[key]

    d = {'a':1,'b':2,'c':3}
    del d['a']    # 删除d字典中a的值
    print(d)       # 打印结果为{'b': 2, 'c': 3}

        2)s.popitem()

          随机删除字典中的键值对,一般都会删除最后一个键值对

    d = {'d':4,'e':5,'f':6}
    d.popitem()
    print(d)      #打印结果为{'d': 4, 'e': 5}

          删除之后,它会将删除的key-value作为返回值返回

         返回的是一个元祖,元祖中有两个元素,第一个元素是删除的key,第二个元素是删除的value

         当使用s.popitem()删除空字典时,会抛出异常

        3)s.pop()

          根据key删除字典中的key-value

    d = {'d':4,'e':5,'f':6}
    d.pop('e')
    print(d)      #打印结果为{'d': 4, 'f': 6}

          会将被删除的value返回

          如果删除不存在的key,会抛出异常

          如果指定了默认值,再删除不存在的key时,不会报错,而是直接返回默认值

        4)s.clear()

          用来清空字典,删除字典所有项

        5)s.copy()

          用于对字典进行浅复制

            复制以后的对象与原对象是相互独立的,不会相互影响

            浅复制只会复制对象里面的值,如果值也是一个可变对象,这个可变对象不会被复制

    九、遍历字典

    1.keys()

      该方法会返回字典所有的key

    d = dict(name='刘茜茜',age=18,gender='')
    result = d.keys()
    print(result)   #打印结果为dict_keys(['name', 'age', 'gender'])

      该方法会返回一个序列,序列中保存有字典的所有的键

      通过遍历keys()来获取所有的键值

     2. s.values()

      该方法会返回一个序列,序列中保存有字典的所有的值

        

     3.s.items()

      返回字典中所有的项

      会返回一个序列,序列中包含双值子序列

      双值分别是字典中的key和value

       注意:这里返回的是两个值,所以我们需要用两个变量去接收它(我使用的是i , k)

    十、集合(set)

     集合和列表非常相似,都是直接把值存储起来

      集合与列表不同点:

        - 集合中只能存贮不可变对象

        - 集合中存储的对象是无序的(不是按照元素的插入顺序保存)

        - 集合中不能出现重复的元素(集合中的元素都是唯一的)

    1.集合的使用

      (1)使用{}来创建集合

    s = {1,2,30,4,50}
    print(s,type(s))    #打印结果为{1, 2, 4, 50, 30} <class 'set'>

      (2)使用set()函数来创建集合

        可以通过set()来将序列和字典转化为集合

    s = set([1,2,3,456,6,7,8])      #将列表转化为集合,打印结果为{1, 2, 3, 6, 7, 456, 8} <class 'set'>
    s = set('hello')                #将序列转换为集合,打印结果为{'l', 'o', 'h', 'e'} <class 'set'>
    s = set({'a':1,'b':2,'c':3})    #将序列转换为集合,打印结果为{'c', 'b', 'a'} <class 'set'>
    print(s,type(s))

        注意:使用set()函数将字典转换为集合时,只会包含字典中的键。

           不能使用索引去创建集合,须先转换为列表

      (3)in和not in来检查集合中的元素

    s = set([1,2,3,456,6,'f',8])  
    print('f' in s)   #打印结果为True
    print(1 not in s)  #打印结果为False

      (4)使用len()来获取集合中元素的数量

    s = set([1,1,2,3,456,6,'f',8])  
    result = len(s)  #获取集合的数量
    print(result)   #打印结果为7,因为有重复的,所以会默认是1个

      (5)add()向集合中添加元素

    s = {1,1,2,3,456,6,'f',8}
    s.add('xixi')   #向集合中添加元素
    print(s)   #打印结果为{1, 2, 3, 6, 456, 8, 'f', 'xixi'}

      (6)update()将一个集合的元素添加到当前集合中

          update()可以将一个集合中的元素添加到当前集合中

          update()可以传递序列或字典作为参数,字典只会使用键

    #向集合中传集合
    s = set('hello') s2 = set('茜茜') s2.update(s) #把s中的元素添加到s2中 print(s2) #打印结果为{'l', 'e', 'o', 'h', ''}
    # 向集合中传序列
    s = set('hello')
    s2 = set((10,20,30,40,50))
    s2.update(s)  #把s中的元素添加到s2中
    print(s2)     #打印结果为{40, 10, 'o', 'l', 50, 20, 'h', 'e', 30}
    # 向集合中传字典
    s = set('hello')
    s2 = set({'a':1,'b':2,'c':3})
    s2.update(s)  #把s中的元素添加到s2中
    print(s2)     #打印结果为{'a', 'b', 'e', 'l', 'h', 'o', 'c'}

      (7)pop()随机删除一个集合中的元素

          随机删除并返回一个集合中的元素

    # 随机删除集合中的元素
    s = set('hello')
    a = s.pop()  #随机删除s中的元素
    print('删除的元素a =',a) #打印结果为删除的元素a = h
    print(s)     #打印结果为{'e', 'o', 'l'}

      (8)remove()删除集合中指定的元素

    # 删除集合中指定的元素
    s = set('hello')
    a = s.remove('e')  #随机删除s中的指定的元素e
    print('删除的元素a =',a) #打印结果为删除的元素a = None
    print(s)     #打印结果为{'l', 'o', 'h'}

      (9)clear()清空集合

    #清空集合
    s = set('hello')
    s.clear()  #清空集合
    print(s)     #打印结果为set()

      (10)copy()对集合进行浅复制

    #对集合进行浅复制
    s = set('hello')
    a = s.copy()  #浅复制集合s
    print(a)      #打印结果为{'l', 'e', 'o', 'h'}
    print(s)     #打印结果为{'l', 'e', 'o', 'h'}

     2.集合的运算

    在对集合做运算时,不会影响原来的集合,而是返回一个运算结果

      (1)&交集运算

    s1 = {1,2,3,4,5}
    s2 = {4,5,6,7,8}
    result = s1 & s2   #对两个集合进行交集运算
    print(result)      #打印结果为{4, 5}

      (2)| 并集运算

    s1 = {1,2,3,4,5}
    s2 = {4,5,6,7,8}
    result = s1 | s2   #对两个集合进行并集运算
    print(result)      #打印结果为{1, 2, 3, 4, 5, 6, 7, 8}

      (3)-  差集运算

         差集:只找第一个集合有的但是第二个集合没有的元素  

    s1 = {1,2,3,4,5}
    s2 = {4,5,6,7,8}
    result = s1 - s2   #对两个集合进行差集运算
    print(result)      #打印结果为{1, 2, 3}

      (4)^  异或集

          异或: 获取不相交的集合元素

    s1 = {1,2,3,4,5}
    s2 = {4,5,6,7,8}
    result = s1 ^ s2   #对两个集合进行异或运算
    print(result)      #打印结果为{1, 2, 3, 6, 7, 8}

      (5)<=  检查一个集合是否是另一个集合的子集

          如果a集合中元素全部都在b集合中出现,那么a集合就是b集合的子集,b集合是a集合超集

             如果a集合与b集合相等,也会返回true 

    s1 = {1,2,3}
    s2 = {1,2,3,4,5}
    result = s1 <= s2   #检查s1是否是s2的子集,如果是返回true,否则返回false
    print(result)      #打印结果为True

      (6)<  检查一个集合是否是另一个集合的真子集

          如果超集b中含有子集a中的所有元素,并且b中含有a中没有的元素,则b就是a的真超集,a是b的真子集

    s1 = {1,2,3}
    s2 = {1,2,3,4,5}
    result = s1 < s2   #检查s1是否是s2的真子集,如果是返回true,否则返回false
    print(result)      #打印结果为True

      (7)>   检查一个集合是否是另一个集合的超集

          如果超集b中含有子集a中的所有元素,并且b中含有a中没有的元素,则b就是a的真超集,a是b的真子集

    s1 = {1,2,3}
    s2 = {1,2,3,4,5}
    result = s2 > s1   #检查s2是否是s1的真超集,如果是返回true,否则返回false
    print(result)      #打印结果为True
  • 相关阅读:
    GIL全局解释器锁、死锁、递归锁以及event事件与信号量、线程queue
    进程通信、消费者模型和线程
    COM inerop 创建自定义互操作集 问题
    工业自动化软件产业发展的探索与实践
    为什么都是a
    Dictionary用“集合初始值设定项”进行初始化
    非“自动实现的属性”也可以用“对象初始值设定项”进行初始化
    通过接口来解开依赖
    什么叫委派
    私有可写属性
  • 原文地址:https://www.cnblogs.com/xixi3/p/13234809.html
Copyright © 2020-2023  润新知