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()])
  • 相关阅读:
    算法训练 表达式计算
    基础练习 十六进制转十进制
    基础练习 十六进制转十进制
    基础练习 十六进制转十进制
    New ways to verify that Multipath TCP works through your network
    TCP的拥塞控制 (Tahoe Reno NewReno SACK)
    Multipath TCP Port for Android 4.1.2
    How to enable ping response in windows 7?
    NS3
    Multipath TCP Port for Android
  • 原文地址:https://www.cnblogs.com/ysging/p/10094535.html
Copyright © 2011-2022 走看看