python数据类型2

1. 列表、元组

列表

特性:有序的,可修改。

任意的成员都可以通过下标来进行访问。话句话说,Python 对列表数据中的所有成员按序编号,称为索引,从而实现对成员变量的访问和修改。

  1. 定义

    names = ['Alex',"Tenglan",'Eric']
    
  2. 增加

    names.append("我是新来的")
    
  3. 修改

    >>> names = ['Alex',"Tenglan",'Eric']
    >>> names[1]='Tom'
    >>> names
    ['Alex', 'Tom', 'Eric']
    
  4. 删除

    name.remove('Alex')
    name.pop()
    name.pop(i)   #i是列表元素的下标,对应删除
    
  5. 插入

    >>> names = ['Alex',"Tenglan",'Eric']
    >>> names.insert(1,"shabi")
    >>> names
    ['Alex', 'shabi', 'Tenglan', 'Eric']
    
  6. 拓展

    names1 = ['Alex',"Tenglan",'Eric']
    names2 = ['1','2','3']
    names1.extend(names2)
    >>> names1
    ['Alex', 'Tenglan', 'Eric', '1', '2', '3']
    
  7. 拷贝

  • 浅复制(适合无嵌套字典列表)

    import copy
    names1 = ['Alex',"Tenglan",'Eric']
    #四种浅复制的方式
    names2 = names1[:] 
    names3 = names1.copy()
    names4 = copy.copy(names1)
    names5 = list(names1)
    
  • 深复制(适合嵌套字典列表)

    names1 = ['Alex',"Tenglan",'Eric']
    names2 = copy.deepcopy(names1)
    
    • 例子1

      import copy
      print("----list_1=list_2,内存指向同一空间----")
      list_1 = [
          "Alex", "money", {"names": "Tom"},2
      ]
      list_2 = list_1
      list_1[0] = "shabi"
      list_1[2]["names"] = "doubi"
      list_1[3]=4
      print(list_1)
      print(list_2)
      
      print("----浅复制1----")
      list_1 = [
          "Alex", "money", {"names": "Tom"},2
      ]
      list_2 = list_1.copy()
      list_1[0] = "shabi"
      list_1[2]["names"] = "doubi"
      list_1[3]=4
      print(list_1)
      print(list_2)
      
      print("----浅复制2----")
      list_1 = [
          "Alex", "money", {"names": "Tom"},2
      ]
      list_2 = list(list_1)
      list_1[0] = "shabi"
      list_1[2]["names"] = "doubi"
      list_1[3]=4
      print(list_1)
      print(list_2)
      
      print("----浅复制3----")
      list_1 = [
          "Alex", "money", {"names": "Tom"},2
      ]
      list_2 = list_1[:]
      list_1[0] = "shabi"
      list_1[2]["names"] = "doubi"
      list_1[3]=4
      print(list_1)
      print(list_2)
      
      print("----浅复制4----")
      list_1 = [
          "Alex", "money", {"names": "Tom"},2
      ]
      list_2 = copy.copy(list_1)
      list_1[0] = "shabi"
      list_1[2]["names"] = "doubi"
      list_1[3]=4
      print(list_1)
      print(list_2)
      
      print("----深复制----")
      list_1 = [
          "Alex", "money", {"names": "Tom"},2
      ]
      list_2 = copy.deepcopy(list_1)
      list_1[0] = "shabi"
      list_1[2]["names"] = "doubi"
      list_1[3]=4
      print(list_1)
      print(list_2)
      
      print("----字符和数字类型------")
      a = 5
      b = a
      a = 7
      print(a, " ", b)
      
      print("----字典和列表类型------")
      a = [1, 2, 3]
      b = a
      a [0] = 4
      print(a, " ", b)
      
  1. 统计

    num = [1,2,3,2,4,5,7]
    >>> num.count(2)
    2
    >>> num.count(1)
    1
    
  2. 排序

    num = [1,2,3,2,4,5,7]
    >>> num.sort()
    >>> num
    [1, 2, 2, 3, 4, 5, 7]
    
  3. 获取下标

    • 第一种方法:知道列表的值(重复的获取第一个的值)

      num = [1,2,3,2,4,5,7]
      >>> num.index(3)
      2
      >>> num.index(2)
      1
      
    • 第二种方法:遍历整个列表获取的下标值

      num = [1,2,3,2,4,5,7]
      for i,j in enumerate(num):
      	print(i," ",j)  #i是列表的下标,j是列表的元素
      
  4. 切片

    >>> names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"]
    >>> names[1:4]  #取下标1至下标4之间的数字,包括1,不包括4
    ['Tenglan', 'Eric', 'Rain']
    >>> names[1:-1] #取下标1至-1的值,不包括-1
    ['Tenglan', 'Eric', 'Rain', 'Tom']
    >>> names[0:3] 
    ['Alex', 'Tenglan', 'Eric']
    >>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样
    ['Alex', 'Tenglan', 'Eric']
    >>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写
    ['Rain', 'Tom', 'Amy'] 
    >>> names[3:-1] #这样-1就不会被包含了
    ['Rain', 'Tom']
    >>> names[0::2] #后面的2是代表,每隔一个元素,就取一个
    ['Alex', 'Eric', 'Tom'] 
    >>> names[::2] #和上句效果一样
    ['Alex', 'Eric', 'Tom']
    >>> names[::-1]#倒序
    ['Amy', 'Tom', 'Rain', 'Eric', 'Tenglan', 'Alex']
    

