内置函数和文件读取

1、map函数

#首先我们定义我们自己的map
def my_map(func,array):     #定义的这个函数可以传入另一个指定的处理函数   
    ret = []                #定义一个空列表,可以将原来的值一个个经过处理后拿到这个新列表来
    for i in array:
        res=func(i)         #将每一个值传入指定的处理函数后赋值给res
        ret.append(res)     #此时将一个个处理后的res添加到我们的空列表ret中
    return ret              #当所有值都处理完后,此时ret不再是空列表,而是一个个我们需要的值组成的列表

li = [1,2,10,5,3,7]         #要求:将列表中每一个值+1得到一个新的列表

#此时我们调用属于自己创建的map函数
res = my_map(lambda x : x+1,li)
print(res)
#若直接使用真正的map函数则为
res = list(map(lambda x : x+1,li))
print(res)

#处理序列中的每个元素,得到的结果是一个‘列表’,该‘列表’元素个数及位置与原来一样

2、filter

#首先我们定义我们自己的filter
def my_filter(func,array):                 #定义的这个函数可以传入另一个指定的处理函数   
    ret = []                               #定义一个空列表,可以将原来的值一个个经过处理后拿到这个新列表来
    for i in array:
        if func(i):                        #用指定函数处理列表中的每个值
            ret.append(i)                  #此时将每个符合条件的i添加到我们的空列表ret中
    return ret                             #当所有值都处理完后,此时ret不再是空列表,而是一个个我们需要的值组成的列表

li = ['a_man','b_man','c_woman','d_man']   #要求:将列表中的有'man'的元素去掉得到新列表

#此时我们调用属于自己创建的filter函数
res = my_filter(lambda x : endswith('woman'),li)
print(res)
#若直接使用真正的filter函数则为
res = list(map(lambda x : endswith('woman'),li))
print(res)

#遍历序列中的每个元素,判断每个元素得到布尔值,如果是True则留下来

3、reduce

#首先我们定义一个自己的reduce函数
def my_reduce(func,array,init): #可以传入函数、值和参数(默认None)
    if init is None:
        res = array.pop(0)      #如果参数是默认,把列表的第一个值拿出来,此时res中没有第一个值
    else:
        res = init              #如果有参数,把它赋值给res
    for i in array:
        res = func(res,i)       #将每一个i和res放入处理函数中,得到res
    return res

li = [1,2,100]                  #要求:将每个数相乘,并且再乘10

#此时我们调用自己的reduce函数
res = my_reduce(lambda x,y : x*y,li,10)
print(res)
#若直接使用真正的reduce函数
from functools import reduce
res = reduce(lambda x,y : x*y,li,10)
print(res)

4、divmod

#设置页码和每页内容
#divmod('一共有多少内容','每页可以填多少内容')
例如:要求做网页内容,每页最多5条内容,一共21条内容
print(divmod(21,5))
输出:(4,1)            #其中4表示4页填满,1表示还多出来一条内容,所以需要5页

5、hash

#可hash的数据类型即不可变数据类型,不可hash的数据类型即可变数据类型
name='alex'
print(hash(name))
print(hash(name))
-7665267407493081588         #hash值
-7665267407493081588

可以用来检测下载下来的文件是否被改动或者传入木马之类,只要有改动hash值将会改变

6、zip(拉链函数)、sort 以及 max和min

print(list(zip(('a','n','c'),(1,2,3))))
print(list(zip(('a','n','c'),(1,2,3,4))))
print(list(zip(('a','n','c','d'),(1,2,3))))
输出:
[('a', 1), ('n', 2), ('c', 3)]
[('a', 1), ('n', 2), ('c', 3)]
[('a', 1), ('n', 2), ('c', 3)]
#所得值会一一对应产生新的元组,若剩下无另一半的值,将会被消除

p={'name':'alex','age':18,'gender':'none'} #传入字典
print(list(zip(p.keys(),p.values())))
print(list(p.keys()))
print(list(p.values()))
输出:
[('name', 'alex'), ('age', 18), ('gender', 'none')]
['name', 'age', 'gender']
['alex', 18, 'none']
print(list(zip(['a','b'],'12345')))
输出:[('a', '1'), ('b', '2')]
l=[1,3,100,-1,2]
print(max(l))
print(min(l))
100
-1
#若是在字典自作比较
age_dic={'az_age':18,'bd_age':20,'xa_age':100,'hi_age':30}
print(max(age_dic))
xa_age               #默认比较的是key,此时比较的是字母排序大小,从第一个开始比,若第一个出结果则直接比较完成,以此类推
print(max(age_dic.values())) #此时比较的是value,但并不能获取该value的key
#则用zip:
li = zip(age_dic.values(),age_dic.keys())  #将value放在前面,则可以同时得到最大vlaue的key值
print(list(max(li)))
[100, 'xa_age']

#min的用法相同

不同类型之间不能进行比较

排序,本质上是比大小
l=[3,2,1,5,7]
l1=[3,2,'a',1,5,7]
print(sorted(l))
print(sorted(l1))       #报错
[1, 2, 3, 5, 7]

#按value排序
people=[
    {'name':'a','age':1000},
    {'name':'w','age':10000},
    {'name':'y','age':9000},
    {'name':'l','age':18},]

print(sorted(people,key = lambda dic :dic['age'] ))

