软件编程入门指南:变量、条件判断和循环怎么理解

技术教程8小时前发布 jdkjadmin
0 00
软件编程入门指南:变量、条件判断和循环怎么理解

软件编程入门指南:变量、条件判断和循环怎么理解

刚开始学编程,常会遇到三个问题:变量是什么,程序怎样根据情况作出选择,怎样让一段操作重复执行?它们分别对应变量、条件判断和循环。三者组合起来,就能处理许多日常任务,例如计算订单金额、检查输入是否有效、统计一组数据。

本文使用 Python 3 举例。示例可以保存为 .py 文件后运行,也可以复制到 Python 交互环境执行。不同语言的语法会有差异,但“保存数据、按条件分支、重复处理”的基本思路大体相通。

一、变量:给数据一个可引用的名字

可以把变量理解为程序中用于引用数据的名字。比如,计算长方形面积时,可以把长和宽分别记作 width 和 height,再把计算结果记作 area:

width = 5
height = 3
area = width * height

print(area)

运行结果是 15。等号在这里表示赋值:把右侧计算得到的值关联到左侧的变量名。它与数学里的等式不是一回事。执行 width = width + 1 时,程序先读取旧的 width,加上 1,再把结果写回同一个名字。

变量名怎么取

变量名应当表达用途。price 比 x 更容易理解,item_count 也比 a1 更能说明它保存的内容。Python 中变量名可以包含字母、数字和下划线,但不能以数字开头,也不能使用语言保留字。Python 区分大小写,total 和 Total 是两个不同的名字。

user_name = "Lin"
item_count = 3
total_price = 29.9

print(user_name, item_count, total_price)

变量名不应包含空格;在 Python 中常见的写法是使用小写字母和下划线。避免拿 list、str 这样的内置名称当变量名,否则会遮蔽相应的内置功能,让后续代码更难理解或使用。

常见数据类型

  • int:整数,例如 12。
  • float:浮点数,例如 3.14。它适合一般数值计算,但二进制浮点数不能精确表示所有十进制小数。
  • str:字符串,例如 "hello"。
  • bool:布尔值,只有 True 和 False。
  • list:列表,可以按顺序保存多个值,例如 [2, 4, 6]。

可以用 type() 查看值的类型:

age = 20
name = "Mina"

print(type(age))
print(type(name))

类型会影响运算。2 + 3 得到整数 5,而 "2" + "3" 得到字符串 "23"。字符串中的数字不会自动变成数值。需要计算时,应明确转换:

text = "42"
number = int(text)

print(number + 8)

转换也可能失败,例如 int("abc") 会引发 ValueError。不能假定外部输入总能转换成功,后文会介绍处理方法。

赋值与对象:新手要知道的边界

对整数、字符串这类常见值重新赋值,不会修改其他变量的数值。列表则是可变对象:把一个列表赋给另一个变量时,两个名字可能指向同一个列表。通过其中一个名字修改列表,另一个名字看到的内容也会变化。

first = [1, 2]
second = first
second.append(3)

print(first)
print(second)

两次输出都是 [1, 2, 3],因为赋值没有复制列表,只是让两个变量引用同一个对象。如果需要创建一份浅拷贝,可以使用 first.copy();若列表内还包含其他可变对象,浅拷贝不会递归复制内部对象,是否需要深拷贝要根据数据结构决定。

二、条件判断:让程序按情况选择

条件判断的作用是:根据一个表达式的真假,决定执行哪段代码。Python 使用 if、elif 和 else:

temperature = 28

if temperature >= 30:
    print("天气炎热")
elif temperature >= 20:
    print("天气适宜")
else:
    print("天气较凉")

if 后面是条件,冒号表示一个代码块开始,代码块由缩进界定。Python 通常使用四个空格缩进,同一代码块的缩进必须一致。缩进不只是排版,缩进错误可能导致语法错误,或让代码归属到错误的分支。

执行时,程序从上往下检查条件。第一个为真的分支执行后,后面的 elif 和 else 都会跳过。因此,条件的顺序会影响结果。上例先检查“是否至少 30”,再检查“是否至少 20”,使两个范围不重叠地按预期匹配。

比较与逻辑运算

常用比较运算符包括:

  • ==:相等;!=:不相等。
  • >、<:大于、小于。
  • >=、<=:大于或等于、小于或等于。
  • in:检查某个元素是否包含在序列或集合中。

注意,赋值用一个等号,比较相等用两个等号。把 if score = 60: 写进条件中会产生语法错误;应写成 if score == 60:。

and 表示条件都满足,or 表示至少一个条件满足,not 表示取反。下面的示例检查年龄是否在指定范围内:

age = 25

if age >= 18 and age < 65:
    print("符合范围")
else:
    print("不符合范围")

Python 还支持链式比较,18 <= age < 65 与同时写两个比较条件的意思相同。选择易读的写法即可。使用 and、or 时,Python 会从左向右短路求值:一旦结果已经确定,后续表达式可能不再执行。因此,如果后面的表达式依赖前面的检查来避免错误,应把保护条件放在前面。

