• 内置函数和文件读取


    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个字节处,之后的全删掉

  • 相关阅读:
    前端-【学习心得】-事件委托方法
    [方法] iOS时间戳的转换
    [封装] 修改NSString中部分字段的颜色
    Python3基础16——file对象测试数据的读写与操作
    Python3基础15—— 变量作用域
    Python3基础14——函数&内置函数
    Python3基础13——冒泡排序
    Python3基础12——while循环
    Python3基础11——打印三角形
    Python3基础10——切片(str和list)
  • 原文地址:https://www.cnblogs.com/harvey0414/p/10532931.html
Copyright © 2020-2023  润新知