name_dic={
    'abyuanhao': 11900,
    'alex':1200,
    'wupei':300,
}
print(sorted(name_dic))                 #默认用key排序

print(sorted(name_dic,key=lambda key:name_dic[key]))    #可以通过value排序但只能得到对应key

print(sorted(zip(name_dic.values(),name_dic.keys())))   #用zip可以得到value与key
age_dic={'az_age':18,'bd_age':20,'xa_age':100,'hi_age':30}
print(max(age_dic))
li = zip(age_dic.values(),age_dic.keys())
print(list(max(li)))
people=[
    {'name':'a','age':1000},
    {'name':'w','age':10000},
    {'name':'y','age':9000},
    {'name':'l','age':18},]
max(people,key=lambda dic:dic['age'])
print(max(people,key=lambda dic:dic['age'])) #用了匿名函数取age的最大值
{'name': 'w', 'age': 10000}

文件的读取和写入

f=open('sss',encoding='utf-8')   #打开一个系统文件,并声明编码,否则会报错,windows默认gbk
data=f.read()
print(data)
f.close()                        #记得关闭

打开模式:

r只读,r+读写(先把文件读到内存里,才可以在内存里进行操作),不创建,a为添加到最后一行(访客列表)

w新建只写,w+新建读写,二者都会将文件内容清零

(以w方式打开,不能读出。w+可读写)

w+与r+区别:

r+:可读可写,若文件不存在,报错;w+: 可读可写,若文件不存在,创建

#test文件:asb
          123
f=open('test','r',encoding='utf-8')    #假设test是系统中的一个文件
data=f.read()                          #将他设置为只读
print(data)                            #此时就可以查看该文件了
f.readable()                           #判断文件是否为只读
print(f.readline())                    #打印文件第一行       
print(f.readline())                    #打印文件第二行
print(f.readlines())                   #打印每一行
f.close()

#readline是逐行打印,逐行跳转
#readlines是打印所有,即直接跳转到f.close()

f=open('test','w',encoding='utf8')
#f.read()                              #该行会报错,因为是w模式
f.write('11111111
'))                 #记得要换行符
f.write('222222222
')
f.write('333
4444
555
')
f.writable()
f.writelines(['555
','6666
'])
#f.writelines(['555
','6666
',1])    #文件内容是字符串,所以应该用write
f.close()
#修改(不存在修改,全都是覆盖)
f1 = open('xxx','r',encoding='gbk')    #此时文件只读
data = f1.readlines()                  #拿到data并存下来了,data是xxx文件的第一行
f1.close()                             #拿到data,即可关闭

f2 = open('xxx','w',encoding='gbk')    #此时文件只写
f2.write(data[0])                      #将data通过索引,字符串用write。此操作只保留第一项'asb'
dst_f.close()

write用于字符串,writelines用于列表 

with

#可以不用手动close,自动关闭
with open(test,'w',encoding = 'utf8') as f:
    f.write('...')
#打开多个
with open(test1,'r',encoding = 'gbk') as f1,
open('test2','w',encoding='gbk') as f2:
    data = f1.read()
    f2.write(data)
f=open('a.txt')
print(f.encoding) #查看文件编码

 b模式下打开文件(读的就是原生二进制)

1、以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

2、 读出来的结果说明: 是windows下的“回车键”,而linux中的回车键是“ ”,读取时会多2个字节的光标

3、'字符串'——encode——bytes 称为编码(需要指定字符编码)x.encode('utf-8'),bytes——decode——'字符串' 称为解码

4、文件不仅仅有文本类型,还有图片、视频等,而图片、视频等都是使用二进制的方式进行处理的,因此需要使用b的方式去处理,可用于处理任何类型的文件,可以跨平台

5、f.flush()

对暂存在内容中的内容进行刷入硬盘内存保存

这个常见于pycharm、word等文档软件,每隔一定时间对文档的内容进行保存处理

6、f.tell()

读取光标当前位置,注意windows的换行符是/r/n

7、f=open('b.txt','r',encoding='utf-8',newline='') #读取文件中真正的换行符号

python会统一自动处理成/n

8、seek()

文件asd为:
你好
123

f = open('asd','r',encoding = 'utf-8',newline = '') 
f.readline()
f.seek(1)
print(f.tell())         #会报错,以为汉字占三个字节,此时移动1一个字节,无法取‘部分你’
f.seek(3)
print(f.tell())         #此时光标在1
print(f.read())         #会读出‘你’以后的内容
##默认连续两次的seek不会叠加光标位置,每次都会返回到0的位置重新开始移动
##这两种模式必须以b模式打开
f.seek(3,1)             #此时不会重新返回0开始,而是从上次的位置开始
f.seek(-3,2)            #倒序,光标从最后一位倒着移动,此时必须###是负数
#读取大文件的最后一行
f=open('d.txt','rb')

for i in f:
    offs=-3                            #偏移量,用于大概估算该文件的字节
    n=0
    while True:
        f.seek(offs,2)
        data=f.readlines()
        if len(data) > 1:
            print('最后一行',data[-1])
            break
        offs*=2

9、read()

只有它按字符不按字节走

文件asd为:
你好
123
data = f.read(4)
print(data)
输出:你好  (后面空的两个是/r/n)

10、truncate()

首先是在文件。

f.truncate(10)     #截取到第10个字节处,之后的全删掉

原文地址:https://www.cnblogs.com/harvey0414/p/10532931.html