Python学习笔记-基础知识二
- 关于列表和字典的两个面试题
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)
- 数据类型转换问题
# 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 绝对路径 从磁盘根目录开始一直到文件名
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()获取当前光标在什么位置
- 小数据池和代码块
代码块
前提条件 在同一个代码块内
机制内容 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 默认驻留
小数据池驻留的优点:
能够提高一些字符串 整数在处理人物在时间和空间上的性能; 需要值相同的字符串 整数的时候 直接从'池'里拿来用 避免频繁的创建和销毁 提升效率 节约内存
- 深浅拷贝
浅拷贝:
仅仅是在内存中开辟了一个空间存放新的列表 但是列表中的元素还是延用之前列表的元素
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)