Python基础讲义(七):序列类型

序列类型

0x01内容导图

0x02组合类型概述

  • 组合类型:基本类型的组合
    • 序列类型:字符串、元组、列表
    • 字典类型:键值对型
    • 集合类型:类似于数学中的集合
  • 序列类型通用操作:有序
    • 索引和切片:跟字符串的操作一样
    • 关系运算:in,归属关系
    • 加法运算:两个序列组合成新的序列
    • 乘法运算:将序列中的所有元素按倍数复制,以扩充序列
    • count:统计函数
  • 元组:不可变对象,使用圆括号

0x03列表的常用操作

  • 列表:可变对象,使用方括号,多个基本类型的组合,相当于其他语言中的数组。
  • 修改型操作
    • 索引和切片:可以修改
    • 尾部追加、指定位置插入:append方法、insert方法
    • 按位置删除:del ls[i]
    • 删除指定元素:remove方法
    • 清空操作:clear方法
  • 案例:成绩统计信息
    • 随机产生一组成绩
    • 计算平均分
    • 求最高分
    • 求最低分
    • 计算标准差
    • 计算中位数
  • 代码示例
import random

def init_score(n):
    ls = []
    for i in range(n):
        score = int(random.normalvariate(75, 15))	#以正态分布方式产生随机成绩
        score = score if score <= 100 else 100
        ls.append(score)
    return ls

def calc_avg(s):					#计数平均分
    total = 0
    for x in s:
        total += x
    return total / len(s)

def get_max(s):						#获取最高分
    m = 0
    for x in s:
        if x > m:
            m = x
    return m

def get_min(s):						#获取最低分
    pass

def get_variance(s, avg):			#计数标准差
    pass

def get_median(s):					#计数中位数
    ls = s.copy()
    ls.sort()
    n = len(ls)
    if n % 2 == 1:					#存在中间位置
        return ls[n // 2]
    else:
        return (ls[n // 2] + ls[n // 2 - 1]) / 2   #不存在,中间2个数的平均值

def run():
    scores = init_score(15)
    avg = calc_avg(scores)
    print(scores)
    print(f"average: {avg}")
    print(f"max score:{get_max(scores)}")
    print(f"median:{get_median(scores)}")

if __name__ == "__main__":
    run()

练习:

  1. 完成获取最低分的函数。
  2. 完成计数标准差的函数。

0x04Pytho列表特有操作

  • 栈模拟

    • 入栈(push):append函数模拟push操作
    • 出栈(pop):pop函数,弹出最后一个元素
    • 取栈顶元素(peek):获取最后一个元素,如ls[-1]
    • 示例:括号匹配检查
    def match(s):
        """
        >>> match("(())")
        True
        >>> match("(()")
        False
        >>> match(")(())")
        False
        >>> match("())")
        False
        """
        ls = []
        for ch in s:
            if ch == "(":
                ls.append(ch)
            elif ls:
                ls.pop()
            else:return False
        return not ls
    
    if __name__ == "__main__":
        import doctest
        doctest.testmod(verbose=True)
    

    练习:增加方括号后的混合检查。

  • 列表推导式

    • [项表达式 for循环 if过滤条件]
    • for循环的简化
    ls = [x for x in range(100)]			#创建0-99的整数列表
    lx = [x*x for x in range(1, 6)]			#[1, 4, 9, 16, 25]
    ly = [int(s) for s in ["12", "34", "56"]]	#[12, 34, 56]
    la = [x for x in range(100) if x % 2 == 0]	#0-99的偶数列表,此处仅举例说明过滤条件
    
  • 浅拷贝和深拷贝

    • copy库,deepcopy函数
    • 嵌套列表拷贝时使用
    • 示例:三种复制的区别
    ls = [1, 2, 3]
    la = ls							#钥匙复制,对象为同一个
    lb = ls.copy()					#浅拷贝,一维列表没问题,多维仍不能完全独立
    ls[0] = 10						#la:[10,2,3],lb:[1,2,3]
    ls = [[1, 2], [3, 4]]
    la = ls.copy()
    ls[0][0] = 10					#la:[[10, 2], [3, 4]],受影响
    import copy
    lb = copy.deepcopy(ls)			#多维列表复制一定记住使用深拷贝
    ls[0][0] = 1					#ls恢复为1,但lb维持原值10
    

0x05小结

  • 理解浅拷贝和深拷贝
  • 熟练掌握列表并应用
  • 熟练掌握列表推导式
  • 理解列表和元组的区别
posted @ 2020-11-24 09:06  hzy&hmcj  阅读(259)  评论(0)    收藏  举报