大作业day3

练习题
1. 文件a1.txt内容

序号 部门 人数 平均年龄 备注
1 python 30 26 单身狗
2 Linux 26 30 没对象
3 运营部 20 24 女生多
.......
通过代码,将其构建成这种数据类型:
[{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},......]
import os
a = ''' 序号     部门      人数      平均年龄      备注
1       python    30         26         单身狗
2       Linux     26         30         没对象
3       运营部     20         24         女生多
'''
with open('a1.txt',encoding='utf-8',mode='w+') as write_f:
    write_f.write(a)

l1 = [] # 定义一个list
f1 = open('a1.txt',encoding='utf-8',mode='r')
data1 = f1.readline().split()

for i in f1:  # 循环文件所有元素
    dic = {}  # 定义一个dict
    l = i.split()  # 将得到结果删除空格
    for j in range(len(l)):  # 循环每个f1文件每行的长度
        dic[data1[j]] = l[j] # 利用输出的长度来得到结果键值对
    l1.append(dic)  # 一个循环玩后添加到l1元组中
print(l1)
f1.close()
2. 传入函数的字符串中,[数字]、[字母]、[空格] 以及 [其他]的个数,并返回结果。
def func1(x):
    num = 0
    letter = 0
    blank = 0
    other = 0
    for i in x:
        if i.isdecimal():  # 数字个数
            num += 1
        elif i.isalpha():  # 字母个数
            letter += 1
        elif i.isspace():  # 空格个数
            blank += 1
        else:              # 其他字符
            other += 1
    print("数字个数为{},字母个数为{},空格个数为{},其他字符个数为{}".format(num,letter,blank,other))
func1('jinyuan123;;;  ')
3. 写函数,接收两个数字参数,返回比较大的那个数字。
def func2(x, y):
    return x if x > y else y


print(func2(88, 44))
4. 写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
dic = {"k1": "v1v1", "k2": [11,22,33,44]}
PS:字典中的value只能是字符串或列表
def func3(arg):
    ret = {}
    for key,value in arg.items():  # 把每个key、value取出
        if len(value) > 2:
            ret[key] = value[:2]   # 将ret添加key、value
        else:
            ret[key] = value
    return ret

dic = {"k1": "v1v1", "k2": [11,22,33,44],'k3':'aaaaaa'}
print(func3(dic))
5. 写函数,此函数只接收一个参数且此参数必须是列表数据类型,此函数完成的功能是返回给调用者一个字典,
此字典的键值对为此列表的索引及对应的元素。例如传入的列表为:[11,22,33] 返回的字典为 {0:11,1:22,2:33}。
def func4(*args):
    a = 0
    b = {}   # 定义字典
    for i in args[0]:  # args[0]用于取出值
        b[a] = i       # 值添加b字典中
        a += 1
    return b
print(func4([11,22,33,44]))
6. 写函数,函数接收四个参数分别是:姓名,性别,年龄,学历。用户通过输入这四个内容,
然后将这四个内容传入到函数中,此函数接收到这四个内容,将内容追加到一个student_msg文件中。
def func5(*args):  # 传入值
    import os      # 调用模块
    with open('student_msg',encoding='utf-8',mode='a') as f1: # 打开文件(或者打开文件)a为追加
        for i in args:    # 把每个值循环添加到文件里
            f1.write(i+'\n')

name = input("输入名字:")
sex = input("输入性别:")
age = input("输入年龄:")
degree = input("输入学历:")
func5(name,sex,age,degree)
7. 对第6题升级:支持用户持续输入,Q或者q退出,性别默认为男,如果遇到女学生,则把性别输入女。
def func7(name,age,degree,sex = ''):
    import os
    a = name,sex,age,degree
    with open('student_msg',encoding='utf-8',mode='a') as f1:
        for i in a:
            f1.write(i+'\n')
while 1:
    name = input("输入名字q/Q退出:").upper()
    if name == 'Q':
        break
    # sex = input("输入性别默认为男:")
    age = input("输入年龄:")
    degree = input("输入学历:")
    sex = input("输入性别默认为男:")
    if sex == '':
        func7(name,sex,age,degree)
    else:
        func7(name,age,degree)
