创建列表
num_list1 = [i for i in range(10)]
print(num_list1) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
num_list2 = [[i, i+1] for i in range(10)]
print(num_list2) # [[0, 1], [1, 2], [2, 3], [3, 4], [4, 5], [5, 6], [6, 7], [7, 8], [8, 9], [9, 10]]
num_list3 = [ [i,i] for i in range(10) if i > 6]
print(num_list3) # [[7, 7], [8, 8], [9, 9]]
num_list4 = [ 'test-{}'.format(i) for i in range(10) if i > 6]
print(num_list4) # ['test-7', 'test-8', 'test-9']
创建集合
num_set1 = {i for i in range(10)}
print(num_set1) # {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
创建字典
num_dict1 = {i:'test-{}'.format(i) for i in range(10)}
print(num_dict1) # {0: 'test-0', 1: 'test-1', 2: 'test-2', 3: 'test-3', 4: 'test-4', 5: 'test-5', 6: 'test-6', 7: 'test-7', 8: 'test-8', 9: 'test-9'}
num_dict2 = {i:(10, i) for i in range(10)}
print(num_dict2) # {0: (10, 0), 1: (10, 1), 2: (10, 2), 3: (10, 3), 4: (10, 4), 5: (10, 5), 6: (10, 6), 7: (10, 7), 8: (10, 8), 9: (10, 9)}
创建元组
与创建其他类型的数据不同,不会立即创建元组数据,而是会返回一个生成器。
num_tuple1 = ((i, i+1) for i in range(10))
print(num_tuple1) # <generator object <genexpr> at 0x000001F2C5CD6960>
对于生成器来说,可以通过next
,for
或者send
来获取数据。一般情况下使用for
来获取数据。
num_tuple1 = ((i, i+1) for i in range(10))
# print(num_tuple1)
for item in num_tuple1:
print(item)
输出:
(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
(5, 6)
(6, 7)
(7, 8)
(8, 9)
(9, 10)
推导式中存在函数
def func():
return 1
data_list = [func for i in range(10)]
# 函数未调用,所以不执行
# 输出[<function func at 0x0000029B16FD3E20>, <function func at 0x0000029B16FD3E20>, <function func at 0x0000029B16FD3E20>, <function func at 0x0000029B16FD3E20>, <function func at 0x0000029B16FD3E20>, <function func at 0x0000029B16FD3E20>, <function func at 0x0000029B16FD3E20>, <function func at 0x0000029B16FD3E20>, <function func at 0x0000029B16FD3E20>, <function func at 0x0000029B16FD3E20>]
print(data_list)
将lambda与推导式结合使用
data_list = [lambda: 100 for i in range(3)]
print(data_list)
这里使用lambda
定义了一个匿名函数,这个函数的作用是返回100
,且没有参数,此时data_list
依然是一个函数,而且也没有执行。
所以输出结果为:
[<function <listcomp>.<lambda> at 0x000001B3FF3D5510>, <function <listcomp>.<lambda> at 0x000001B3FF3D4EE0>, <function <listcomp>.<lambda> at 0x000001B3FF3D5630>]
推导式中包含函数
def func(num):
return num + 1
data_list = [func(i) for i in range(10)]
print(data_list)
因为这个里面在data_list
中,执行了函数func(i)
,因此data_list
中包含了func(i)
执行的结果。
返回结果如下:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
当推导式中存在函数,需要注意作用域:
data_list = [lambda x: x+i for i in range(10)] # 这里只是声明了函数,并没有执行函数,所以i的值并不确定
print(data_list[5](100)) # 此时i的值已经是9了,data_list[5]表示取到了第五个函数,同时传参并执行函数,所以输出109
print(data_list[5](100)) # 此时i的值也已经是9了,所以也输出109
推导式的嵌套
一般情况下的推导式形式如下:
data = [i for i in range(10)]
嵌套的形式如下:
data = [(i, j) for j in range(5) for i in range(10)]
print(data)
从右往左开始执行。
这种形式等价于下面的形式:
data = []
for i in range(10):
for j in range(5):
data.append((i,j))
需求
请用列表推导式实现,对data_list
中的每个元素判断,如果是字符串类型,则计算长度作为元素放在新列表的元素中,如果是整型,则让其值+100
作为元素放在最新的列表的元素中。
data_list = [11, 22, 33, 'alex', 455, 'tom']
new_data_list = [ len(item) if type(item) == str else item + 100 for item in data_list ]