python4(条件语句、循环语句、推导式)
条件语句、循环语句与推导式
Python 的流程控制,说白了就三件事:判断(走哪条路)、重复(干多少遍)、快速生成(批量造数据)。这就像开车——条件语句是红绿灯,循环语句是绕着环岛转圈,推导式则是自动化的流水线打包机。咱们一样一样拆。
一、条件语句:让代码学会“看人下菜碟”
1. 三种基本形态
条件语句的核心就是if,后面跟着一个“真/假”表达式,真就执行,假就跳过或者走else。
- 单分支:
if 条件: 做某事 - 双分支:
if 条件: 做A else: 做B - 多分支:
if 条件1: ... elif 条件2: ... elif 条件3: ... else: ...
注意一个关键特性:每个条件语句只会命中第一个满足的条件,后面的elif和else就都不看了。这跟按顺序问问题一样,问到了“是”就不再往下问。
num=5ifnum>0:print("a")# 输出 aelifnum>1:print("b")# 不会执行,因为上面已经满足了P.S.:
if后面的条件不一定是布尔值,Python 会自动把任何值转成布尔——0、None、空字符串、空列表、空字典等都是False,其他都是True。所以if []:永远不会进,if "hello":一定会进。
2. 三元表达式:一行搞定简单判断
如果你只是根据条件给变量赋个值,写四行if-else太啰嗦,可以用三元表达式:
result="牛逼"ifscore>=90else"优秀"ifscore>=80else"可以"ifscore>=60else"同志仍需努力"这玩意儿是表达式(有返回值),不是代码块,所以可以嵌在 f-string 里:
print(f"老师说我:{'牛逼'ifscore>=90else'优秀'ifscore>=80else'可以'ifscore>=60else'同志仍需努力'}")不过实话实说,嵌套多了可读性会下降,适可而止。
3. 嵌套与“奇葩”写法
条件语句可以套娃——if里面再写if。PDF 里那个“包租婆”的例子就是典型的嵌套判断。
另外,Python 还支持一种“连环三元”的写法(PDF 里有一长串),但那个纯粹是炫技,生产环境千万别这么写,维护的人会想打你。
二、循环语句:让代码学会“重复劳动”
循环分两种:while和for,一个靠条件,一个靠遍历。
1.while:条件型循环
只要条件为真,就一直执行。最常见的是while True死循环,配合break手动退出。
count=0whileTrue:print(count)count+=1ifcount>=5:breakwhile...else的坑:else会在循环正常结束(没有被break)时执行。如果循环被break打断,else就不执行。这一点容易忘,但用好了可以省一个标志变量。
2.for:遍历型循环
for可以遍历任何可迭代对象(字符串、列表、元组、字典、集合、range 等)。
foriin"abc":print(i)# a b cforkeyin{"one":1,"two":2}:# 遍历的是键print(key)for...else的逻辑和while...else一样——正常走完才执行else,被break则跳过。
3. 循环控制:break和continue
break:终止整个循环(只影响它所在的那一层,外层不受影响)。continue:跳过本次,直接进入下一次迭代。
foriinrange(3):forjinrange(3):print("hello")break# 只跳出内层循环,所以外层循环3次,输出3个hello4. 两个实用内置工具:range和enumerate
range(start, stop, step)生成一个不可变的整数序列,不占内存(只存三个参数),适合循环计数。enumerate(iterable, start=0)在遍历时同时拿到索引和值,返回一个个元组。
foridx,valinenumerate(["a","b","c"],start=1):print(idx,val)# 1 a, 2 b, 3 c三、推导式:一行代码搞定批量生成
推导式是 Python 特有的“语法糖”,能把好几行的for循环压缩成一行,而且速度更快(底层优化过)。
1. 列表推导式 —— 最常用
基本结构:[表达式 for 变量 in 可迭代对象 if 条件]
squares=[x**2forxinrange(10)]# [0,1,4,9,...81]even_squares=[x**2forxinrange(10)ifx%2==0]还可以两层循环(相当于嵌套for):
result=[(x,y)forxin[1,2,3]foryin[3,1,4]ifx!=y]初始表达式甚至可以又是一个列表推导式,比如转置矩阵——那个有点烧脑,但看懂了会觉得很优雅。
2. 字典推导式 和 集合推导式
把方括号换成花括号,写法一样。
dic={x:x**2forxinrange(4)}# {0:0, 1:1, 2:4, 3:9}set1={x**2forxinrange(4)}# {0,1,4,9}(集合自动去重)集合推导式天然去重,很适合做过滤。
四、综合实战
大家可以动手敲一敲下面的这道例题,试着做一下:
- 用
random.randint(0,2)生成电脑出拳。 - 用字典映射数字到“石头/剪刀/布”。
- 判断输赢的逻辑:
player - computer等于-1或2时玩家赢(因为 0石头、1剪刀、2布 是一个循环相克的关系)。 - 加了输入校验(
while循环保证输入在 0~2 之间)。 - 三局两胜制,用
for循环跑三局,统计双方胜局数。 - 最后询问是否继续,用
while确保输入只有q或c。
这个例子把条件、循环、推导式(虽然没显式用)都串起来了,是很好的练手项目。
五、补充几个边角料
random模块:除了randint,还有random()(0~1浮点)、choice(随机选一个)、sample(随机选多个不重复)、shuffle(打乱顺序)、seed(固定随机种子,方便复现)。pass占位符:什么也不做,只用来占位置,比如写个空函数或空循环体,等以后补代码。chr和ord:字符和 Unicode 码位互转,PDF 里用在判断输入是否为大写Q或小写q上。
收尾
条件语句、循环语句、推导式这三块,是 Python 里最基础的“动词”——你写的每一段代码都离不开它们。别死记语法,多敲几遍石头剪刀布,把if、while、for、break、continue的手感练出来,后面学函数、类、装饰器就顺了。
如果非要说个优先级:if和for是基本功,列表推导式是进阶亮点。先把前者玩透,后者自然水到渠成。
下图为本文知识点的思维导图(示意):
有任何疑问,随时来聊。编码愉快!
