• 第二模块:函数编程 第1章-练习题


    文件处理相关:

    1. 编码问题

    1) 请说明python2与python3中的默认编码是什么?

      python2中默认编码是ASCII码

      python3中默认编码是UTF-8

    2)为什么会出现中文乱码?你能列举出现乱码的情况有哪几种?

      中文乱码就是因为存的编码和展现的编码不一致造成的,不同的编码是去不同的编码表里去匹配的,就会出现匹配出来的字符不符合。

      乱码的情况:

      a. 存的是GBK的编码,展现的时候是使用UTF-8编码或其他编码。

    3)如何进行编码转换?

      encode 和 decode

    s = "大中国"  # 默认编码是utf-8
    print(s)  # 输出:大中国
    s1 = s.encode("GBK")  # 将编码转为GBK
    print(s1)  # 输出:b'xb4xf3xd6xd0xb9xfa'
    s2 = s1.decode("gbk", "utf-8")  # 将s1由gbk转为utf-8
    print(s2)  # 输出:大中国

    4)#-*-coding:utf-8-*- 的作用是什么?

      表明使用utf-8编码进行解释。

    5)解释py2 bytes vs py3 bytes的区别:

      py2的 bytes = str

      py3的bytes就是bytes

    2. 文件处理

    1)r 和 rb 的区别是什么?

      r 以只读的模式使用文件

      rb 以只读的二进制模式使用文件

    2)解释一下以下三个参数的分别作用  

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

      第一个参数:操作的文件路径

      第二个参数:文件的打开方式

      第三个参数:使用什么编码来打开文件

    函数基础:

    '''
    1. 写函数,计算传入数字参数的和。(动态传参)
    '''
    
    def my_sum(*args):
        sum_num = 0
        for i in args:
            sum_num += i
        print(sum_num)
    
    my_sum(12, 34, 45, 353, 435)
    '''
    2. 写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作
    '''
    
    def change_data(filename, old_content, new_content):
        f = open(filename, "r+", encoding="utf-8")
        data = f.read()
        f.seek(0)
        f.write(data.replace(old_content, new_content))
        f.close()
    
    
    change_data("test.txt", "明月", "彩霞")
    '''
    3. 写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。
    '''
    
    def check_space(object):
        for i in object:
            if str(i).isspace():
                print(">>>空格")
            else:
                print("正常")
    
    
    s = "aaaa  b  df sdfsafhnsd dfudf"
    l = ["12", 34, 324324, 4, 4, "sad   fdsafa"]
    t = ("12", 34, 324324, 4, 4, "sad   fdsafa")
    check_space(s)
    check_space(l)
    check_space(t)
    '''
    4. 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
    
    dic = {"k1": "v1v1", "k2": [11,22,33,44]}
    PS:字典中的value只能是字符串或列表
    '''
    
    def check_dict(dic):
        print(dic)
        for i in dic:
            if len(dic[i]) > 2:
                dic[i] = dic[i][0:2]
        print(dic)
    
    
    dic = {"k1": "v1v1", "k2": [11, 22, 33, 44]}
    check_dict(dic)

    5. 解释闭包的概念。

      使用闭包可以在函数外部对函数内嵌套的函数进行调用。

    函数进阶:

    '''
    1. 写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
    例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃A’)]
    '''
    
    
    def poker():
        li = ["红心", "方块", "草花", "黑桃"]
        t_li = []
        for index, i in enumerate(li):
            n = 1
            while n <= 13:
                tt = ()
                if n == 1:
                    tt = (li[index], "A")
                elif n == 11:
                    tt = (li[index], "J")
                elif n == 12:
                    tt = (li[index], "Q")
                elif n == 13:
                    tt = (li[index], "K")
                else:
                    tt = (li[index], n)
                t_li.append(tt)
                n += 1
        print(t_li)
    
    
    poker()
    '''
    2. 写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}
    
    例如:min_max(2,5,7,8,4)
    返回:{‘max’:8,’min’:2}
    '''
    
    
    def min_max(*args):
        d = {}
        d["max"] = max(args)
        d["min"] = min(args)
        print(d)
    
    
    min_max(12, 35, 6, 3, 234, 3435, 324)
    '''
    3. 写函数,专门计算图形的面积
    
    其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积
    调用函数area(‘圆形’,圆半径) 返回圆的面积
    调用函数area(‘正方形’,边长) 返回正方形的面积
    调用函数area(‘长方形’,长,宽) 返回长方形的面积
    def area():
        def 计算长方形面积():
            pass
    
        def 计算正方形面积():
            pass
    
        def 计算圆形面积():
            pass
    '''
    
    
    def area(type, *args):
        def roundness(*args):
            area_r = 3.14 * (args[0] ** 2)
            print("圆的面积:", area_r)
    
        def rectangle(*args):
            area_r = args[0] * args[1]
            print("长方形的面积:", area_r)
    
        def square(*args):
            area_s = args[0] * args[0]
            print("正方形的面积:", area_s)
    
        if type == "圆形":
            return roundness(*args)
        if type == "正方形":
            return square(*args)
        if type == "长方形":
            return rectangle(*args)
    
    
    area("圆形", 23)
    area("长方形", 23, 56)
    area("正方形", 10)
    '''
    4. 写函数,传入一个参数n,返回n的阶乘
    
    例如:cal(7)
    计算7*6*5*4*3*2*1
    '''
    
    
    def cal(n):
        if n == 0:
            return 1
        return n * cal(n - 1)
    
    
    print(cal(7))
    '''
    5. 编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码
    '''
    
    login_status = False
    
    
    def login(func):
        def inner():
            account = get_account_from_file()
            global login_status
            if login_status == False:
                name = input("name:")
                pwd = input("pwd:")
                print(account)
                if name == account["username"] and pwd == account["password"]:
                    print("登录成功")
                    login_status = True
                else:
                    print("登录失败")
            if login_status:
                print("认证已通过。。")
                func()
    
        return inner
    
    
    def get_account_from_file():
        f = open("account5.txt", "r", encoding="utf-8")
        data = eval(f.read())
        f.close()
        return data
    
    
    @login
    def run():
        print("跑....")
    
    
    @login
    def walk():
        print("走....")
    
    
    run()
    walk()

    生成器和迭代器

    1. 生成器和迭代器的区别?

      生成器是迭代器的一种。

    2. 生成器有几种方式获取value?

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

      

    内置函数

    '''
    1. 用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb
    
    name=['alex','wupeiqi','yuanhao','nezha']
    '''
    name = ['alex', 'wupeiqi', 'yuanhao', 'nezha']
    name = list(map(lambda x: x + "_sb", name))
    print(name)
    '''
    2. 用filter函数处理数字列表,将列表中所有的偶数筛选出来
    
    num = [1,3,5,6,7,8]
    '''
    num = [1, 3, 5, 6, 7, 8]
    num = list(filter(lambda x: x % 2 == 0, num))
    print(num)
    '''
    3. 如下,每个小字典的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}
    ]
    计算购买每支股票的总价
    
    用filter过滤出,单价大于100的股票有哪些
    '''
    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}
    ]
    
    for d in portfolio:
        print(d["name"], "股票总价:", d["shares"] * d["price"])
    
    print("单价大于100的有:")
    print(list(filter(lambda d: d["shares"] > 100, portfolio)))

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

    r:只读模式

    rb:二进制只读模式

    r+:可读可写模式,先读后写

    w:只写模式,覆盖写

    wb:二进制写模式

    w+:可读可写模式,先写后读

    wb+:二进制模式

    a:追加模式

    ab:二进制追加模式

    a+:

    ab+:

    '''
    5、有列表 li = ['alex', 'egon', 'smith', 'pizza', 'alen'], 请将以字母“a”开头的元素的首字母改为大写字母;
    '''
    li = ['alex', 'egon', 'smith', 'pizza', 'alen']
    new = []
    for i in li:
        if i.startswith("a"):
            i = i.replace(i, "A" + i[1:])
        new.append(i)
    print(new)

    6、有如下程序, 请给出两次调用show_num函数的执行结果,并说明为什么:

    num = 20
    def show_num(x=num):
    print(x)
    show_num()
    num = 30
    show_num()

      执行结果为:

      20

      20

      因为:根据作用域查找顺序,num=30在函数声明之后,函数无法调用到。

    '''
    7. 有列表 li = ['alex', 'egon', 'smith', 'pizza', 'alen'], 请以列表中每个元素的第二个字母倒序排序;
    '''
    li = ['alex', 'egon', 'smith', 'pizza', 'alen']
    li = sorted(li, key=lambda x: x[1])
    print(li)  # 输出:['egon', 'pizza', 'alex', 'alen', 'smith']
    '''
    8、有名为poetry.txt的文件,其内容如下,请删除第三行;
    
       昔人已乘黄鹤去,此地空余黄鹤楼。
    
       黄鹤一去不复返,白云千载空悠悠。
    
       晴川历历汉阳树,芳草萋萋鹦鹉洲。
    
       日暮乡关何处是?烟波江上使人愁。
    '''
    f = open("poetry.txt", "r+", encoding="utf-8")
    data = f.readlines()
    del data[2]
    f.seek(0)
    f.truncate()
    print(data)
    for i in data:
        f.write(i)
    f.close()
    '''
    9、有名为username.txt的文件,其内容格式如下,写一个程序,判断该文件中是否存在"alex", 如果没有,则将字符串"alex"添加到该文件末尾,否则提示用户该用户已存在;
    
       pizza
       alex
       egon
    '''
    
    f = open("username.txt", "r+", encoding="utf-8")
    li = []
    for line in f:
        li.append(line.strip())
    if "alex" in li:
        print("有alex")
    else:
        f.seek(0, 2)
        f.write("
    alex")
    f.close()
    '''
    10、有名为user_info.txt的文件,其内容格式如下,写一个程序,删除id为100003的行;
    
       pizza,100001
       alex, 100002
       egon, 100003
    '''
    import os
    
    f1 = open("user_info.txt", "r", encoding="utf-8")
    f2 = open("user_info2.txt", "w", encoding="utf-8")
    for line in f1:
        li = line.strip().split(",")
        print(li)
        if li[1].strip() == "100003":
            continue
        else:
            f2.write(line)
    f1.close()
    f2.close()
    os.remove("user_info.txt")
    os.rename("user_info2.txt", "user_info.txt")
    '''
    11、有名为user_info.txt的文件,其内容格式如下,写一个程序,将id为100002的用户名修改为alex li;
    
       pizza,100001
       alex, 100002
       egon, 100003
    '''
    import os
    
    f1 = open("user_info.txt", "r", encoding="utf-8")
    f2 = open("user_info2.txt", "w", encoding="utf-8")
    for line in f1:
        li = line.strip().split(",")
        if li[1].strip() == "100002":
            li[0] = "alex li"
            line = ",".join(li) + "
    "
        f2.write(line)
    f1.close()
    f2.close()
    os.remove("user_info.txt")
    os.rename("user_info2.txt", "user_info.txt")
    '''
    12、写一个计算每个程序执行时间的装饰器;
    '''
    
    import time
    
    
    def wrapper(func):
        def inner():
            start = time.time()
            func()
            end = time.time()
            total = end - start
            print(func, "total run time is:", total)
    
        return inner
    
    
    @wrapper
    def func1():
        time.sleep(1)
    
    
    @wrapper
    def func2():
        time.sleep(2)
    
    
    func1()
    func2()

    13、lambda是什么?请说说你曾在什么场景下使用lambda?

      匿名函数。

    '''
    14、题目:写一个摇骰子游戏,要求用户压大小,赔率一赔一。
    
    要求:三个骰子,摇大小,每次打印摇骰子数。
    '''
    import random
    
    while True:
    
        res = 0
        count = 0
        while count < 3:
            n = random.randint(1, 6)
            res += n
            count += 1
    
        guess = int(input("压大还是压小大(1),小(2): "))
        if guess == 1 and res > 9:
            print("压到了‘大’")
        elif guess == 2 and res <= 9:
            print("压到了‘小’")
        else:
            print("没压到~~~")
        print("点数为:", res)

    作业

  • 相关阅读:
    bzoj 1093: [ZJOI2007]最大半连通子图
    bzoj 1266 1266: [AHOI2006]上学路线route
    poj 2104 K-th Number
    洛谷 P3313 [SDOI2014]旅行
    cogs 306. [SGOI] 糊涂的记者
    cogs 1164. 跑步
    洛谷 1821: [JSOI2010]Group 部落划分 Group
    洛谷 U3357 C2-走楼梯
    洛谷 P3014 [USACO11FEB]牛线Cow Line
    洛谷 P2982 [USACO10FEB]慢下来Slowing down
  • 原文地址:https://www.cnblogs.com/alexchenx/p/9105846.html
Copyright © 2020-2023  润新知