map、filter、reduce函数、字典排序、eval、日志读写、大文件读取、
匿名函数:lambda x:x+1
map函数是将可迭代对象逐一计算,得到的还是一个与输入序列长度一样的可迭代对象
filter函数是将可迭代对象按某种条件进行筛选,得到符合条件的序列(元素个数小于等于原始元素个数)
reduce函数是将可迭代对象按某种算法合成为一个计算结果(最后只有一个值)
li = [1,2,3,4]
map函数:map(处理方法,可迭代对象),返回值也是可迭代对象(可用于循环、可用list转换显示)
li_s = map(lambda x:x+1,li) # map函数生成的是一个迭代器对象(f循环取值的时候只可迭代一次)
print(list(li_s)) # 可迭代对象需要使用list转换为列表才能显示出来
filter函数:filter(处理方法,可迭代对象),返回值也是可迭代对象
print(list(filter(lambda x:x>2,li))) filter作为过滤函数,需要函数方法返回布尔值,函数方法支持not操作,布尔值为True的会被保留)
reduce函数:reduce(处理方法,可迭代对象,初始值)
from functools inport reduce
print(reduce(lambda x,y:x*y,li,2) 初始值为2,计算2与li里各元素连乘的结果
字典排序:
dic_a={1:153,2:152,3:100,4:200}
print(sorted(dic_a,key=lambda key:dic_a[key])) sorted从小到大,按value排序,返回key
print(sorted(dic_a)) 按key排序(字典默认用key排序)
print(sorted(zip(dic_a.values(),dic_a.keys())) 按值排序,同时取出值和键
eval(“123+254‘) 将str转换为其本身的格式
__import__("test") 导入字符串形式的py文件 ,同import test
open()函数打开文件的编码格式默认是使用的系统编码(Windows的默认编码是gbk),所有通常需要使用encoding=utf-8
open 读取出来的全都是字符串,同理,写入的也只能是字符串
以读写模式打开直接写会写在最前边(指针默认在最前面)
with open("a.txt") as a_f, open("b.txt") as b_f: 支持连续编写
日志读写:
日志会随着时间推移,不断增多,当日志太多的时候就不便于查看最新的日志内容,
为此需要有个能将句柄移动到最后部分(再读取剩余数据)的方法: seek()
(注意:seek是以字节的方式移动句柄,utf8编码一个汉字占3个字节,gbk占2个字节,Windows默认使用gbk)
seek(10) 表示将句柄移动到第10个字节的位置
seek(-10, 2)表示将句柄移动至倒数第10个字节的位置(注意:倒着取的字节数需要设置为负数)
seek(10, 1)表示从当前位置将句柄移动到后10个字节的位置(用的少)
tell() 返回句柄在文件中的位置
为便于查看和筛选日志,每次记录的时候都需要带上日期和时间
循环大文件的推荐方式:
f = open("a.log","rb") seek 是以字节的方式移动句柄的(不能再设置二进制转化为字符的编码格式)
for i in f: 以单行的形式读取文件(f.readlines是将整个数据全部读出来形成列表放在内存中)
offs = -100 字节偏移量(估算一行需要偏移的字节数)
while True:
f.seek(offs, 2) 将句柄偏移到-100个字节的位置
info = f.readlines() 将句柄之后的数据(按行)读取成列表
if len(info) > 2: 读取到的数据超过一行
print(info[-1].decode('utf-8")) 将最后一行编码成utf8格式打印出来
break
else:
offs *= 2