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)

     

原文地址:https://www.cnblogs.com/AYxing/p/8645024.html