本节对一些 Python 易混淆的操作进行对比。
1.1 有放回随机采样和无放回随机采样
1.2 lambda 函数的参数
1.3 copy 和 deepcopy
复制和变量别名结合在一起时,容易混淆:
对别名的修改会影响原变量,(浅)复制中的元素是原列表中元素的别名,而深层复制是递归地进行复制,对深层复制的修改不影响原变量。
1.4 == 和 is
1.5 判断类型
1.6 字符串搜索
1.7 List 后向索引
这个只是习惯问题,前向索引时下标从0开始,如果反向索引也想从0开始可以使用~。
2.1 读写 CSV 文件
注意,当 CSV 文件过大时会报错:_csv.Error: field larger than field limit (131072),通过修改上限解决
csv 还可以读以 分割的数据
2.2 迭代器工具
itertools 重新定义了很多迭代器工具,例如子序列工具:
序列排序:
多个序列合并:
2.3 计数器
计数器可以统计一个可迭代对象中每个元素出现的次数。
2.4 带默认值的 Dict
当访问不存在的 Key 时,defaultdict 会将其设置为某个默认值。
2.5 有序 Dict
3.1 输出错误和警告信息
向标准错误输出信息
输出警告信息
控制警告消息的输出
3.2 代码中测试
有时为了调试,我们想在代码中加一些代码,通常是一些 print 语句,可以写为:
一旦调试结束,通过在命令行执行 -O 选项,会忽略这部分代码:
3.3 代码风格检查
使用 pylint 可以进行不少的代码风格和语法检查,能在运行之前发现一些错误
3.4 代码耗时
耗时测试
测试某代码块耗时
代码耗时优化的一些原则
4.1 argmin 和 argmax
argmax同理。
4.2 转置二维列表
4.3 一维列表展开为二维列表
#coding=utf-8records = []
record = {}
with open("data.txt") as f:
while True:
line = f.readline()
if not line:
if len(record)!= 0: records.append(record)
break
field = line[line.find(":") + 1:].strip()
if line.startswith("ScopeId"):
if len(record)!= 0: records.append(record)
record = {}
record["ScopeId"] = field
elif line.startswith("Name"):
record["Name"] = field
elif line.startswith("Free"):
record["Free"] = field
elif line.startswith("InUse"):
record["InUse"] = field
elif line.startswith("PercentageInUse"):
record["PercentageInUse"] = field
# 设置缺省项
for r in records:
r.setdefault("InUse", 0)
r.setdefault("PercentageInUse", 0)
r.setdefault("Name", "")
r.setdefault("Free", 0)
print records
假如你的5文件在同一个文件夹中,路径为pathfile_name_list = ['usa', 'china', 'uk', 'canada', 'japan']
data_list = []
for i in file_name_list:
data_list.append(pd.read_excel(path + '/%s.xlsx' % i))
data = pd.concat(data_list)