Python初学笔记(三)条件、循环和推导式

发表于 2025-03-05 22:16 1053 字 6 min read

Spring AI学习笔记(四)工具调用和MCPSpring AI学习笔记(三)RAG从文档入库到回答Spring AI学习笔记(二)ChatClient从怎么调到怎么封装Spring AI学习笔记(一)它到底解决什么问题java新版本-java25学习笔记(四)用JFR和GC日志做一次体检java新版本-java25学习笔记(三)虚拟线程要和资源边界一起看java新版本-java25学习笔记(二)运行时基线先统一java新版本-java25学习笔记(一)LTS版本对比和学习路线主流AI Agent能力对比与工程选型我用Kiro做了个自己的工具站盘一盘虚拟线程我用Trae做了个AstrBot的AI角色扮演插件Python初学笔记(六)常用标准库先学这几个Python初学笔记(五)读写文件和处理异常Python初学笔记(四)函数让代码开始有结构Python初学笔记(三)条件、循环和推导式Python初学笔记(二)变量和基础类型比想象中重要Python初学笔记(一)先把环境和运行方式弄明白主流AI大模型能力对比Java 21和Spring Boot 3升级笔记(五)日志指标与可观测性Java 21和Spring Boot 3升级笔记(四)数据访问层适配Java 21和Spring Boot 3升级笔记(三)虚拟线程使用边界Java 21和Spring Boot 3升级笔记(二)Jakarta迁移要点Java 21和Spring Boot 3升级笔记(一)工程基线整理魔法值怎么能忍!JPA的Specification大改造!处理生僻字乱码:JPA框架对于Oracle的NVarchar2,NChar,NClob类型支持Redis Stream能不能当轻量消息队列用RocketMQ 5学习笔记:普通消息之外要看什么事件流不是换个消息队列这么简单Kubernetes学习笔记04:发布、排障和观测Kubernetes学习笔记03:配置、密钥和存储Kubernetes学习笔记02:Deployment、Service和IngressKubernetes学习笔记01:Pod和控制器mysql索引原理02--存储引擎索引的实现mysql索引原理01--索引的数据结构
  学完变量和基础类型以后,就要开始写控制流程。   条件判断、循环、break、continue、推导式,这些东西在任何语言里都很基础。Python 的写法比较简洁,但也有自己的习惯。   这篇记录我学习 Python 流程控制时觉得比较重要的点。重点不是语法背诵,而是写出清楚、可读的代码。 if 判断...

前言

  学完变量和基础类型以后,就要开始写控制流程。

  条件判断、循环、break、continue、推导式,这些东西在任何语言里都很基础。Python 的写法比较简洁,但也有自己的习惯。

  这篇记录我学习 Python 流程控制时觉得比较重要的点。重点不是语法背诵,而是写出清楚、可读的代码。

if 判断

  Python 的 if 不需要括号,也没有大括号,靠缩进表示代码块。

age = 18

if age >= 18:
    print("adult")
else:
    print("child")

缩进在 Python 里不是风格问题,而是语法。少一个缩进、多一个缩进,程序含义就变了。

多个条件用elif

score = 86

if score >= 90:
    level = "A"
elif score >= 80:
    level = "B"
else:
    level = "C"

这种写法很直观。

真值判断

  Python 里很多对象可以直接放到 if 里判断。

names = []

if names:
    print("not empty")
else:
    print("empty")

空列表、空字符串、空字典、0、None 都会被当成 False。

这很方便,但也要小心。比如数字 0 和 None 语义不同,如果你要判断“有没有传值”,最好明确写:

if value is None:
    print("missing")

不要把所有情况都混成 truthy/falsy。

for 循环

  Python 的 for 更像“遍历可迭代对象”。

names = ["Tom", "Jerry", "Alice"]

for name in names:
    print(name)

如果要下标,可以用 enumerate:

for index, name in enumerate(names):
    print(index, name)

这比自己写range(len(names))更清楚。

for i in range(len(names)):
    print(i, names[i])

这段不是不能写,但 Python 里通常更推荐 enumerate。

range

  range 用来生成整数序列。

for i in range(5):
    print(i)

输出 0 到 4。

也可以指定起点和步长:

for i in range(1, 10, 2):
    print(i)

输出 1、3、5、7、9。

刚开始要注意,range 的结束值不包含在内。这和很多语言里的区间习惯类似,但初学时很容易差一位。

while 循环

  while 在条件为 True 时持续执行。

count = 0

while count < 3:
    print(count)
    count += 1

while 适合不知道循环次数,只知道结束条件的场景。

但要小心死循环。如果循环里没有改变条件,就会一直跑。

while True:
    command = input(">")
    if command == "exit":
        break

这种写法适合简单命令行程序。

break 和 continue

  break 用来结束循环。

for name in names:
    if name == "Alice":
        break

continue 用来跳过本次循环,进入下一次。

for name in names:
    if not name:
        continue
    print(name)

这两个关键字很常用,但不要滥用。循环里太多 break 和 continue,会让代码路径变复杂。

推导式

  Python 的列表推导式很有特色。

普通写法:

numbers = [1, 2, 3, 4]
result = []

for number in numbers:
    result.append(number * 2)

推导式写法:

result = [number * 2 for number in numbers]

还可以加条件:

even_numbers = [number for number in numbers if number % 2 == 0]

推导式适合简单转换和过滤。不要把复杂逻辑硬塞进去。如果一行推导式看半天看不懂,就不如老老实实写 for 循环。

字典推导式

  字典也有推导式。

names = ["Tom", "Alice"]
name_lengths = {name: len(name) for name in names}

结果是:

{"Tom": 3, "Alice": 5}

这种写法很适合从列表生成映射关系。

比如根据用户列表生成 ID 到用户的字典:

user_map = {user["id"]: user for user in users}

这在处理接口数据时很常见。

match 可以了解

  Python 3.10 以后有 match 语句,可以做结构化模式匹配。

match status:
    case "WAITING":
        print("等待中")
    case "DONE":
        print("已完成")
    case _:
        print("未知状态")

初学阶段不一定马上大量使用,但可以知道它存在。简单条件用 if 就够了,复杂结构匹配时再考虑 match。

小结

  Python 的流程控制语法很简洁,但简洁不等于随便写。

  if 要注意真值判断,for 遍历时优先用 enumerate,while 要小心死循环,推导式适合简单表达,不适合堆复杂逻辑。

  写流程控制时,我觉得最重要的是可读性。Python 代码本来就短,不要为了再少两行,把逻辑写得让人猜。

喜欢的话,留下你的评论吧~

© 2019 - 2026 VincentHo @VincentHo
Powered by theme astro-koharu · Inspired by Shoka