zoukankan      html  css  js  c++  java
  • 第二模块:函数编程 第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)

    作业

  • 相关阅读:
    第二次作业循环语句
    c语言01次作业分支,顺序结构
    PAT 1027. Colors in Mars
    PAT 1026 Table Tennis
    PAT 1035 Password
    PAT 1038. Recover the Smallest Number
    PAT 1028 List Sorting (25)
    PAT 1041 Be Unique (20)
    PAT 1025 PAT Ranking
    1037. Magic Coupon
  • 原文地址:https://www.cnblogs.com/alexchenx/p/9105846.html
Copyright © 2011-2022 走看看