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

 

posted @ 2020-12-25 18:25  虾米维生素  阅读(80)  评论(0编辑  收藏  举报