列表生成式

前言

python里面[]表示一个列表,快速生成一个列表可以用range()函数来生成。
对列表里面的数据进行运算和操作,生成新的列表最高效快速的办法,那就是列表生成式了。

range()

一个连续的数字类型列表,比如[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],可以用range生成

########python2.7##########
>>> b=range(1,10)
>>> print  b
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> print(type(b))
<type 'list'>
#####python3.7########
>>> b=range(1,10)
>>> print (b)
range(1, 10)
>>> print(type(b))
<class 'range'>
>>> print(list(b))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

python3直接打印b会显示range(1, 11)对象,并不是直接显示应该列表,如果想显示列表,可以用list()转下

列表生成式

1.如果想对列表里面的数据进行运算后重新生成一个新的列表,如[11, 22, 33 … 1010],按平常思维就是先定义一个列表c,然后for循环挨个运算,算完了再append添加到c,最后c就是新的列表了

# 对列表数平方
b = range(1, 10)
c = []
for i in b:
    c.append(i*i)
print(c)

# 结果:[1, 4, 9, 16, 25, 36, 49, 64, 81]

2.接下来看看用列表生成式如何去实现

# 对列表数平方

b = range(1, 10)
c = [x*x for x in b]
print(c)

# 结果:[1, 4, 9, 16, 25, 36, 49, 64, 81]

3.列表生成式语法是固定的,[]里面for 前面是对列表里面数据的运算操作,后面跟平常for循序一样遍历去读取。运行后会自动生成新的列表

带if判断

1.如果想对一个列表里面的数据筛选,比如:[1, 3, -3, 4, -2, 8, -7, 6],找出大于0的数,按正常思维可以for循环挨个判断,符合条件的放到新的列表

c = [1, 3, -3, 4, -2, 8, -7, 6]
d = []
for i in c:
    if i > 0:
        d.append(i)  # 添加到列表d
print(d)

# 结果:[1, 3, 4, 8, 6]

2.接下来可以看看列表生成式,写出更加简洁优雅的代码,快速高效!

# 提取大于0的数
c = [1, 3, -3, 4, -2, 8, -7, 6]
d = [x for x in c if x > 0]
print(d)

# 运行结果[1, 3, 4, 8, 6]

多个参数

1.前面列表生成式都只传一个参数x,如果有两个列表如何去运算呢?
a = [1, 2, 3, 4, 5]
b = [“a”, “b”, “c”, “d”, “e”]
如何得出c = [“a1”, “b2”, “c3”, “d4”, “e5”]

# coding:utf-8

a = [1, 2, 3, 4, 5]
b = ["a", "b", "c", "d", "e"]

# 多个参数列表生成式
c = [str(x)+str(y) for x, y in zip(b, a)]
print(c)

# 结果:['a1', 'b2', 'c3', 'd4', 'e5']

2.列表生成式的语法是非常优雅的,学会了可以少写很多代码。理解起来也并不难,多联系几次就能熟练掌握了。

面试题

求输出结果

def multipliers1():
    return [lambda x:i*x  for i in range(4)]

print([m(2) for m in multipliers1()])

转化成for循环

def func():
    fun_lambda_list = []

    for i in range(4):
     #i为外层作用域(嵌套作用域)
        def lambda_(x):
            print('Lambda函数中 i = {} 命名空间为:{}'.format(i, locals()))
            return x * i
        #当调用lambda时,函数体lambda内没有i,就先去去外层作用域找,
        # 找到此时以及完成循环为3的i,故每次i都为3,而非0,1,2,3
        fun_lambda_list.append(lambda_)
    return fun_lambda_list
print([m(2) for m in func()])

想得到[0,2,4,6]

def multipliers2():
    return [lambda x,i=i:i*x   for i in range(4)]
print(([m(2) for m in multipliers2()]))
#结果[0,2,4,6]


#multipliers2等价于
def func2():
    fun_lambda_list = []
    for i in range(4):
        def lambda_(x, i= i):
        #此时添加了局部作用域i,i为默认参数,在循环后,分别为
        #i=0,i=1,i=2,i=3
            print('Lambda函数中 i = {} 命名空间为:{}'.format(i, locals()))
            return x*i
        fun_lambda_list.append(lambda_)
    return fun_lambda_list
print([m(2) for m in func2()])


补充作用域

python解释器查找变量时,会按照顺序依次查找
局部作用域--->嵌套作用域--->全局作用域--->内建作用域,
在任意一个作用域中找到变量则停止查找,所有作用域查找完成没有找到
对应的变量,则抛出 NameError: name 'xxxx' is not defined的异常。

内建作用域
from math import *
print(pi)
pi=1
print(pi)

用一行代码输出乘法表

print('\n'.join([' '.join(['%s*%s=%-2s' % (j, i, i * j) for j in range(1, i + 1)]) for i in range(1, 10)]))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值