2、Python核心语法速通:变量与数据类型、列表与字典操作、函数与模块化编程、文件读写与异常处理
说实话,很多初学者一上来就啃厚厚的语法书,结果没几天就放弃了。我当年也是这样。后来我发现,学Python语法不用面面俱到,抓住最核心的几块就够了。今天咱们就直奔主题,把数据科学里最常用的语法过一遍。
2.1 变量与数据类型:先搞清楚你的数据长什么样
Python里的变量,说白了就是个标签。你把数据贴个名字,方便后面调用。不用像C语言那样先声明类型,直接赋值就行。
# 这就是变量
name = "小明"
age = 25
height = 1.75
is_student = True
这里有几个常见的数据类型,我列个表给你看:
| 类型 | 例子 | 说明 |
|---|---|---|
| int | 25, -3, 0 | 整数,没有小数点 |
| float | 3.14, -0.5, 1.0 | 浮点数,带小数点 |
| str | "hello", 'Python' | 字符串,用引号包着 |
| bool | True, False | 布尔值,注意首字母大写 |
| NoneType | None | 空值,表示什么都没有 |
我的小习惯:变量名尽量用英文,别用拼音。比如用
user_name 而不是 yonghuming。我在项目里见过一堆拼音变量,三个月后自己都看不懂了。
还有个容易踩坑的地方——类型转换。比如从文件读到的数字其实是字符串,你得手动转一下:
# 字符串转整数
price_str = "99.8"
price = float(price_str) # 变成 99.8
# 整数转字符串
count = 10
message = "总共" + str(count) + "个" # 变成 "总共10个"
我曾经犯过的错:直接用
int("3.14") 会报错!因为字符串里带小数点,得先用 float() 转成浮点数,再转整数。
2.2 列表与字典操作:数据科学的两大法宝
做数据分析,天天跟列表和字典打交道。这两个东西用好了,效率翻倍。
列表:有序的集合
列表就像个购物清单,按顺序放东西。你可以往里面加、删、改、查。
# 创建列表
fruits = ["苹果", "香蕉", "橘子"]
# 常用操作
fruits.append("葡萄") # 末尾添加
fruits.insert(1, "草莓") # 指定位置插入
fruits.remove("香蕉") # 删除指定元素
popped = fruits.pop() # 弹出最后一个元素
print(fruits[0]) # 访问第一个元素
print(fruits[-1]) # 访问最后一个元素
print(len(fruits)) # 获取长度
列表推导式是我特别喜欢的一个特性,一行代码搞定循环:
# 普通写法
squares = []
for i in range(10):
squares.append(i ** 2)
# 列表推导式(推荐)
squares = [i ** 2 for i in range(10)]
# 带条件的推导式
even_squares = [i ** 2 for i in range(10) if i % 2 == 0]
字典:键值对的映射
字典就像个通讯录,通过名字(键)找到电话(值)。在数据处理里,字典常用来存结构化数据。
# 创建字典
student = {
"name": "张三",
"age": 20,
"scores": [85, 92, 78]
}
# 常用操作
print(student["name"]) # 获取值
student["grade"] = "大二" # 添加新键值对
student["age"] = 21 # 修改值
del student["scores"] # 删除键值对
# 安全获取(不存在时返回默认值)
grade = student.get("grade", "未知")
# 遍历字典
for key, value in student.items():
print(f"{key}: {value}")
实战经验:我在处理CSV文件时,经常把每一行数据转成字典,字段名做键,字段值做值。这样后面操作起来特别方便,代码可读性也高。
2.3 函数与模块化编程:别重复造轮子
写代码最忌讳的就是复制粘贴。把重复的逻辑封装成函数,这是专业程序员的基本素养。
定义函数
def calculate_bmi(weight, height):
"""计算BMI指数"""
bmi = weight / (height ** 2)
return bmi
# 调用函数
my_bmi = calculate_bmi(70, 1.75)
print(f"你的BMI是: {my_bmi:.2f}")
函数有几个要点我提醒一下:
- 参数默认值:给参数设个默认值,调用时可以省略
- 返回值:可以返回多个值,实际上是个元组
- 文档字符串:函数开头用三引号写说明,方便别人(包括未来的你)理解
def create_user(name, age=18, city="北京"):
"""创建用户信息字典
参数:
name: 用户名
age: 年龄,默认18
city: 城市,默认北京
返回:
包含用户信息的字典
"""
return {
"name": name,
"age": age,
"city": city
}
# 不同调用方式
user1 = create_user("小明")
user2 = create_user("小红", 20, "上海")
user3 = create_user("小刚", city="广州")
模块化:把代码分门别类
一个文件写几千行代码,找起来太痛苦了。我习惯把相关功能放到不同文件里。
# 假设有个文件叫 data_utils.py
def load_data(filepath):
print(f"加载数据: {filepath}")
# 实际加载逻辑...
def clean_data(data):
print("清洗数据...")
# 实际清洗逻辑...
# 在另一个文件里导入使用
import data_utils
data = data_utils.load_data("sales.csv")
clean_data = data_utils.clean_data(data)
我的建议:每个模块只做一件事。比如
data_loader.py 只管加载数据,data_cleaner.py 只管清洗。这样出了问题,定位也快。
2.4 文件读写与异常处理:让程序更健壮
数据科学离不开文件操作。读CSV、写JSON、保存模型,都得跟文件打交道。同时,程序跑着跑着出错了怎么办?异常处理就是你的安全网。
文件读写
Python里最推荐用 with 语句,它会自动帮你关闭文件,省心。
# 读取文件
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
# 逐行读取(适合大文件)
with open("data.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip()) # strip()去掉换行符
# 写入文件
with open("output.txt", "w", encoding="utf-8") as f:
f.write("第一行\n")
f.write("第二行\n")
# 追加写入
with open("output.txt", "a", encoding="utf-8") as f:
f.write("追加的内容\n")
文件模式我整理了一下:
| 模式 | 说明 |
|---|---|
| 'r' | 只读,文件必须存在 |
| 'w' | 写入,会覆盖原有内容 |
| 'a' | 追加,在末尾添加内容 |
| 'r+' | 读写,文件必须存在 |
我曾经踩过的坑:用 'w' 模式打开文件时,如果文件不存在会新建,但如果文件存在,里面的内容会被清空!有一次我不小心把重要的配置文件覆盖了,从那以后我写文件前都会先检查一下。
异常处理:别让程序崩掉
程序运行中会遇到各种意外:文件找不到、网络超时、除数为零……用 try-except 来兜底。
try:
# 可能会出错的代码
with open("config.json", "r") as f:
config = f.read()
number = int(config)
result = 100 / number
except FileNotFoundError:
print("配置文件不存在,使用默认配置")
config = '{"setting": "default"}'
except ValueError:
print("配置文件内容不是有效的数字")
except ZeroDivisionError:
print("配置文件中数字不能为0")
except Exception as e:
print(f"发生了未知错误: {e}")
else:
# 没有异常时执行
print("一切正常!")
finally:
# 不管有没有异常都会执行
print("清理资源...")
异常处理的几个要点:
- 精确捕获:尽量指定异常类型,别一股脑用
except: - 多个except:按顺序捕获,子类在前,父类在后
- else和finally:else在无异常时执行,finally总是执行
- 主动抛出:用
raise主动触发异常
def divide_numbers(a, b):
if b == 0:
raise ValueError("除数不能为0")
return a / b
try:
result = divide_numbers(10, 0)
except ValueError as e:
print(f"计算错误: {e}")
实战经验:我在做数据清洗时,经常遇到脏数据。比如某列应该是数字,但有些行是空字符串。这时候用
try-except 跳过这些行,比一个个检查高效得多。
好了,Python核心语法就讲这么多。你想想看,变量、列表、字典、函数、文件、异常——这些就是数据科学里最常用的语法了。别贪多,先把这些练熟,后面学Pandas、NumPy就轻松多了。