推导式

作者: ju7ran | 来源:发表于2018-06-16 16:26 被阅读1次

    Python语言有一种独特的推导式语法,相当于语法糖的存在
    1.列表推导式
    列表推导式是一种快速生成列表的方式。其形式是用方括号括起来的一段语句,如下例子所示:
    lis = [ii for i in range(10)]
    print(lis)
    打印结果:
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
    等价于下面的代码
    lis = []
    for i in range(10):
    lis.append(i
    i)
    print(lis)
    打印结果:
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

    列表推导式,还可以增加一些条件,其核心语法是用中括号[]将生成逻辑封装起来
    lis = [i*i for i in range(10) if i%2 == 0]
    print(lis)
    i%2的结果为0,说明是2的倍数,有0 2 4 6 8,在相乘
    打印结果:
    [0, 4, 16, 36, 64]

    多重循环
    lis = [a+b for a in '123' for b in 'abc']
    print(lis)
    同时循环a和b两个变量,在进行拼接
    打印结果:
    ['1a', '1b', '1c', '2a', '2b', '2c', '3a', '3b', '3c']

    更多用法
    dic = {"k1":'v1','k2':'v2'}
    lis = [k+":"+v for k,v in dic.items()]
    print(lis)
    打印结果:
    ['k1:v1', 'k2:v2']

    2.字典推导式
    有列表推导式,那有没有字典推导式呢?答案是有的,使用{}就可以定义了。
    dic = {i:i**3 for i in range(5)}
    print(dic)
    i的三次方
    打印结果:
    {0: 0, 1: 1, 2: 8, 3: 27, 4: 64}

    3.集合推导式
    大括号除了能用作字典推导式,还可以用作集合推导式,两者仅仅在细微处有差别。
    s = {i for i in 'abasrdfsdfa' if i not in 'abc'}
    print(s)
    把abc排除剩余字符串
    打印结果:
    {'r', 'f', 's', 'd'}

    有同学会说还有元组推导式,但是在python中元组被用作生成器了。是没有元组推导式的
    tup = (x for x in range(9))
    print(tup)
    print(type(tup))
    打印结果:
    (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
    <class 'tuple'>
    那接下来看下面试题:
    result = [lambda x: x + i for i in range(10)]

    打印 图片.png
    输出的结果是什么?
    首先分析一下执行结果
    [lambda x:x+0,lambda x:x+1,lambda x:x+2,lambda x:x+3,lambda x:x+4]
    result[0]-->lambda x:x+0
    10传入 x=10 结果10,但是结果是错误的
    在你没调用它之前,它不会保存也不关心它内部变量的具体值。只有等到你调用它的时候,它才逐一去找这些变量的具体值。这里的result[0]被调用的时候,变量i已经循环完毕,变成9了,而不是想象中的动态0-9值。所以结果是19。

    相关文章

      网友评论

        本文标题:推导式

        本文链接:https://www.haomeiwen.com/subject/uvsbeftx.html