元组

特性:有序的,只读的。

只有访问和统计两种方法

  1. count
  2. index

2.字典

特性:无序,可修改,key是唯一值

  1. 定义

    info = {
        'stu1101': "TengLan Wu",
        'stu1102': "LongZe Luola",
        'stu1103': "XiaoZe Maliya",
    }
    
  2. 增加

    >>> info['stu1104'] = "卡萨丁"
    >>> info
    {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': '卡萨丁'}
    
  3. 修改

    >>> info['stu1104'] = "阿萨姆"
    >>> info
    {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': '阿萨姆'}
    
    
  4. 删除

    • 方法1,pop 返回删除的值

      >>> info
      {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': '阿萨姆'}
      >>> info.pop('stu1101')
      
      
    • 方法2,del 没有返回值

      >>> info
      {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': '阿萨姆'}
      >>> del info['stu1101']
      
      
    • 方法3 随机删除 返回key-value的元组

      >>> info = {'stu1101': 'TengLan Wu', 'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1104': '阿萨姆'}
      >>> info.popitem()
      ('stu1104', '阿萨姆')
      
      
  5. 查找

    方法1:通过key值获取(当key不存在的时候会报错,最好获取前判断key in dict)

    方法2:get方法(当key不存在的时候不会报错)

    >>> info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'}
    >>> "stu1102" in info #标准用法
    True
    >>> info.get("stu1102")  #获取,找不到默认返回None
    'LongZe Luola'
    >>> info["stu1102"] #同上,但是看下面
    'LongZe Luola'
    >>> info["stu1105"]  #如果一个key不存在,就报错,get不会,不存在只返回None
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    KeyError: 'stu1105'
    
    
  6. 遍历字典

    #方法1
    for key in info:
        print(key,info[key])
    
    #方法2
    for k,v in info.items(): #会先把dict转成list,数据里大时莫用
        print(k,v)
    
    
  7. 常用函数

    #values
    >>> info.values()
    dict_values(['LongZe Luola', 'XiaoZe Maliya'])
    
    #keys
    >>> info.keys()
    dict_keys(['stu1102', 'stu1103'])
    
    
    #setdefault
    >>> info.setdefault("stu1106","Alex")
    'Alex'
    >>> info
    {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}
    >>> info.setdefault("stu1102","龙泽萝拉")
    'LongZe Luola'
    >>> info
    {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}
    
    
    #update 
    >>> info
    {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}
    >>> b = {1:2,3:4, "stu1102":"龙泽萝拉"}
    >>> info.update(b)
    >>> info
    {'stu1102': '龙泽萝拉', 1: 2, 3: 4, 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'}
    
    #items
    info.items()
    dict_items([('stu1102', '龙泽萝拉'), (1, 2), (3, 4), ('stu1103', 'XiaoZe Maliya'), ('stu1106', 'Alex')])
    
    
    #通过一个列表生成默认dict,有个问题如下:fromkeys 函数把所有 key 都指向了同一个空列表。改动其中任何一个,其他的都改掉了。
    >>> a = dict.fromkeys([1,2,3],[])
    >>> a
    {1: [], 2: [], 3: []}
    >>> a[1].append(1)
    >>> a
    {1: [1], 2: [1], 3: [1]}
    
    

3.集合

特性:无须,无重复

作用:

  • 去重,把一个列表变成集合,就自动去重了
  • 关系测试,测试两组数据之前的交集、差集、并集等关系
s = set([3,5,9,10])      #创建一个数值集合  
  
t = set("Hello")         #创建一个唯一字符的集合  


a = t | s          # t 和 s的并集  
  
b = t & s          # t 和 s的交集  
  
c = t – s          # 求差集(项在t中,但不在s中)  
  
d = t ^ s          # 对称差集(项在t或s中,但不会同时出现在二者中)  
  
   
  
基本操作:  
  
t.add('x')            # 添加一项  
  
s.update([10,37,42])  # 在s中添加多项  
  
   
  
使用remove()可以删除一项:  
  
t.remove('H')  
  
  
len(s)  
set 的长度  
  
x in s  
测试 x 是否是 s 的成员  
  
x not in s  
测试 x 是否不是 s 的成员  
  
s.issubset(t)  
s <= t  
测试是否 s 中的每一个元素都在 t 中  
  
s.issuperset(t)  
s >= t  
测试是否 t 中的每一个元素都在 s 中  
  
s.union(t)  
s | t  
返回一个新的 set 包含 s 和 t 中的每一个元素  
  
s.intersection(t)  
s & t  
返回一个新的 set 包含 s 和 t 中的公共元素  
  
s.difference(t)  
s - t  
返回一个新的 set 包含 s 中有但是 t 中没有的元素  
  
s.symmetric_difference(t)  
s ^ t  
返回一个新的 set 包含 s 和 t 中不重复的元素  
  
s.copy()  
返回 set “s”的一个浅复制  

4.文件

对文件操作流程

  1. 打开文件,得到文件句柄并赋值给一个变量
  2. 通过句柄对文件进行操作
  3. 关闭文件

关键函数

open()

open(name[, mode[, buffering]])

参数说明:

  • name : 一个包含了你要访问的文件名称的字符串值。
  • mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
  • buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。

不同模式打开文件的完全列表:

模式 描述
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

三种方式

方法1.直接open(),close()

f = open('lyrics') #打开文件,默认是读取
data = f.read()# 对文件读取
f.close() #关闭文件

方法2.try..finally open().close()

比方法1安全,比如说文件操作出错,后续的程序不再运行,通过finally保证安全关闭文件

try:
	f = open('lyrics') #打开文件,默认是读取
	data = f.read()# 对文件读取
finally:
	f.close() #关闭文件

方法3.with语法

with open('log1') as obj1, open('log2') as obj2:
    pass

常用文件操作

  • file.read([size]):size 未指定则返回整个文件,如果文件大小 >2 倍内存则有问题,f.read()读到文件尾时返回""(空字串)。
  • file.readline():返回一行。
  • file.readlines([size]) :返回包含size行的列表, size 未指定则返回全部行。
  • for line in f: print line :通过迭代器访问。
  • f.write("hello\n"):如果要写入字符串以外的数据,先将他转换为字符串。
  • f.tell():返回一个整数,表示当前文件指针的位置(就是到文件头的比特数)。
  • f.seek(偏移量,[起始位置]):用来移动文件指针。
    • 偏移量: 单位为比特,可正可负
    • 起始位置: 0 - 文件头, 默认值; 1 - 当前位置; 2 - 文件尾
  • f.close() 关闭文件
posted @ 2019-07-06 21:43  Akiz  阅读(104)  评论(0编辑  收藏  举报