• python-文件操作、函数小结


    文件处理相关

      1.编码问题

       a.请说明Python2与python3的默认编码是什么?

          python2——ASCII

          Python3——UTF-8

        b.为什么会出现乱码?乱码的情况有几种?

        软件运行终端解码(decode)方式与软件的编码(encode)方式不匹配。

        如:软件运行时zh_cn.GBK的编码方式,而软件在编写的时候使用UTF-8的方式编码

          c.如何进行编码转换?

          字符串在python内部是采用Unicode,

          其他编码先通过decode(‘字符串’,Unicode),然后再encode(‘字符串’,Utf-8)

        d. #-*-coding:utf-8-*-的作用?

          进行编码声明,写了这句,编码器就按这种方式进行解码。

        e.解释py2 bytes vs py3 bytes的区别

          这段还是需要再理解

        2.文件处理

         a.r和rb的区别?

          r——读文件

          rb——使用二进制方式读文件。

          b.解析下面三个参数作用

          open(f_name,'r',encoding="utf-8")

          f_name:文件名      r:   读文件     encoding='utf-8':用utf-8的编码方式读

    函数基础:

        1.解析闭包的概念

         一个封闭的包裹(闭),里面包含着自由变量(包)。

               引用了自由变量的函数。这个被引用的自由变量和这个函数一同存在,

        即使离开了创造它的环境也不例外。

    #写函数,计算传入数字参数的和。(动态传参)
    def
    func_sum(*args): re = 0 # 结果 for i in args: re = re + i return re res = func_sum(1, 2, 5, 7, 9) print(res)
    # 写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。
    str = 'ab bc'
    ls = ['', 1, 2, '']
    tu = (1, 3, 3, 4)
    
    
    def func_num(args):
        for index in args:
            if index == '':
                print('含有空内容')
            else:
                print(index)
    
    
    func_num(ls)
    #写函数,检查传入字典的每一个value的长度,如果大于2,
    #那么仅保留前两个长度的内容,并将新内容返回给调用者。
    dic = {"k1": "v1v1", "k2": [11, 22, 33, 44]}
    #PS:字典中的value只能是字符串或列表
    
    
    def func_dic(*args, **kwargs):
        new_dic = kwargs['dic']
        for k in kwargs['dic']:
            if len(kwargs['dic'][k]) > 2:
                new_dic[k] = kwargs['dic'][k][0:2]  # 符合要求的进行切片
        return new_dic
    
    
    dic2 = func_dic(dic=dic)
    print(dic2)
    #写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
    #
    例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃A’)] def card(): number = [] for i in range(2, 11): # for 生成 2-10个数字 number.append(i) number.extend(['J', 'Q', 'K', 'A']) # 将 J、Q、K、A 加入 #print(number) flower = ['红心', '草花', '方块', '黑桃'] card_number = [] for i in number: # 遍历数字 for j in flower: # 遍历花 card_number.append((i, j)) # 加入列表 return card_number print(card())
    # 写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}
    
    
    def max_min(*args):
        max = args[0]  # 1.先获得第0个元素
        min = args[0]
        for i in args:
            #print(i)
            if i > max:  # 2. 通过遍历把每个数进行匹配
                max = i
            if i < min:
                min = i
        #print('max:', max)
        #print('min:', min)
        return {'max': max, 'min:': min}
    
    
    print(max_min(1, 2, 3, -4, 100))
    #写函数,专门计算图形的面积
    
    #    其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积
    #    调用函数area(‘圆形’,圆半径) 返回圆的面积
    #    调用函数area(‘正方形’,边长) 返回正方形的面积
    #    调用函数area(‘长方形’,长,宽) 返回长方形的面积
    
    import math
    
    
    def area(name, *args):
    
        def round(r):
            return ('圆的面积为:', math.pi * r * r)
    
        def square(x):  # 正方形
            return ('正方形的面积为:', x ** 2)
    
        def rectangle(x, y):  # 长方形
            return ('长方形的面积为:', x * y)
        if name == '圆形':
            return round(*args)
        if name == '正方形':
            return square(*args)
        if name == '长方形':
            return rectangle(*args)
    
    
    print(area('圆形', 3))
    print(area('正方形', 3))
    print(area('长方形', 3, 2))
    #写函数,传入一个参数n,返回n的阶乘
    
    def calcu(x):
        res = 1
        for x in range(x, 0, -1):
            res = res * x
        return res
    
    
    res = calcu(7)
    print(res)
    #编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),
    # 要求登录成功一次,后续的函数都无需再输入用户名和密码
    
    #1.先建立一个在文件目录下userinfo.txt文件贴上如下内容{"name":"abc","password":"123"}
    def login(func):
        def wrapper(*args, **kwargs):
            username = input("account:").strip()
            password = input("password:").strip()
            with open('userinfo.txt', 'r', encoding='utf-8') as f:
                userinfo = f.read().strip(',')
                # print(userinfo)
                userinfo = eval(userinfo)
                print(userinfo)
                if username in userinfo['name'] and password in userinfo['password']:
                    print("success")
                else:
                    print("pass")
    
        return wrapper
    
    @login
    def name():
        print("hello")
    
    name()
    生成器和迭代器

    1.生成器和迭代器的区别?
        (还需要理清)
        生成器和迭代器 都是可以用for 循环来进行遍历的。
        迭代器——可以通过for循环进行遍历,使用next()方法进行迭代,在迭代的末尾,会引发stopIteration异常。
        生成器——生成器自身构成一个迭代器,每次迭代时使用yield返回值,下次调用时从上一次返回的值开始。
      2.生成器有几种方式获取value?
        两种:for循环获取 next获取
      3.通过生生成器写一个日志调用方法。
        后补

    内置函数

    #用map来处理字符串列表, 把列表中所有人都变成rich, 比方abc_rich
    
    name = ['abc', '123', 'haha', '你好']
    
    
    def func(x):
        return x + '_rich'
    
    
    ls = map(func, name)
    print(list(ls))
    #用filter函数处理数字列表,将列表中所有的偶数筛选出来
    
    num = [1, 3, 5, 6, 7, 8]
    
    
    def filt_num(x):
        if x % 2 == 0:
            return x
    
    
    ls2 = filter(filt_num, num)
    print(list(ls2)) 
    #如下,每个小字典的name对应股票名字,shares对应多少股,price对应股票的价格
    #计算购买每支股票的总价
    portfolio = [
    {'name': 'IBM', 'shares': 100, 'price': 91.1},
    {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    {'name': 'FB', 'shares': 200, 'price': 21.09},
    {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    {'name': 'ACME', 'shares': 75, 'price': 115.65}
    ]
    #第一种写法:
    
    
    def func_total(x):
        return {x['name']: x['shares']*x['price']}
    
    
    ls3 = map(func_total, portfolio)
    lis = list(ls3)
    
    print(lis[1]['AAPL'])
    
    #第二种写法:
    ls4 = map(lambda total: {total['name']: total['price']*total['shares']}, portfolio)
    print(list(ls4))
    f = filter(lambda d: d['price'] >= 100, portfolio)
    print(list(f))

    请分别介绍文件操作中不同的打开方式之间的区别:

    模式含义
    r  只读模式,打开时需要传入编码方式encoding='gbk'
    rb  二进制只读模式,在未知文件编码方式或类型时可以用二进制只读来打开
    r+  读写模式,表示可读写
    rb+  读写模式,表示二进制可读写
    w  写模式需传编码方式
    wb  二进制写模式
    w+  写模式
    wb+  二进制写模式
    a  追加模式
    ab  二进制追加
    a+

     写读模式,可写可读

    ab+

     

    # #有列表 li = ['alex', 'egon', 'smith', 'pizza', 'alen'], 请将以字母“a”开头的元素的首字母改为大写字母;
    li = ['alex', 'egon', 'smith', 'pizza', 'alen']
    # #第一种写法
    
    def cap(x):
        for i in x:
            if i[0] == 'a':
                print(i.capitalize())
            else:
                print(i)
    cap(li)
    
    #第二种写法
    
    for i in range(len(li)):
        if li[i][0] == 'a':
            li[i] = li[i].capitalize()
        else:
            continue
    print(li)

         

  • 相关阅读:
    有限元方法的核心思想
    由拉格朗日函数推导守恒定律
    codeforces 1181D
    gym 102222 J
    COJ#10C
    已然逝去の夏日泳装
    NC50 E
    codeforces 1147 C
    agc 037 C
    19牛客多校第十场G
  • 原文地址:https://www.cnblogs.com/AYxing/p/8645024.html
Copyright © 2020-2023  润新知