码迷,mamicode.com
首页 > 编程语言 > 详细

python作业03-文件操作&函数(未完成)

时间:2018-03-04 14:39:29      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:move   rectangle   生成器   user   none   value   括号   生成器和迭代器   print   

一、文件处理相关

1、编码问题   

  (1)请说明python2 与python3中的默认编码是什么?
答:Python2是ascii  python3是utf-8
    (2)为什么会出现中文乱码?你能列举出现乱码的情况有哪几种?
答:中文出现乱码都是由于文件编码导致的。
    (3)如何进行编码转换?
答:对文件先decode为unicode,再encode为需要转换的编码。
    (4)#-*-coding:utf-8-*- 的作用是什么?
答:告诉解释器这个文件的编码格式是utf-8
    (5)解释py2 bytes vs py3 bytes的区别
答:python3把字符串的编码改成了unicode, 还把str和bytes做了明确区分, str就是unicode格式的字符,bytes是单纯二进制。
    在python2里,bytes == str

2、文件处理
    (1)r和rb的区别是什么?
答:r是文本只读模式
    rb:二进制只读模式,无法指定encoding,因为在该模式下数据读到内存里直接是bytes格式,如要查看内容还需手动decode
    (2)解释一下以下三个参数的分别作用
     open(f_name,‘r‘,encoding="utf-8")
答:f_name将打开的当前目录文件名,r:文本只读模式,encoding="utf-8":指定打开文件为utf-8编码模式。

二、函数基础

1、写函数,计算传入数字参数的和。(动态传参)

def func(*args):
    list1 = []
    sum_data = 0
    for i in args:
        list1.append(i)
        sum_data += i
    print(list1)
    print(sum_data)

func(313, 213, 12, 1234, 453, 56)

2、写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作

def file_modify(filename, old, new):
    import os
    f = open(filename, mode=r+, encoding=utf-8)
    new_f = open(filename+"_bak", mode=w, encoding=utf-8)
    for line in f:
        if old in line:
            line = line.replace(old,new)
        new_f.write(line)
    os.remove(filename)
    os.rename(filename+"_bak",filename)

file_modify(aaaa.txt, ddd, goodman)

3、写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。

def func(args):
    n = 0
    for i in args:
        if i == "":
            n += 1
    print("有%s个空内容"%n)

func((1, ‘‘, 2, 44, ‘‘, 12))

4、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

  dic = {"k1": "v1v1", "k2": [11,22,33,44]}
      PS:字典中的value只能是字符串或列表

def func(args_dic):
    for i in args_dic:
        if len(args_dic[i]) > 2:
            item = args_dic[i][0:2]  # 前两项
            args_dic[i] = item
    print(args_dic)

dic = {"k1": "v1v1", "k2": [11,22,33,44]}
func(dic)
# {‘k1‘: ‘v1‘, ‘k2‘: [11, 22]}

5、解释闭包的概念
答:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。

三、函数进阶

1、写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
    例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃A’)]

def poker():
    a = [红心, 草花, 方片, 黑桃]
    b = [2, 3, 4, 5, 6, 7, 8, 9, 10]
    c = [J, Q, K, A]
    li = []
    for i in b:
        for j in a:
            item = (j,i)
            li.append(item)
    for m in c:
        for n in a:
            item2 = (n+m)
            li.append(item2)
    print(li)
    print(len(li))

poker()

2、写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}
    例如:min_max(2,5,7,8,4)
    返回:{‘max’:8,’min’:2}

def min_max(*args):  # dict形式
    li = []
    for i in args:
        li.append(i)
    li.sort()
    dic = {max:li[-1], min:li[0]}
    print(dic)

min_max(2,5,7,8,4)
# 输出:{‘max‘: 8, ‘min‘: 2}

3、写函数,专门计算图形的面积
    其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积
    调用函数area(‘圆形’,圆半径) 返回圆的面积
    调用函数area(‘正方形’,边长) 返回正方形的面积
    调用函数area(‘长方形’,长,宽) 返回长方形的面积

def area(type, *args):

    def rectangle(length, wide):
        return "长方形面积", length*wide

    def square(length):
        return "正方形面积", length**2

    def circlar(radius):
        import math
        return "圆形面积", math.pi*(radius**2)
    if type in locals():
        return eval(type)(*args)
print(area(rectangle, 133, 4))
print(area(circlar, 20))
print(area(square, 10))

4、写函数,传入一个参数n,返回n的阶乘
    例如:cal(7)
    计算7*6*5*4*3*2*1

def cal(n):
    item = 1
    if int(n) == n:
        li = range(n+1)
        for i in li:
            if i == 0:
                pass
            else:
                item = item*i
        print(item)
    else:
        return "%s不是整数"%n

cal(3)

# 法二:
def cal(n):
    result=1
    for i in range(n, 0, -1): # 倒序
        result=result*i
    return result

print(cal(7))

5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码

user_db = {
    hqs:123,
    susiff:123,
    guangfa:123
}

with open(db.txt, w, encoding=utf-8) as f:
    f.write(str(user_db))
login_db = {user: None, status: False}
db_path = rdb.txt

def login(func):
    def inner(*args,**kwargs):
        if login_db[user] and login_db[status]:
            res = func(*args, **kwargs)
            return res
        user = input(input user:)
        passwd = input(input passwd:)
        with open(db_path, r, encoding=utf-8) as f:
            user_db2 = eval(f.read())
        if user in user_db2 and passwd == user_db2[user]:
            print(login ok)
            login_db[user] = user
            login_db[status] = True
            res = func(*args, **kwargs)
            return res
        else:
            print(login error)
    return inner  # 加括号执行,不加括号返回内存地址

@login
def home():
    print("首页".center(40,-))

@login
def america(name):
    print("欧美专区".center(40,-))


home()
america(hqs)
四、生成器和迭代器

1、生成器和迭代器的区别?
可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator).
在Python中,可以在循环过程中不断推算后续元素,这种一边循环一边计算的机制,称为生成器(generator)。
生成器是迭代器的一种:
    1、生成器都是迭代器对象,但list\dict\str虽然是可迭代对象,但不是迭代器。
    2、把list\dict\str等可迭代对象变成迭代器可以使用iter()函数
2、生成器有几种方式获取value?
next:唤醒生成器并继续执行
send("stop"):
    1.唤醒并继续执行
    2.发送一个信息到生成器内部

3、通过生成器写一个日志调用方法, 支持以下功能

  • 根据指令向屏幕输出日志
  • 根据指令向文件输出日志
  • 根据指令同时向文件&屏幕输出日志
  • 以上日志格式如下

2017-10-19 22:07:38 [1] test log db backup 3
2017-10-19 22:07:40 [2]    user alex login success 
#注意:其中[1],[2]是指自日志方法第几次调用,每调用一次输出一条日志

 

 

python作业03-文件操作&函数(未完成)

标签:move   rectangle   生成器   user   none   value   括号   生成器和迭代器   print   

原文地址:https://www.cnblogs.com/xiugeng/p/8504327.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!