函数练习题

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

import os


def modify(filename, old, new):
    old_file = filename
    new_file = filename * 2
    f = open(old_file, 'r', encoding='utf-8')
    fnew = open(new_file, 'w', encoding='utf-8')

    for line in f:
        newline = line.replace(old, new)
        fnew.write(newline)
    f.close()
    fnew.close()
    os.replace(new_file, old_file)


modify('data.txt', '170', '175')

2.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组

  例如:[(‘红心’,2),(‘草花’,2), …(‘黑桃A’)]

def cards():
    num = [i for i in range(2,11)]
    num.extend(['J','Q','K','A'])
    type = ['红心','草花','方块','黑桃']
    result = []
    for i in num:
        for j in type:
            result.append((j,i))
    return result
print(cards())

3.写函数,专门计算图形的面积

  • 其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积
  • 调用函数area(‘圆形’,圆半径) 返回圆的面积
  • 调用函数area(‘正方形’,边长) 返回正方形的面积
  • 调用函数area(‘长方形’,长,宽) 返回长方形的面积
    def area():
        def 计算长方形面积():
            pass
     
        def 计算正方形面积():
            pass
     
        def 计算圆形面积():
            pass

     

import math
print('''
请按照如下格式输出:
    调用函数area(‘圆形’,圆半径) 返回圆的面积
    调用函数area(‘正方形’,边长) 返回正方形的面积
    调用函数area(‘长方形’,长,宽) 返回长方形的面积''')
def area(name,*args):
    def areas_rectangle(x,y):
        return ("长方形的面积为:",x*y)
 
    def area_square(x):
        return ("正方形的面积为:",x**2)
 
    def area_round(r):
        return ("圆形的面积为:",math.pi*r*r)
    if name =='圆形':
        return area_round(*args)
    elif name =='正方形':
        return area_square(*args)
    elif name =='长方形':
        return areas_rectangle(*args)
 
 
print(area('长方形', 3, 4))
print(area('圆形', 3))
print(area('正方形', 3))
# 请按照如下格式输出:
#     调用函数area(‘圆形’,圆半径) 返回圆的面积
#     调用函数area(‘正方形’,边长) 返回正方形的面积
#     调用函数area(‘长方形’,长,宽) 返回长方形的面积
# ('长方形的面积为:', 12)
# ('圆形的面积为:', 28.274333882308138)
# ('正方形的面积为:', 9)

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

FLAG = False    #加一个变量防止多次登录验证
def wrapper(fun):
    def inner(*args,**kwargs):
        '''登录程序'''
        global FLAG #将FLAG变量设置成全局变量
        if FLAG:
            ret = fun(*args, **kwargs)
            return ret
        else:
            username = input('username:')
            password = input('password:')
            if username == '123' and password == '345':
                FLAG = True
                ret = fun(*args,**kwargs)
                return ret
            else:
                print('登录失败')
    return inner

@wrapper
def func_1():
    print('func1 is running!')

@wrapper
def func_2():
    print('func2 is running!')

func_1()
func_2()

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

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

2017-10-19 22:07:38 [1] test log db backup 3
2017-10-19 22:07:40 [2]    user alex login success

import time
def logger(filename,channel='file'):
    count = 0
    def print_file():
        with open(filename,"a",encoding="utf-8") as f:
            f.write(s)
    def print_terminal():
        print(s,end="")
    def print_both():
        with open(filename,"a",encoding="utf-8") as f:
            f.write(s)
        print(s,end="")
    func_dic = {
         'file':print_file,
         'terminal':print_terminal,
         'both':print_both,
    }
    print_func = func_dic[channel]
    while True:
        msg = yield
        s = "%s [%d] %s\n"%(time.strftime("%Y-%m-%d %H:%M:%S"),count,msg)
        print_func()
        count += 1
log_obj = logger(filename="web.log",channel='both')
log_obj.__next__()
log_obj.send('user xiao login success')
log_obj.send('user qing login success')

 1,用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb

#  1,用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb
# name=['alex','wupeiqi','yuanhao','nezha']
 
name=['alex','wupeiqi','yuanhao','nezha']
def sb(x):
    return x+'_sb'
 
res = map(sb,name)
print(list(res))
# 结果:
['alex_sb', 'wupeiqi_sb', 'yuanhao_sb', 'nezha_sb']

有列表 li = [‘alex’, ‘egon’, ‘smith’, ‘pizza’, ‘alen’], 请将以字母“a”开头的元素的首字母改为大写字母

def check(x):
    x = str(x)
    if x.startswith('a'):
        return x.capitalize()
    else:
        return x


li = ['alex', 'egon', 'smith', 'pizza', 'alen']
m = map(check, li)
print(list(m))

有列表 li = ['alex', 'egon', 'smith', 'pizza', 'alen'], 请以列表中每个元素的第二个字母倒序排序


li = ['alex', 'egon', 'smith', 'pizza', 'alen']
print(sorted(li, key=lambda s: s[2], reverse=True)

 有名为username.txt的文件,其内容格式如下,写一个程序,判断该文件中是否存在"alex", 如果没有,则将字符串"alex"添加到该文件末尾,否则提示用户该用户已存在;

with open('username.txt','r+',encoding='utf-8') as f:
    str1 = 'alexx'
    i = f.read()
    print(i)
    if str1 in i:
        print("the user already exist in")
    else:
        f.write('\nalexx')

 


posted @ 2019-10-31 15:43  benzhangwen  阅读(199)  评论(0)    收藏  举报