8. 写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作。
读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?
a=10
b=20
def test5(a,b):
print(a,b)
c = test5(b,a)
print(c)
# a = 20  b = 10  c = None
# 因为a、b作为实参时调用了位置,所以a=20  b=10
# c因为只是用来调用函数,而在函数里没有使用return来构造一个返回值
9. 读代码,回答:代码中,打印出来的值a,b,c分别是什么?为什么?
a=10
b=20
def test5(a,b):
a=3
b=5
print(a,b)
c = test5(b,a)
print(c)
# a = 3   b = 5
# 因为a、b在全局虽然已经定义了变量,但是在函数体里又重新赋值
# c因为只是用来调用函数,而在函数里没有使用return来构造一个返回值
10. 写函数,传入函数中多个实参(均为可迭代对象如字符串,列表,元祖,集合等),将每个实参的每个元素依次添加到函数的动态参数args里面.
例如 传入函数两个参数[1,2,3] (22,33)最终args为(1,2,3,22,33)
def func10(*args):
    print(args)
func10(*[1,2,3],*(22,33))  # 特殊定义
11. 写函数,传入函数中多个实参(实参均为字典),将每个实参的键值对依次添加到函数的动态参数kwargs里面.
例如 传入函数两个参数{‘name’:’alex’} {‘age’:1000}最终kwargs为{‘name’:’alex’ ,‘age’:1000}
def func11(**kwargs):
    print(kwargs)
func11(**{"name":"alex"} ,**{"age":1000})  #特殊定义

12判断下列函数是否成立

# 题目一:
# a = 2
# def wrapper():
#     print(a)
# wrapper()
# 成立

# 题目二:
# a = 2
# def wrapper():
#     a += 1
# print(a)
# wrapper()
# 不成立  因为a为全局变量,函数体内不能对全局变量进行修改,只能调用

# 题目三:
# def wrapper():
#     a = 1
#
#     def inner():
#         print(a)
#     inner()
# wrapper()
# 成立

# 题目四:
# def wrapper():
#     a = 1
#
#     def inner():
#         a += 1
#         print(a)
#     inner()
# wrapper()
# 不成立 因为函数体就算嵌套都是单独存在的,只能进行调用,不能修改
13. 写函数,接收两个数字参数,将较小的数字返回.
def func13(x,y):
    return x if x < y else y
print(func13(1,2))
14. 写函数,接收一个参数(此参数类型必须是可迭代对象),将可迭代对象的每个元素以’_’相连接,形成新的字符串,并返回.
例如 传入的可迭代对象为[1,'老男孩','武sir']返回的结果为’1_老男孩_武sir
def func14(args):
    print(args)
    a = ""    # 定义一个None
    for i in args:  # 调用每个元素
        a += str(i)+'_'  # 在每个元素后面添加'_'
    return a.strip('_')  # 删除字符串左右'_'
print(func14([1,'老男孩','武sir']))
15. 写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}
例如:如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}(此题用到max(),min()内置函数)
def func15(*args):
    print('min:',min(args),'max:',max(args)) # min函数取最小  max函数取最大
func15(9,3,4,6)
16. 写函数,传入一个参数n,返回n的阶乘
例如:cal(7) 计算7*6*5*4*3*2*1
def func16(n):
    sum = 1
    for i in range(n, 0, -1):  # n为传入的值 倒叙复制
        sum = sum * i     # 求和 现有sum=1 1*7=7 然后7*6一直递归42*5
    return sum    # 返回结果
print(func16(7))
17. 写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组
例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]
def func17():
    let1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
    let2 = ['红心','草花','黑桃','方片']
    let3 = []
    for i in let1:    # 循环let1所有元素
        for j in let2:   # 循环let2所有元素
            let3.append((j,i))  # 将值添加到let3中,注意加(),按要求取每对为元组
    return let3
print(func17())

posted @ 2018-11-01 15:53  金元  阅读(356)  评论(0编辑  收藏  举报