1
列表推导式
场景:根据一个列表,生成另一个新列表。
传统写法:
old_list = [1, 2, 3, 4, 5]new_list = []for i in old_list:if i % 2 == 0:new_list.append(i ** 2)print(new_list) # 结果: [4, 16]
高级写法(列表推导式):
old_list = [1, 2, 3, 4, 5]new_list = [i ** 2 for i in old_list if i % 2 == 0]print(new_list)
解析:把 for 循环和 if 判断压缩到一行。阅读顺序是从中间向外看。
2
字典推导式
场景:快速翻转字典的 Key 和 Value,或者批量处理字典的值。
传统写法:
old_dict = {'a':1,'b':2,'c':3}new_dict = {}for k,v in old_dict.items():new_dict[v] = kprint(new_dict) # 结果:{1: 'a', 2: 'b', 3: 'c'}
高级写法:
old_dict = {'a': 1, 'b': 2, 'c': 3}new_dict = {v: k for k, v in old_dict.items()}print(new_dict)
3
三元运算符
场景:根据条件给变量赋不同的值,用一行代替 if-else。
传统写法:
score = 85if score >= 60:result = "及格"else:result = "不及格"print(result)
高级写法:
score = 85result = "及格" if score >= 60else"不及格"print(result)
解析:语法是 结果A if 条件 else 结果B。条件为真返回A,否则返回B。比较常用。
4
链式比较
场景:判断一个值是否在某个区间内。
传统写法:
age = 25if age >= 18 and age <= 60:print("成年人")
高级写法:
age = 25if 18 <= age <= 60:print("成年人")
解析:Python 允许像数学公式一样把比较符连起来,不仅好看,而且效率更高。
5
解包赋值
场景:交换变量值,或者快速提取列表/元组中的元素。
传统写法:
# a b 交换值a = 1b = 2temp = aa = bb = temp# 提取坐标point = [111.9, 31.9]lon = point[0]lat = point[1]
高级写法:
# 交换变量a = 1b = 2a, b = b, a# 提取坐标point = [111.9, 31.9]lon, lat = point
解析:右侧的序列会自动按位置拆包,一一对应赋值给左侧的变量。
6
字典的.get()方法
场景:从字典取值,但如果 Key 不存在会报 KeyError,通常需要先判断。
传统写法:
data = {'name': 'Bob', 'age': 25}if 'gender' in data:gender = data['gender']else:gender = '未知'
高级写法:
data = {'name': 'Bob', 'age': 25}gender = data.get('gender', '未知')
解析:dict.get(key, default),如果 key 存在返回其值,不存在则返回 default,不设置 default 就返回None,完美避免报错。
7
f-string 格式化(Python 3.6+)
场景:把变量嵌入到字符串中。
传统写法:
data = {'name': 'Bob', 'age': 25}info = '姓名:' + data['name'] +',年龄:' + str(data['age'])print(info)# % 格式化info = '姓名:%s,年龄:%d' % (data['name'], data['age'])print(info)
高级写法:
data = {'name': 'Bob', 'age': 25}info = f'姓名:{data["name"]},年龄:{data["age"]}'print(info)
解析:只需在字符串前加个 f,就可以在 {} 里直接写 Python 变量甚至表达式(如 {age + 1})。
8
Any / All 函数
场景:判断一个列表里是否“存在”满足条件的元素,或者是否“所有”元素都满足条件。
传统写法:
nums = [2, 4, 6, 8]# 判断是否全为偶数all_even = Truefor n in nums:if n % 2 != 0:all_even = Falsebreak
高级写法:
nums = [2, 4, 6, 8]all_even = all(n % 2 == 0for n in nums) # 全为偶数?是否全部为Truehas_odd = any(n % 2 != 0for n in nums) # 有奇数?是否有一个为True
解析:结合生成器表达式,不仅代码短,而且 all 和 any 具有短路特性(只要发现一个 False/True 就立刻停止遍历),非常高效。
9
numpy 中用布尔索引过滤数据
场景:当用一个布尔数组作为索引去切片另一个数组时,NumPy 会只保留布尔数组中为 True 的对应位置的元素,把为 False 的元素扔掉。
传统写法:
import numpy as np# 监测点的经纬度lons = np.array([111.5, 110.0, 111.8, 112.5])lats = np.array([31.5, 31.2, 35.0, 31.8])# 监测值:如风度、湿度等values = np.array([10, 20, 30, 40])# 假设监测范围如下lon_min = 111lon_max = 112lat_min = 31lat_max = 32# 筛选出满足经纬度条件的new_lons = []new_lats = []new_values = []for i inrange(len(lons)):if (lons[i] >= lon_min) and (lons[i]<=lon_max) and (lats[i] >= lat_min) and(lats[i]<=lat_max):new_lons.append(lons[i])new_lats.append(lats[i])new_values.append(values[i])
高级写法:
# 将上面那段循环和判断替换成以下代码mask = (lons >= lon_min) & (lons <= lon_max) & (lats >= lat_min) & (lats <= lat_max)new_lons = lons[mask]new_lats = lats[mask]new_values = values[mask]
解析:
mask 是什么?
lons 和 lats 是 NumPy 数组。当它们和标量(比如 lon_min)进行 >= 比较时,结果是一个与原数组形状相同的布尔(Boolean)数组,里面只有 True 或 False。
mask 只是一个由 True 和 False 组成的数组,它记录了哪些索引位置上的站点是符合条件的。
mask 怎么过滤数据?
当用一个布尔数组作为索引去切片另一个数组时,NumPy 会只保留布尔数组中为 True 的对应位置的元素,把为 False 的元素扔掉。

推荐阅读
Python 环境部署:pip vs conda 全对比,别再踩坑了
点击 阅读原文 了解更多