推导式创建序列:
推导式是从一个或者多个迭代器快速创建序列的一种方法。它可以将循环和条件判断结合, 从而避免冗长的代码。推导式是典型的Python 风格,会使用它代表你已经超过Python初 学者的水平。
一:列表推导式
列表推导式生成列表对象,语法如下:
[表达式 for item in 可迭代对象 ]
或者:{表达式 for item in 可迭代对象 if 条件判断}
1 #列表推导式
2 x = [x for x in range(1,5)]3 print(x)4
5 x = [x*2 for x in range(1,5)]6 print(x)7
8 x = [x*2 for x in range(1,100) if x%5 ==0]9 print(x)10
11 x = [x for x in 'abcdefg']12 print(x)13
14 cells = [(row,col) for row in range(1,5) for col in range(1,5)] #可以使用两个循环
15 print(cells)16 for cell incells:17 print(cell)
二:字典推导式
字典的推导式生成字典对象,格式如下: {key_expression : value_expression for 表达式 in 可迭代对象}
类似于列表推导式,字典推导也可以增加 if条件判断、多个 for 循环。
1 #统计字符出现的次数
2 text = 'i love you, i love me, i love family'
3 char_count = {c:text.count(c) for c intext}4 print(char_count)
三:集合推导式
集合推导式生成集合,和列表推导式的语法格式类似: {表达式 for item in 可迭代对象 } 或者:{表达式 for item in 可迭代对象 if 条件判断}
1 #集合推导式:集合的底层是字典(只有字典的key,没有字典的values)
2 x = {x for x in range(1,100) if x%9 ==0}3 print(x)
四:生成器推导式(生成元组)
元组有没有推导式?
>>> (x for x in range(1,100) if x%9==0)
at 0x0000000002BD3048>
我们发现提示的是“一个生成器对象”。显然,元组是没有推导式的。
一个生成器只能运行一次。第一次迭代可以得到数据,第二次迭代数据就没有了(需要重新生成一个生成器)。
1 #生成器推导式(生成元组)
2 gnt = (x for x in range(1,100) if x%9 ==0)3 print(gnt)4 for x in gnt: #循环遍历生成器对象gnt
5 print(x,end='\t')6 for x in gnt: #再次循环遍历生成器对象gnt,发现没有数据了
7 print(x,end='\t')
五:综合练习
1. 【操作】绘制多个同心圆
1 importturtle2 t =turtle.Pen()3 t.width(4)4 t.speed(10)5 my_colors = ('red','green','yellow','black')6 for i in range(10): #0 1 2 3 4 5
7 t.penup()8 t.goto(0,-i*5) #0 5 10 15 20 25
9 t.pendown()10 t.color(my_colors[i%my_colors.__len__()])11 t.circle(10+i*5) #10 15 20 25 30 35
12
13 turtle.done() #程序执行完,窗口仍然在
2. 【操作】绘制18*18 棋盘
1 #绘制18*18的棋盘
2 importturtle3 width = 20
4 num = 18
5 x1 = [(-200,200),(-200+width*num,200)]6 y1 = [(-200,200),(-200,200-width*num)]7 t =turtle.Pen()8 t.speed(10)9 #t . g o t o ( x 1 [ 0 ] [ 0 ] , x 1 [ 0 ] [ 1 ] )
10 #t . g o t o ( x 1 [ 1 ] [ 0 ] , x 1 [ 1 ] [ 1 ] )
11 for i in range(0,19):12 t.penup()13 t.goto(x1[0][0],x1[0][1]-20*i)14 t.pendown()15 t.goto(x1[1][0],x1[1][1]-20*i)16 for i in range(0,19):17 t.penup()18 t.goto(y1[0][0]+20*i,y1[0][1])19 t.pendown()20 t.goto(y1[1][0]+20*i,y1[1][1])21 t.hideturtle() #隐 藏 画 笔
22 turtle.done() #保 证 运 行 窗 口 不 被 自 动 关 闭