第二模块:函数编程 第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'\xb4\xf3\xd6\xd0\xb9\xfa'
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("\nalex")
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) + "\n"
    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)

 

 

 

 

作业

posted @ 2018-05-29 16:42 alexchenx 阅读(...) 评论(...) 编辑 收藏