name = ""

if name and len(name) > 3:
    print("名称长度超过 3")

空字符串为假,所以这里不会对空字符串执行后续长度判断。对于复杂条件,适当拆成几个有含义的变量或 if 分支,通常比堆叠括号更容易维护。

真值判断与空值

条件不一定只能写比较表达式。Python 中,非零数字、非空字符串和非空容器通常为真;0、""、[]、None 等通常为假。例如:

items = []

if items:
    print("列表有内容")
else:
    print("列表为空")

真值判断简洁,但不一定符合业务含义。假设变量 count 的值为 0,if count: 会把它当作假;如果程序要判断“这个变量是否存在”,这种写法就可能误把有效的零当成缺失值。遇到这种情况,应明确判断 count is not None,或按需求判断长度、范围和类型。

浮点数比较的误区

浮点数运算可能有细微误差。例如某些十进制小数无法用有限长度的二进制小数表示,所以直接比较计算结果是否恰好等于某个小数,可能得到意外结果。普通数值场景可比较两数差值是否足够小;涉及金额时,常用整数的最小货币单位或十进制专用类型处理,而不是依赖二进制浮点数的精确相等。

三、循环:重复处理数据或重复执行任务

循环用于重复执行代码。Python 的 for 循环常用于遍历一组数据,while 循环则常用于“只要条件成立就继续”的场景。选择哪一种,取决于问题本身,不是哪个更高级。

for:按顺序处理一组值

scores = [82, 91, 76]
total = 0

for score in scores:
    total = total + score

print(total)

循环每次从 scores 中取出一个值,绑定到 score,再执行缩进块。列表有三个元素,循环体就执行三次。这个例子计算总分;如果要计算平均分,还要考虑列表为空的情况,不能直接除以元素个数:

scores = [82, 91, 76]

if scores:
    average = sum(scores) / len(scores)
    print(average)
else:
    print("没有成绩可计算")

range() 可以生成整数序列,常用于需要重复固定次数的场景。它的结束值不包含在序列中:

for number in range(1, 5):
    print(number)

输出是 1、2、3、4,不包含 5。range(start, stop, step) 的结束值 stop 仍然不包含在内,步长 step 用于控制每次增加或减少多少。步长不能为零;正步长和负步长适用于不同方向的序列。

for number in range(10, 0, -2):
    print(number)

这段代码依次输出 10、8、6、4、2。如果起点、终点方向与步长方向不匹配,通常不会得到任何元素。遇到次数不对时,先检查起点、结束值是否包含以及步长方向。

遍历列表时,如果还需要位置编号,可以使用 enumerate(),不必自己维护计数变量:

names = ["Ari", "Bo", "Chen"]

for index, name in enumerate(names, start=1):
    print(index, name)

这里的编号从 1 开始只是显示习惯;列表自身的索引仍从 0 开始。访问 names[0] 是第一个元素,访问 names[len(names)] 则会越界,因为最后一个有效索引是 len(names) - 1。

while:条件满足时继续

while 循环适合重复次数不预先确定、但有明确停止条件的任务,例如等待输入正确内容或逐步处理数据:

remaining = 3

while remaining > 0:
    print("剩余次数:", remaining)
    remaining = remaining - 1

print("结束")

每次循环开始前,程序都会检查条件。如果条件为假,循环体一次也不会执行。设计 while 时要确认循环条件最终会变为假;若变量不更新、更新方向错误,或者输入一直无法满足退出条件,就可能出现无限循环。

交互式输入需要考虑用户可能输入空内容或非数字。下面示例不断提示,直到用户输入一个大于零的整数:

while True:
    text = input("请输入正整数:")

    try:
        number = int(text)
    except ValueError:
        print("输入必须是整数")
        continue

    if number > 0:
        print("收到:", number)
        break

    print("数字必须大于零")

input() 的返回值始终是字符串。int() 只接受可解析为整数的输入,遇到不符合格式的内容会抛出 ValueError。这里用 try 和 except 处理这个预期错误;continue 跳过本轮剩余部分并开始下一轮,break 则结束当前循环。

循环中的 break 和 continue

break 常用于找到目标后提前结束循环;continue 常用于跳过当前元素、继续处理后续元素。它们能简化部分逻辑,但在多层嵌套循环中,阅读者可能不容易看出它们影响的是哪一层循环。嵌套循环中如果需要清晰控制流程,可以将内层处理拆成函数。

numbers = [3, -1, 5, 0, 8]

for number in numbers:
    if number < 0:
        continue
    if number == 0:
        break
    print(number)

结果会输出 3。遇到负数时跳过,遇到零时结束,因此后面的 8 不会被处理。读循环时,要特别留意 break 出现的位置和数据顺序。

四、把三者组合起来:处理订单数量

变量保存商品价格和数量,条件判断检查数量是否有效,循环则处理多笔订单。下面的程序可直接运行:

