如何精简for循环代码 实现仅单次执行获取站点名称
问题背景
需要在遍历CSV读取行的循环中仅获取一次气象站点名称,原实现通过flag标记控制单次赋值,逻辑冗余不够精巧,寻求更优实现。
相关变量说明
row:从CSV文件中读取得到的单行数据station_h:气象站点名称对应的列索引station:存储最终输出的气象站点名称的变量
原实现代码
for row in reader: self._get_station_name(row) # 其他循环业务逻辑 ... def _get_station_name(self, row): """单次获取站点名称""" if self.station_flag: self.station = row[self.station_h] self.station_flag = False
优化方案(按推荐度排序)
方案1:将取值逻辑移到循环外(最优)
既然站点名只需要取一次,完全没必要把取值判断塞进每轮循环做无效校验。CSV的reader本身是迭代器,可以直接先取出对应行拿到站点名,再继续遍历,彻底消除循环内的冗余判断:
import itertools # 若站点名在第一行,直接取第一行赋值即可 first_row = next(reader) self.station = first_row[self.station_h] # 通过chain把第一行拼回迭代流,避免漏处理第一行的业务逻辑 for row in itertools.chain([first_row], reader): # 直接写其他循环逻辑即可,不需要额外调用站点名获取方法 ...
如果站点名不在第一行,只需要先迭代reader到目标行拿到站点名,再继续后续遍历即可,逻辑完全一致。
方案2:移除冗余flag变量,简化内联判断
如果受业务逻辑限制,必须把取值逻辑放在循环内,可以删掉单独维护的station_flag状态变量:初始化时直接将self.station设为None,通过判断站点名是否已赋值来控制单次执行:
# 初始化阶段设置 self.station = None for row in reader: if self.station is None: self.station = row[self.station_h] # 其他业务逻辑 ...
这种写法少维护一个状态变量,逻辑更直观,也不需要为了几行判断额外抽一个单独方法,代码更紧凑。
注意:如果站点名可能为空字符串,不要用
if not self.station做判断,if self.station is None的写法更严谨,避免空值时重复触发赋值。
原实现的问题
原写法额外维护flag变量、拆分独立方法的模式,会让循环每处理一行都执行一次无意义的函数调用和条件判断,当CSV行数较多时会产生不必要的开销,多出来的状态变量也会增加后续代码的维护成本。
内容的提问来源于stack exchange,提问作者404rorre
相关产品推荐
相关产品推荐

