目录
推导式创建序列
推导式是从一个或者多个迭代器快速创建序列的一种方法; 它可以将循环和条件判断结合, 从而避免冗长的代码;
推导式是典型的Python风格, 会使用它代表你已经超过Python小学生的水平;
列表推导式
列表推导式生成列表对象, 语法如下:
[表达式 for item in 可迭代对象]
或者
{表达式 for item in 可迭代对象 if 条件判断}
a = [x for x in range(1,5)]
print(a)
a = [x*2 for x in range(1,5)]
print(a)
a = [x*2 for x in range(1,20) if x%5==0] #条件过滤,取能被5整取的数
print(a)
a = [a for a in 'abcdefghijklmn']
print(a)
cells = [(row,col) for row in range(1,3) for col in range(3,8)] #可以使用两个循环
print(cells)
输出:
D:\wwwroot\pyiteam\venv\Scripts\python.exe D:/wwwroot/pyiteam/mypy01.py
[1, 2, 3, 4]
[2, 4, 6, 8]
[10, 20, 30]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
[(1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7)]
Process finished with exit code 0
字典推导式
字典推导式生成字典对象, 格式如下:
{key_expression : value_expression for 表达式 in 可迭代对象}
类似于列表推导式, 字典推导也可以增加if条件判断,多个for循环;
#统计文本中字符出现的次数:
my_txt = 'i love you, i love math, i love marry'
char_count = {c:my_txt.count(c) for c in my_txt}
print(char_count)
char_count1 = {c:my_txt.count(c) for c in my_txt if c.strip()!=''} #条件过滤键为空
print(char_count1)
输出:
D:\wwwroot\pyiteam\venv\Scripts\python.exe D:/wwwroot/pyiteam/mypy01.py
{'i': 3, ' ': 8, 'l': 3, 'o': 4, 'v': 3, 'e': 3, 'y': 2, 'u': 1, ',': 2, 'm': 2, 'a': 2, 't': 1, 'h': 1, 'r': 2}
{'i': 3, 'l': 3, 'o': 4, 'v': 3, 'e': 3, 'y': 2, 'u': 1, ',': 2, 'm': 2, 'a': 2, 't': 1, 'h': 1, 'r': 2}
Process finished with exit code 0
集合推导式
集合推导式生成集合, 和列表推导式的语法格式类似:
{ 表达式 for item in 可迭代对象 }
或者
{ 表达式 for tiem in 可迭代对象 if 条件判断 }
# 集合推导式
a = { x for x in range(1,100) if x%9==0 }
print(a)
输出:
D:\wwwroot\pyiteam\venv\Scripts\python.exe D:/wwwroot/pyiteam/mypy01.py
{99, 36, 72, 9, 45, 81, 18, 54, 90, 27, 63}
生成器推导式 ( 生成元组 )
很多人会问, 都有推导式, 元组有没有, 能不能用小括号呢?
我们发现提示的是’一个生成器对象’;显然,元组是没有推导式的;
a = (x for x in range(1,100) if x%9==0)
print(a)
D:\wwwroot\pyiteam\venv\Scripts\python.exe D:/wwwroot/pyiteam/mypy01.py
<generator object <genexpr> at 0x015C8878>
一个生成器只能运行一次, 第一次迭代可以得到数据, 第二次迭代发现数据已经没有了;
gnt = (x for x in range(1,100) if x%9==0)
#print(tuple(gnt))
for x in gnt:#gnt是生成器对象,生成器是可迭代的对象
print(x,end=',') #第一次遍历有数据
print()
for x in gnt:
print(x,end='...') #第二次遍历就没有数据了
print(tuple(gnt))
.........................................................................................
D:\wwwroot\pyiteam\venv\Scripts\python.exe D:/wwwroot/pyiteam/mypy01.py
9,18,27,36,45,54,63,72,81,90,99,
()
Process finished with exit code 0