prices = [12.5, 8.0, 20.0]
quantities = [2, 0, 1]
total = 0.0

for index in range(len(prices)):
    price = prices[index]
    quantity = quantities[index]

    if quantity < 0:
        print("数量不能为负数")
        continue

    total = total + price * quantity

print("合计:", total)

示例输出合计 45.0。这里假定两个列表长度相同,且价格和数量已经是合适的数值;真实程序不能只靠这个假设。若两个列表长度不同,按一个列表的长度访问另一个列表可能触发 IndexError。可以先验证数据,或在结构允许时使用 zip() 配对遍历,并明确处理长度不匹配的问题。

示例还忽略了货币精度规则。显示为小数点后两位并不等于金额计算一定正确。实际收款系统需要依据币种和业务规则决定如何存储、舍入和计算金额,并使用经过设计和测试的货币处理方式。

五、输入校验、参数边界与安全

程序处理的值可能来自键盘、文件、网络请求、命令行参数或其他服务。不要因为变量已经叫作 age、count 就认为它符合要求。应根据业务规则检查类型、范围、长度、格式及相互关系。例如,一个用户数量可能必须是整数且不小于零;用户名可能有长度限制;两个日期之间可能必须符合先后关系。

参数限制没有适用于所有程序的统一数值。允许的最大长度、数量、文件大小和请求频率,应由业务需求、接口约定、系统资源以及部署环境共同决定。应记录实际规则,并在边界值处测试:空值、最小值、最大值、略低于下限、略高于上限和格式错误的值。对外部服务,也要遵循其文档中的参数约束、速率限制和错误处理约定;不要自行假设服务支持某个上限。

下面演示对用户输入的整数进行解析和范围检查。示例中的最大值 120 只是这个示例采用的业务规则,不是 Python 对整数的限制,也不代表所有应用都应使用此上限:

text = input("请输入 0 到 120 之间的整数:")

try:
    age = int(text)
except ValueError:
    print("请输入整数")
else:
    if 0 <= age <= 120:
        print("输入有效")
    else:
        print("超出允许范围")

输入校验有助于保持程序状态有效,也能减少意外错误,但不能单独构成完整的安全方案。客户端页面上的限制可能被绕过;重要规则应在实际处理数据的服务端再次验证。验证失败时应拒绝或安全处理数据,而不是悄悄把异常输入变成默认值,导致后续逻辑误判。

范围检查也不等于防止资源耗尽。如果程序允许用户指定循环次数、列表长度或文件大小,还应设置符合业务需要的上限,避免一次请求就要求执行过多工作、占用过多内存或耗费过长时间。具体阈值取决于系统容量、接口约定和业务场景,不能照搬一个对所有系统都安全的固定数字。必要时还要配置请求超时、并发控制、速率限制和资源配额。

输入校验也不能替代针对具体风险的安全措施。例如,将文本拼接进 SQL 查询存在注入风险;检查字符长度或过滤几个特殊字符,并不是可靠替代品。数据库访问应使用参数化查询或相应驱动提供的绑定参数接口。输出到 HTML 页面时,要根据输出上下文进行恰当编码;输出到命令行、日志或其他格式时,也要遵循对应场景的安全规则。不同风险有不同防护方式,不能只靠“过滤输入”概括解决。

六、新手常见错误清单

  • 把赋值和比较混淆:= 用于赋值,== 用于比较相等。
  • 忘记类型转换:input() 得到字符串,计算前要按预期转换,并处理转换失败的情况。
  • 忽略边界:range(1, 5) 不包含 5;列表索引从 0 开始,最后一个索引是长度减 1。
  • 循环条件没有变化:while 中更新变量的代码遗漏或方向错误,可能导致循环不结束。
  • 条件顺序不合理:较宽泛的条件先匹配,可能使后面的特定分支永远无法执行。
  • 把空值和零混为一谈:真值判断会把 0 当作假;需要区分“数值为零”和“没有值”时,应写清楚判断条件。
  • 修改列表时忽略索引变化:循环过程中删除元素可能让后续元素被跳过。可以先构造新列表,或遍历副本,并明确选择适合的方法。
  • 认为输入校验就是安全:格式和范围验证很重要,但数据库查询、HTML 输出和资源限制仍需使用各自适用的防护措施。

七、练习与检查思路

可以用三个小练习巩固概念:第一,读入两个数,判断它们的大小关系;第二,遍历一组整数,统计其中大于零的数量;第三,使用 while 反复询问用户输入,直到输入符合自己设定的范围。每个练习都要测试正常值,也要测试空输入、边界值和错误格式。

排查问题时,先看数据从哪里来、类型是什么,再看条件能否覆盖所有情况,最后检查循环何时开始、每轮改动了什么、何时结束。把这三个问题想清楚,很多初学阶段的错误就能定位:变量决定程序当前保存什么,条件判断决定走哪条路,循环决定同一套逻辑重复几次。

© 版权声明

相关文章