Python学习笔记-基础知识二

  1. 关于列表和字典的两个面试题
1 # 删除列表索引为奇数的元素
在循环一个列表时的过程中,如果你要改变列表的大小(增加值,或者删除值),那么结果很可能会出错或者报错
思路1 使用一个空列表存取需要删除的元素 遍历这个列表 对原始列表进行删除操作(这个思路有问题 问题在于如果奇偶存在相同元素 会报错
思路2 使用空列表存取需要删除的元素索引 遍历列表 直接对源列表按照索引删除 
def del_func():
    l1 = [11, 22, 33, 44, 55]
    lst = []
    for i in range(len(l1)):
        if i % 2 != 0 :
            lst.append(i)
    for i in lst:
        l1.pop(i)
    print(l1)
2 # 请将字典中所有键带k元素的键值对删除
# 在循环一个字典的过程中,不要改变字典的大小(增,删字典的元素),这样会直接报错
思路 与上面列表相似 使用一个中间空字典
def del_dict():
    dic = {'k1':'太白','k2':'barry','k3': '白白', 'age': 18}
    m_dic = {}
    for k,v in dic.items():
        if 'k' in k:
            m_dic.setdefault(k,v)
    for k in m_dic.keys():
        dic.pop(k)
    print(dic)
  1. 数据类型转换问题
# int <-> bool <-> str
# int ---> bool
i = 100
print(bool(i))  # True  # 非零即True
# bool ---> int
t = True
print(int(t))  # 1  True --> 1
# int ---> str
i1 = 100
print(str(i1))  # '100'
# str ---> int  # 全部由数字组成的字符串才可以转化成数字
s1 = '90'
print(int(s1))  # 90
# str ---> bool
s1 = '太白'
s2 = ''
print(bool(s1))  # True 非空即True
# bool ---> str
t1 = True
print(str(True))  # 'True'

# str <-> list
# str ---> list
s1 = 'alex 太白 武大'
print(s1.split())
# list ---> str
l1 = ['alex', '太白', '武大']
print(' '.join(l1))

# list <-> set
# list ---> set
s1 = [1, 2, 3]
print(set(s1))
# set ---> list
set1 = {1, 2, 3, 3,}
print(list(set1))  # [1, 2, 3]

# str <-> bytes
# str ---> bytes
s1 = '太白'
print(s1.encode('utf-8'))  # b'\xe5\xa4\xaa\xe7\x99\xbd'
# bytes ---> str
b = b'\xe5\xa4\xaa\xe7\x99\xbd'
print(b.decode('utf-8'))  # '太白'

# 所有的数据类型都能转换成bool类型
  1. 文件操作
文件路径
1 绝对路径 从磁盘根目录开始一直到文件名
2 相对路径 同一个文件夹下的文件 上一级文件夹加 ../

with open('t.txt',mode='r',encoding='utf-8') as f1:
	content = f.readline()
文件操作
	1 read() 把文件中的所有内容都读出来
    2 read(n) 按照字符读取指定数目
    3 readline() 每次读取一行 读取出来的每一行后面有一个换行符 \n
    4 readlines() 返回一个列表 每个元素对应每一行
    5 for循环 每次读取一行的数据
其他操作
	1 read(n) 
        1. 文件打开方式为文本模式时,代表读取n个字符 
        2. 文件打开方式为b模式时,代表读取n个字节
    2 seek() 
        seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数
    3 tell()
        使用tell()获取当前光标在什么位置
  1. 小数据池和代码块
代码块
	前提条件 在同一个代码块内
	机制内容 Python在同一个代码块执行初始化对象的命令时 会检查这个值是否已经存在 如果存在 将其重用
	适用对象 int(float str bool
	对象的具体细则
	    int(float : 任何数字在同一代码块下都会复用
	    bool: True和False在字典中会以1和0的方式存在 并且复用
	    str: 几乎所有的字符串都符合缓存机制
	        1 非乘法得到的字符串都满足代码块的缓存机制
	        2 乘法得到的分为两种情况
	            1 乘数为1 任何字符串都满足缓存机制
	            2 乘数大于等于2 仅包含大小写字母 数字 下划线 总长度小于等于20 满足代码块缓存机制
	代码块缓存机制的优点:
	    能够提高一些字符串 整数在处理人物在时间和空间上的性能;需要值相同的字符串,整数的时候,直接从字典中取出复用,避免频繁的创建和销毁,提升效率,节省内存
小数据池
	前提条件: 在不同的代码块中
	机制内容: 
	    1 Python自动将-5~256的整数进行了缓存 当对变量赋予这些整数的时候 不会重新创建对象 而是使用已经创建好的缓存对象
	    2 Python会将一定规则的字符串在字符串驻留池中 创建一份 当对变量赋予这些字符串时 不会重新创建对象 而是使用已经创建好的缓存对象
	使用对象 int(float str bool
	对象的具体细则
	    1 int 对于整数来说 小数据池的范围是 -5~256 
	    2 str 
	        1 字符串长度为0或1 默认采用驻留机制(小数据池
	        2 字符串长度大于1 且只含有字母 数字 下划线 才会默认驻留 
	        3 乘法得到的字符串
	            1 乘数为1时 仅包含大小写字母 数字 下划线 默认驻留; 含其他字符 长度小于等于1 默认驻留; 含其他字符 长度大于1 默认驻留
	            2 乘数大于2时 仅包含大小写字母 数字 下划线 总长度小于等于20 默认驻留
	        4 指定驻留
	        from sys import intern
	        a = intern('hello!@'*20)
	        b = intern('hello!@'*20)
	        print(a is b)
	        #指定驻留是你可以指定任意的字符串加入到小数据池中,让其只在内存中创建一个对象,多个变量都是指向这一个字符串。
	    3 bool True和False 默认驻留
小数据池驻留的优点:
    能够提高一些字符串 整数在处理人物在时间和空间上的性能; 需要值相同的字符串 整数的时候 直接从'池'里拿来用 避免频繁的创建和销毁 提升效率 节约内存
  1. 深浅拷贝
浅拷贝:
	仅仅是在内存中开辟了一个空间存放新的列表 但是列表中的元素还是延用之前列表的元素
	l1 = [1, '太白', True, (1,2,3), [22, 33]]
	l2 = l1.copy()
	
深拷贝:
	新列表的地址是在内存中重新创建的 列表中的可变数据也是重新创建的 列表中的不可变数据是延用之前的
	import copy
	l1 = [1, 'alex', True, (1,2,3), [22, 33]]
	l2 = copy.deepcopy(l1)