zoukankan      html  css  js  c++  java
  • day 16

    内置函数(二)练习

    1、用 map 来处理字符串列表,把列表中所有人都变成 sb,比方 alex_sb
    name=['alex','wupeiqi','yuanhao','nezha']

    name=['alex','wupeiqi','yuanhao','nezha']
    def func(n):
        return n+'_sb'
    
    #ret = map(func,name)   #这里的 ret 是一个迭代器,和可迭代的是不同的
    #print(list(ret))       #迭代器 for 循环完了 就没有值了 可迭代的每次 for 循环都会生成一个迭代器
    
    #print(list(map(func,name)))
    
    print(list(map(lambda n:n+'_sb',name))) #内置函数

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

    num = [1,3,5,6,7,8]
    
    def func2(i):
        return i % 2 == 0
    
    print(list(filter(func2,num)))
    print(list(filter(lambda i:i % 2 == 0,num)))
    
    #lambda 嵌套 三元运算符
    num = [1,3,5,6,7,8]
    def func(x):
        if x%2 == 0:
            return True
    
    ret = filter(lambda x:True if x%2 == 0 else False,num) #以及列表推导式
    print(list(ret))

    3、随意写一个 20 行以上的文件,运行程序,先将内容读到内存中,用列表存储,接收用户输入页码,每页 5 条,仅输出当页的内容

    with open('E:/py/log/file.txt',encoding='GBK')as f:
        l = f.readlines()
    pages,mod = divmod(len(l),5)
    if mod != 0:
        pages +=1
    page_num = int(input('请输入页码:'))
    if page_num < 0 or page_num == 0 or page_num > pages:
        print('请输入1-'+str(pages)+'的页数')
    elif page_num == pages and mod != 0:
        for i in range(mod):
            print(l[(page_num-1)*5+i].strip())
    else:
        for i in range(5):
            print(l[(page_num-1)*5+i].strip())

    4、如下,每个小字典的 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}
    ]  
    #4.1、计算购买每支股票的总价
    ret = map(lambda dic:{dic['name']:round(dic['shares']*dic['price'],2)},portfolio)
    print(list(ret))
    
    
    # 4.2、用filter过滤出,单价大于100的股票有哪些
    ret = filter(lambda p:p['name'] if p['price']>100 else False,portfolio)
    print(list(ret))
    
    ret = filter(lambda dic:True if dic['price'] > 100 else False,portfolio)
    print(list(ret))
    
    ret = filter(lambda dic:dic['price'] > 100,portfolio)
    print(list(ret))

    面试题

    1、阅读代码,说出输出结果

    d = lambda p:p*2
    t = lambda p:p*3
    x = 2
    x = d(x) #x = 4
    x = t(x) #x = 12
    x = d(x) #x = 24
    print(x)

    2、现有两个元组 (('a'),('b')),(('c'),('d')),请使用 python 中匿名函数,生成列表 [{'a':'c'},{'b':'d'}]

    # max min sorted filter map
    # 匿名函数 == 内置函数,因为匿名函数往往与内置函数一起使用
    
    ret = zip((('a'),('b')),(('c'),('d')))
    res = map(lambda t:{t[0]:t[1]},ret)
    print(list(res))

    3、以下代码的输出是什么?请给出答案并解释

    def multipliers():
        return [lambda x:i*x for i in range(4)]
    print([m(2) for m in multipliers()])
    #结果 [6, 6, 6, 6]
    
    '''
    原理:
    lambda x: x*i 为内层(嵌)函数,他的命名空间中没有 i 
    所以运行时会向外层函数(这儿是列表解析式函数 [ ])的命名空间中请求 i 
    而当列表解析式运行时,列表解析式命名空间中的 i 经过循环依次变化为 0-->1-->2-->3 最后固定为 3 ,
    所以当 lambda x: x*i 内层函数运行时,去外层函数获取 i 时,每次都只能获取到 3
    
    解决办法:变闭包作用域为局部作用域
    给内层函数 lambda x:x*i 增加参数,命名空间中有了用来存储每次的 i,
    即:[lambda x, i=i: x*i for i in range(4)] 这样每一次,内部循环生成一个lambda 函数时
    都会把 --i-- 作为默认参数传入 lambda 的命名空间
    '''
    #请修改 multipliers 的定义来产生期望的结果。
    def multipliers():
        return (lambda x:i*x for i in range(4))
    print([m(2) for m in multipliers()])
    #结果 [0, 2, 4, 6]
    
    def multipliers():
        return [lambda x,i=i:i*x for i in range(4)]
    print([m(2) for m in multipliers()])
  • 相关阅读:
    Docker版安装部署 Nexus 及阿里云仓库与本地仓库配置
    Golang开发中如何解决共享变量问题
    什么是dubbo?
    dubbo配置
    redis击穿,穿透,雪崩
    C#根据wsdl文件生成客户端调用代码
    查询哪个程序在使用某个端口
    Java面试题(十六):双亲委派模型
    Java面试题(十五):Java类加载器
    Java面试题(十四):什么是字节码?采用字节码的好处是什么?
  • 原文地址:https://www.cnblogs.com/ysging/p/10094535.html
Copyright © 2011-2022 走看看