zoukankan      html  css  js  c++  java
  • 函数、装饰器、迭代器、内置方法总练习题

    函数基础:

    1.写函数,计算传入数字参数的和。(动态传参):用不固定参数的*args不限定输入的参数,然后用for循环把每个元素加到一起,函数里的args不用加*

    
    
    def sum1(*args):
    j = 0
    for i in args: # 不固定参数输入元祖后,调用不需要加*
    j = j + i
    print(j)

    sum1(1,2,3,4,5,6)
     

    2.写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作:原来打算打开文件后,遍历每行数据,每行数据为字符串S--》每行数据用,分割成元素为字符串的列表A--》判断是否需要修改--》修改后赋值给原来的列表A--》再把列表A用',’.join(list)转成也就是原来的字符串S--》再用seek,truncate写回原来文件。

    也就是说不用弄一个空列表就能实现修改信息写回文件,然而写的时候发现问题出在--》修改后赋值给原来的列表A  这里,要赋值就要再用一次循环,然后用到枚举enumerae来定位索引值,而枚举列表的元素类型为str,刚好原来列表A的元素也是字符串,字符串是不可变的元素,不能通过枚举索引修改元素,所以还是得弄一个空列表l,把修改后的信息加到空列表l里--》做完后感觉用字典的话应该不用像列表一样做这么多for循环,因为字典索引是用key,赋值不用index索引去找

    用到的东西:str.split(','),list.append(str),文件写入方法(for i in list ,f.write(' ),seek(0),truncate()),for index,i in enuerate(list) -->if correction-->list[index] = i

    def file_change(filename,newinfo,oldinfo):
    f = open(filename,'r+')
    d = f.readlines() # 信息变成列表,元素是一个一个的字符串,一个字符串就是一行
    l = []
    n = 0
    for i in d:
    for i1, e in enumerate(i): # di是每行信息字符串的列表i
    e = i.split(',') # 把每行信息字符串变成以,隔开的列表e
    # print(i)
    for index2,j in enumerate(e):
    if j == oldinfo:
    j = newinfo # 每个小的字符串检查,如果有符合的替换掉
    e[index2] = j # 通过索引方式把修改后的值赋值回遍历的列表e
    n += 1 # 加一个功能,计算修改的次数
    e2 = ','.join(e) # 把列表e用,重新组成字符串e2
    l.append(e2) # e2加到空列表l
    # print(l)
    f.seek(0)
    f.truncate() # 清空文件内容
    f = open(filename, 'w')
    for k in l:
    f.write('{} '.format(k)) # i信息重新写入
    f.close()
    file_change('D:test.txt','AAA','BBB')

    3.写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。:all(),any()只能判断可迭代对象

    def check(n):
    print('没有空内容') if all(n) else print('有空内容')

    check(None)
    TypeError: 'NoneType' object is not iterable


    4.写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

    用到:dict.keys(),dict.values(),dict.items()--K,V

    dic = {"k1": "v1v1", "k2": [11,22,33,44]} PS:字典中的value只能是字符串或列表

    dic = {"k1": "v1v1", "k2": [11,22,33,44]}
    def check(i):
    for k,v in i.items():
    if len(v) > 2:
    i[k] = v[:2]
    print(i)

    check(dic)

    答案用的return i和else continue有什么作用?不用输出也是一样

    解释闭包的概念

    不懂,回去再看一遍

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

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

    def poke():
    color = ['红心','草花','红桃','黑桃']
    n = 1
    l = []
    while n < 14:
    for i in color:
    l.append((i, n))
      n += 1
    print(l)

    poke()

    然后再加上if对i的判断
    def poke():
    i =[]
    color = ['红心','草花','红桃','黑桃']
    num = [i for i in range(2,11)]
    num_big = ['J','Q','K','A']
    num.extend(num_big) # 1-13数字集合到一起
    k = []
    for i in num:
    for l in color:
    k.append((l,i)) # 实际和99乘法一样
    print(k)


    poke()


    这种就没事
     

    2写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}

    例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}

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

    其中嵌套函数,计算圆的面积,正方形的面积和长方形的面积

    调用函数area(‘圆形’,圆半径) 返回圆的面积

    调用函数area(‘正方形’,边长) 返回正方形的面积

    调用函数area(‘长方形’,长,宽) 返回长方形的面积

    def area(): def 计算长方形面积(): pass def 计算正方形面积(): pass def 计算圆形面积(): pass

    def area(typ, *args):
    def recangle(x,y):
    num = x*y
    return num
    def square(x):
    num = x*x
    return num
    def circular(x):
    num = x
    return num
    if typ == '长方形':
    return recangle(*args)
    elif typ == '正方形':
    return square(*args)
    elif typ == '圆形':
    return circular(*args)



    print(area('长方形',5,6))

    return函数的应用,return是指返回函数的执行结果。 import math ,pi表示3.14

    写函数,传入一个参数n,返回n的阶乘(用for循环,不断相乘)

    例如:cal(7) 计算7*6*5*4*3*2*1

    def cal1(x):
    if x > 0:
    return x*cal1(x-1)

    print(cal1(2))
    报错
    TypeError: unsupported operand type(s) for *: 'int' and 'NoneType'

    为什么cal1(x-1)没有识别到类型?

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

    写过,不写了,用2层函数返回内存地址,最里面执行原来函数和判断。知识:为什么要做2层返回?怎么把文件里的账号密码转出来进行判断?

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

    生成器gennerater有2种生成方式1.列表生成式2.函数yield,一边循环一边计算的机制

    迭代器iterator--可以被next()函数调用,

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

    1.列表生成式2.函数yield3.()

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

    根据指令向屏幕输出日志

    根据指令向文件输出日志

    根据指令同时向文件&屏幕输出日志

    以上日志格式如下

    2017-10-19 22:07:38 [1] test log db backup 3
    2017-10-19 22:07:40 [2]    user alex login success 
    #注意:其中[1],[2]是指自日志方法第几次调用,每调用一次输出一条日志
    

    代码结构如下

     def logger(filename,channel='file'):
        """
        日志方法
        :param filename: log filename
        :param channel: 输出的目的地,屏幕(terminal),文件(file),屏幕+文件(both)
        :return:
        """
        ...your code...
    
     #调用
     log_obj = logger(filename="web.log",channel='both')
     log_obj.__next__()
     log_obj.send('user alex login success')
    def log_obj():
    print('log')
    yield x

    def log_obj2():
    info = 'log'
    f = open('file','a', encoding='UTF-8')
    f.write(' {}'.format(info))
    f.close()

    def log obj3()
    def log obj():
    def log_obj2()
    log_obj1(x)
    log_obj2(x)

    最后一题不明白什么意思,同时输出的话,把函数写到里面执行不就可以了?

    内置函数

    
    

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

    name=['alex','wupeiqi','yuanhao','nezha']

    name=['alex','wupeiqi','yuanhao','nezha']

    name = map(lambda x:x+'_SB',name)

    print(list(name))

    用filter函数处理数字列表,将列表中所有的偶数筛选出来

    num = [1,3,5,6,7,8]

    num = [1,3,5,6,7,8]
    def judge(n):
    return n % 2 == 0
    new_num = filter(judge,num)
    print(list(new_num))

    如下,每个小字典的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的股票有哪些

     def ss(n):
    sum1 = n['price']
    return sum1 > 100
    newlis = filter(ss,p)
    for i in newlis:
    print(i['name'])
  • 相关阅读:
    艾伟:WCF中通过Dispose有效实现重用 狼人:
    艾伟:用 IIS 7、ARR 與 Velocity 建置高性能的大型网站 狼人:
    艾伟:表达式树和泛型委托 狼人:
    艾伟:jQuery性能优化指南(2) 狼人:
    艾伟:在Windows Mobile上实现自动拼写和匹配建议 狼人:
    艾伟:Web.config配置文件详解 狼人:
    艾伟:对 String 的几个错误认识 狼人:
    艾伟:ASP.NET安全问题--Forms验证的具体介绍(上篇) 狼人:
    艾伟:基于web信息管理系统的权限设计分析和总结 狼人:
    艾伟:[你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望 狼人:
  • 原文地址:https://www.cnblogs.com/jackfree/p/9640631.html
Copyright © 2011-2022 走看看