容器类型 (str list tuple set dict)
一. list 列表类型
特征:可获取,可修改,有序
1.定义空列表
listvar = []
print(listvar,type(listvar))

    2.定义普通列表
        listvar = [19,3.14,"你好",5-6j]

    3.获取列表中的元素
        正向索引  :   0   1    2     3  
        listvar  = [19,3.14,"你好",5-6j]
        逆向索引  :  -4   -3   -2    -1
        res = listvar[2]
        print(res)
   4.获取列表中最后一个元素
        通过逆向索引下标
        res = listvar[-1]
        print(res)

  通过len来获取长度
  len 可以获取容器中的元素个数(长度)
  res = len(listvar)
  print(res)
  length = res -1  # 4 -1=3
  
  获取最后一个元素的索引下标
  res = listvar[len (listvar)-1]
  print(res)

  4.修改列表中的元素
  listvar =[19,3.14,"你好",5-6j]
  listvar[1] = 11
  print(listvar)

  二.tuple  元组类型
        特点:可获取,不可修改,有序
  1.定义一个空元组
  tuplevar = ()
  什么元素不写,可以表达空元祖的概念

  定义一个普通元组
  tuplevar("啊","为")
  
  2.获取元组当中数据
  res = tuplevar[1]
  print(res)
  
  不可修改元组中的数据
  
  3.注意点:
        区分是否是元组,由逗号这个标识符决定

  三 字符串
  特征:可获取,不可修改,有序



  集合类型  set (交差并补)
  特点:无序,自动去重
  
  1.定义一个集合
  setvar = {"个个","试试"}
  print(setvar,type(setvar))

  不可获取元素,不可修改元素
  
  定义一个空集合
  setvar = set()

  2.字典类型 dict
  字典里的数据以键值对的方式进行存储,表面有序,实际上无序;
  在python3.6版本之后,底层做了优化,存储时,记录了字典的定义顺序
  在获取字典时,把无序存储的数据拿出来,按照定义字典的字面顺序重新排序;
  语法: {键1:值1,键2:值2,....}

  定义一个字典
  dictvar = {1:a,b:3}
  
  获取字典中的元素
  res = dictvar[1]

  修改字典中的元素
  dictvar[1] = 2

  集合和字典之间的注意事项
   集合的值和字典的键有数据类型上的要求:
  允许的数据类型  (可哈希的数据类型,不可变的数据类型) :Number(int ,float ,bool,complex ),str,tuple
  不允许的数据类型 (不可哈希的数据类型,可变的数据类型) : list,set,dict  

  (了解)
  字典的键和集合的值在底层内存存储时,使用了哈希算法
  哈希算法的要求是该数据类型为不可变的数据类型才能存储
  哈希算法特点:无序的散列;

  为什么要提出哈希算法?
  为了把数据均匀的存储在内存之后,减少哈希碰撞
  让数据更快的存储在内存中 

  同一文件下,变量的缓存机制
        Number部分
  1.对于整型而言,-5~正无穷范围内的相同值 id 一致

  2.对于浮点型而言,非负数范围内的相同值  id一致

  3.布尔型而言.值相同情况下  id 一致

  4.复数在 实数+虚数  这样的结构永不相同(只有正虚数的情况列外)


  容器类型部分
  5.字符串 和空元组 相同的情况下  id相同

  6.列表,元组,字典,集合无论什么情况下 id标识都不同[空元组列外]

  总结:
  无论是同一文件的缓存机制,还是不同文件的小数据池,都是为了提升执行的效率,减小空间损耗;


        强制类型转换 Number (int float complex bool)
  1.int的强制转换 (整型 浮点型 布尔型 纯数字字符串)

  2.float的强制转换 (整型 浮点型 布尔型 纯数字字符串)

  3.complex的强制转换 (整型 浮点型 布尔型 纯数字字符串 复数)

  4.bool  的强制转换
  没有数据类型的限制,可以转换一切数据类型;
  bool => True 或者 False
  布尔型为假的十种情况:
  Number : 0  0.0  0j   False
  容器   : ()   ''    []    {}  set()
  关键字 :None
  
  none:
  代表空的,一般用来对变量做初始化操作
  格式:  a = None     b = None
  

  自动类型转换    Number
  精度从低到高
  bool  > int  > float >complex
  自动类型转换原则 :把低精度的数据向高精度进行转换;
  精度损耗 (写程序时,不要用小数做比较的条件,会导致结果不准确,一般系统会把小数位截取15~18位而产生数据的误差)



        容器类型的强制转换 (str list tuple set dict)
  str 强制转换成字符串
  特点:在原数据的两边套上引号,表达字符串的类型:可以强转一切数据

  list 强制转换列表
  特点:如果是字符串,把里面的内容一个个拿出来,作为列表的新元素
       如果是字典,只保留字典键,值不要
       如果是其他容器,就是单纯的把两边的符号换成[]

  tuple 强制转换元组
  特点: 如果是字符串,就是把里面的字符一个个拿出来,作为元组的新元素
        如果是字典,只要字典的键,不要值
        如果是其他容器,就是把两边的字符换成()

  set  强制转换集合
  特点: 如果是字符串,就是把里面的字符一个个拿出来,作为集合的新元素  (无序,去重)
        如果是字典,只要字典的键,不要值
        如果是其他容器,就是把两边的符号换成{}

  dict  字典的强制转换
  必须是等长的二级容器,且元素个数是2个
  类型:
  1.外面是列表,里面是列表或者元组

  2.外面是元组,里面是列表或者元组

  3.外面是集合,里面是元组

  二级容器 (list  tuple   set   dict)

  等长的二级容器 (里面的元素都是容器 + 容器里面的元素个数都相同)