3. Python基础语法与农业数据表达
在农业数据分析中,我们面对的第一类真实问题往往并不复杂:一块试验田里种了若干小区的小麦,每个小区收获后称得一个产量数字,现在需要把这些数字记录下来,并算出平均产量。这个问题看似简单,却恰好把 Python 最核心的几类语法元素串在了一起——变量用来给数据起名字,数据类型决定数据能做什么运算,列表用来把一组同质数据组织在一起,循环用来逐个处理,条件用来筛选异常值。本节就以"多个地块小麦产量求平均"为主线,把这些语法点讲透。
变量与数据类型:给农业数据一个合适的"容器"
变量本质上是名字与对象之间的绑定关系。在 Python 中写 plot_yield = 6.85,解释器会创建一个浮点数对象,并让名字 plot_yield 指向它。农业数据常见的类型有四种:整数 int 表示穗数、株数这类计数;浮点数 float 表示产量、含水量、千粒重这类连续测量值;字符串 str 表示品种名、地块编号;布尔值 bool 表示是否灌溉、是否发病这类二值状态。类型不是装饰,它直接决定运算行为:两个整数相加得整数,整数与浮点数相加得浮点数,而字符串相加是拼接而非求和。
一个容易被忽视的坑是输入数据的类型。从文件或键盘读入的产量往往是字符串,例如 "6.85",直接参与求和会报错或得到拼接结果。因此实际处理时要用 float() 显式转换。可以用 type() 查看类型,用 isinstance() 做判断。命名上建议使用能表达农业含义的英文小写加下划线,如 plot_yield、grain_moisture,避免 a、b 这类无信息量的名字。
列表:把多个地块的产量组织成一组
当产量不止一个时,用列表最自然。yields = [6.85, 7.12, 6.43, 7.58, 6.91] 表示 5 个小区的小麦产量(单位:吨/公顷,示例数据)。列表是有序、可变的序列,支持索引 yields[0] 取第一个、切片 yields[1:3] 取第二到第三个、len(yields) 取长度、append() 追加、sort() 排序。求平均值最直接的方式是 sum(yields) / len(yields),本例结果为 6.978。这里要提醒:len() 为 0 时会产生除零错误,实际代码应先判断列表是否为空。
列表适合存放"同一种东西的多个观测值"。如果每个地块还带有编号、品种、是否灌溉等属性,单靠列表就会退化成"位置记忆",容易出错,这时应改用字典或"字典组成的列表"。
字典:给每个地块挂上多个属性
字典用键值对表达"一个对象的多个字段"。例如 plot = {"id": "A01", "variety": "济麦22", "yield": 6.85, "irrigated": True}。通过 plot["yield"] 按键取值,比按位置取值可读性高得多。多个地块可以组织成列表套字典:plots = [{"id": "A01", "yield": 6.85}, {"id": "A02", "yield": 7.12}, ...],这是农业数据中最常见的结构,也最接近表格的一行一记录。取值时建议用 plot.get("yield", 0) 提供默认值,避免键不存在时抛 KeyError。
条件与循环:逐个处理并做出判断
循环负责"对每个地块做同一件事",条件负责"根据数据情况走不同分支"。下面的示例把列表、循环、条件、累加组合起来,计算平均产量并统计高于均值的地块数:
yields = [6.85, 7.12, 6.43, 7.58, 6.91]
total = 0.0
for y in yields:
total += y
avg = total / len(yields)
print(f"平均产量: {avg:.2f} 吨/公顷")
above = 0
for y in yields:
if y > avg:
above += 1
print(f"高于均值的地块数: {above}")
这段代码的预期输出是平均产量 6.98、高于均值的地块数 2(示例数据下的计算结果)。循环变量 y 依次取列表中的每个值,total += y 是累加,if y > avg 是条件判断。注意 avg 必须在第二个循环之前算好,否则比较对象不存在。缩进在 Python 中是语法的一部分,循环体和条件体必须统一缩进四个空格。
实际数据常含缺失或异常,例如某小区因倒伏未收获,产量记为 None 或 -1。此时应在循环中加入过滤:if y is None or y <= 0: continue,跳过无效值再累加,同时单独计数有效样本,用有效样本数作分母,而不是列表长度。这是农业数据处理中非常关键的一步,否则平均值会被异常值严重拉偏。
len() 更稳妥,也便于在报告中说明"基于 N 个有效小区计算"。把本节语法串成一条完整的数据处理链
下图把"原始产量记录 → 类型转换与有效性过滤 → 累加求和 → 计算均值 → 条件筛选高于均值地块"这条处理链,以及列表、字典、循环、条件各自在链中的位置画在一起,便于对照代码理解数据如何一步步流动。
常见错误与检查要点
初学者在这条链上最容易出三类问题。第一类是类型问题:把字符串产量直接相加,得到的是拼接结果而非数值和,表现为"平均值"异常巨大或报错,解决方法是先 float() 转换。第二类是分母问题:用列表长度作分母,但列表里含 None 或负值,导致均值偏低,解决方法是过滤后单独计数。第三类是作用域与顺序问题:在循环内计算均值、或在均值尚未算出时就做比较,导致结果错误。建议每次写完先打印中间量 total、n、avg 核对,再输出最终结论。
把本节内容落到一个可复用的写法上:用列表存产量,用循环累加并过滤无效值,用有效个数求均值,再用条件统计高于均值的地块。这套"列表 + 循环 + 条件"的组合,是后续用 pandas 处理更大规模农业数据之前的必要基本功,理解它,才能看懂更高层工具在背后替你做了什么。