• 复习2


    以下两段代码运行之后结果是否相同?为什么?

    第一段

    l=[]
    for i in range(10):
        l.append({'num':i})
    print(l)  


    第二段

    l=[]
    a={'num':0}
    for i in range(10):
        a['num']=i
        l.append(a)
    print(l)

    答案
    
    首先分析第一段,{'num':i}的循环里面,每一次循环都产生一个新的字典类型,所以这个比较简单结果是
    
    [{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}, {'num': 5}, {'num': 6}, {'num': 7}, {'num': 8}, {'num': 9}]
    第二段情况就有些特殊了,a={'num':0}表示把映射类型字典的引用给了a,循环a['num']=i的时候,a的引用地址不变,所以取了最后一次循环的值。
    
    [{'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9}, {'num': 9},{'num': 9}, {'num': 9}, {'num': 9}]
     
    请写出下列代码的输出的内容:
      
    def test1():
       for i in range(2):
           print('+'+str(i))
           yield str(i)
    for a in test1():
           print('-'+a)
    for a in list(test1()):
          print('-'+a)
    答案
    
    首先我们分析test1()打印的是什么,
    
    <generator object test1 at 0x7faf31262d70>
    可以看到是生成器一枚。
    第一个for循环
    
    +0 -0 +1 -1
    第二个for循环,首先我们看list(test1())就知道了,首先需要执行完生成器里的循环获取然后转出list即[0,1]。
    然后在循环这个list所以结果是。
    
    +0 +1 -0 -1

    写出下面代码的输出内容:

    for n in filter(lambda n:n%5,[n for n in range(100) if n%5==0]):
        print(n)
    else:
       print('12345')

    答案

    首先我们知道filter的用法
    filter(function, iterable)
    其中还
    function -- 判断函数。
    iterable -- 可迭代对象。
    返回 True 或 False
    但是这个题比较坑 n%5和n%5==0的区别 ,n%5是n除以5求其余数。n%5==0是n的5整除。
    lambda n:n%5这个返回的是个数字而不是一个布尔类型不符合filter的要求,所以输出12345。
    要达到筛选效果我们可以这样改.

    for n in filter(lambda n:n%5==0,[n for n in range(100) if n%5==0]):
        print(n)

    但是如果我们这样改呢,

    for i in filter(lambda n:n%5==0,[n for n in range(100) if n%5==0]):
        print(n)
    12345

    结果就比较有意思了,大家可以考虑下为什么。

    请实现下面对象的序列号和反序列化。

    class User():
         name='user1'
         age=30

    答案

    我们把变量从内存中变成可存储或传输的过程称之为序列化
    反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化
    另外我们使用的模块是pickle

    1、只能在python中使用,只支持python的基本数据类型。
    2、可以处理复杂的序列化语法。(例如自定义的类的方法,游戏的存档等)
    3、序列化的时候,只是序列化了整个序列对象,而不是内存地址。

    pickle.dumps()方法把任意对象序列化成一个bytes.所以我们首先需要创建一个对象即u=User()
    然后我们再把这个对象序列化。即

    bytes=pickle.dumps(u)

    然后是反序列化:
    用pickle.loads()方法反序列化出对象.即

    object=pickle.loads(bytes)
     


    请写出下面代码输出的内存:

    a=zip(('a','b','c'),(1,2,3,4))
    print(dict(a))

    答案

    zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

    如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
    zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。
    所以这里按照最短的元素组成的字典输出是。

    {'a':1,'b':2,'c':3}

        

  • 相关阅读:
    弱爆程序员的特征值
    快捷渐变效果
    做事务性的发布数据库日志会越来越大
    判断MS SQLSERVER临时表是否存在
    SQLite实现加密
    CentOS6.4下安装TeamViewer8
    安装CDT
    CentOS中安装Courier New字体
    VS2012的Windows程序不显示DOS窗口
    log4cpp安装使用
  • 原文地址:https://www.cnblogs.com/baili-luoyun/p/10973772.html
Copyright © 2020-2023  润新知