4、Python基础速通(下):函数、循环、条件判断、文件读写
好,咱们接着聊。上一节我们把Python的数据类型和变量捋了一遍,算是把「食材」备齐了。这一节,咱们要开始学「怎么做菜」——也就是控制代码的执行流程。
说白了,编程就是告诉计算机:在什么条件下做什么事,重复做几次,以及把结果存到哪里。这三点,对应着条件判断、循环和文件读写。再加上函数这个「代码打包工具」,你就能写出真正可用的量化脚本了。
核心知识点一览:
- 函数:把重复代码打包,方便复用
- 条件判断:让代码根据情况走不同分支
- 循环:批量处理数据,省去重复劳动
- 文件读写:把分析结果保存下来,或者读取外部数据
4.1 函数:把代码打包成「工具」
函数是什么?我习惯把它理解成一个「黑箱子」。你往里扔原料(参数),它给你吐出成品(返回值)。中间怎么加工的,你不用管,只要知道它干什么就行。
在量化分析里,函数用得特别多。比如计算移动平均线、读取新闻数据、计算情绪得分——这些操作你不可能每次都重写一遍代码吧?
# 定义一个计算平均值的函数
def calculate_average(numbers):
total = sum(numbers)
count = len(numbers)
return total / count
# 调用它
scores = [0.8, 0.6, 0.9, 0.7]
avg = calculate_average(scores)
print(f"平均情绪得分: {avg}")
我的习惯:函数名一定要用动词开头,比如 get_news()、calc_score()、save_result()。这样一看就知道这个函数是干嘛的。我在项目里见过有人用 data() 这种名字,过两周自己都忘了它返回什么数据。
函数还有个重要概念叫「作用域」。简单说:函数里面定义的变量,外面用不了。反过来,外面定义的变量,函数里面可以读,但最好不要直接改。
# 作用域示例
news_text = "今天股市大涨" # 全局变量
def analyze_sentiment():
local_var = "局部变量" # 局部变量
print(news_text) # 可以读取全局变量
analyze_sentiment()
# print(local_var) # 这行会报错!
避坑指南:我曾经在写一个回测系统时,在函数内部不小心修改了全局变量,导致回测结果怎么都对不上。查了两天才发现是作用域的问题。记住:函数内部尽量只用参数和局部变量,别动外面的东西。
4.2 条件判断:让代码有「脑子」
条件判断,说白了就是「如果...就...否则...」。这是代码最基础的决策能力。
在新闻情绪分析里,你经常需要根据情绪得分做分类:得分大于0.5算正面,小于-0.5算负面,中间算中性。怎么写?
sentiment_score = 0.72
if sentiment_score > 0.5:
label = "正面"
elif sentiment_score < -0.5:
label = "负面"
else:
label = "中性"
print(f"情绪分类: {label}")
你想想看,这个逻辑是不是很直观?Python的 if/elif/else 就是按顺序检查条件,碰到第一个为真的就执行,然后跳过剩下的。
关键点:Python用缩进来表示代码块,而不是花括号。这既是优点也是坑。缩进不对,代码就跑不起来。我建议统一用4个空格,别混用Tab。
条件判断里经常用到布尔运算:and、or、not。比如你想筛选出「情绪得分高且新闻来源可靠」的数据:
score = 0.85
source = "Reuters"
if score > 0.7 and source in ["Reuters", "Bloomberg"]:
print("高置信度正面新闻,可以买入")
else:
print("需要进一步分析")
4.3 循环:批量处理的艺术
做量化分析,你面对的不是一条新闻,而是成千上万条。这时候循环就派上用场了。
Python有两种循环:for 和 while。我敢说,你在量化分析里90%的情况用 for 就够了。
# 遍历新闻列表
news_list = ["利好", "利空", "中性", "利好"]
for news in news_list:
print(f"处理新闻: {news}")
# 这里可以调用你的情绪分析函数
有时候你需要同时拿到索引和值,用 enumerate():
for idx, news in enumerate(news_list):
print(f"第{idx+1}条新闻: {news}")
我的经验:处理大量数据时,for 循环可能比较慢。如果你要遍历几十万条新闻,建议用列表推导式或者 map() 函数。比如 [calc_score(n) for n in news_list] 比写循环快得多。
while 循环用得少,但有时候有用。比如你不知道要循环多少次,直到某个条件满足才停:
# 模拟不断获取最新新闻,直到获取到10条
news_count = 0
while news_count < 10:
new_news = fetch_latest_news() # 假设这个函数存在
if new_news:
news_count += 1
print(f"已获取{news_count}条新闻")
# 如果没获取到,继续循环
避坑指南:我曾经写 while 循环时忘了加终止条件,结果程序跑成了死循环,CPU飙到100%,电脑差点死机。记住:写 while 一定要确保条件最终会变成 False,或者用 break 手动跳出。
4.4 文件读写:把数据存下来
分析完新闻情绪,你得把结果保存下来吧?或者从外部文件读取新闻数据?这就用到文件读写了。
Python最常用的文件操作是 open() 配合 with 语句。为什么用 with?因为它会自动关闭文件,省得你忘了关导致资源泄漏。
# 写入文件
with open("sentiment_result.txt", "w", encoding="utf-8") as f:
f.write("新闻标题: 今日股市大涨\n")
f.write("情绪得分: 0.85\n")
f.write("分类: 正面\n")
# 读取文件
with open("sentiment_result.txt", "r", encoding="utf-8") as f:
content = f.read()
print(content)
在量化分析里,更常见的是读写CSV和JSON格式。CSV适合表格数据,JSON适合结构化数据。
import csv
import json
# 写入CSV
news_data = [
{"title": "利好", "score": 0.85, "label": "正面"},
{"title": "利空", "score": -0.72, "label": "负面"},
]
with open("news_sentiment.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=["title", "score", "label"])
writer.writeheader()
writer.writerows(news_data)
# 写入JSON
with open("news_sentiment.json", "w", encoding="utf-8") as f:
json.dump(news_data, f, ensure_ascii=False, indent=2)
我的习惯:读写文件时,永远指定 encoding="utf-8"。中文新闻里经常有特殊字符,不指定编码很容易报错。我刚开始做项目时吃过这个亏,读一个中文新闻文件直接崩了,后来养成了这个习惯。
读取CSV文件也很简单:
with open("news_sentiment.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
print(f"标题: {row['title']}, 得分: {row['score']}")
4.5 综合小实战:新闻情绪分析流水线
好了,知识点都过了一遍。咱们把它们串起来,写一个简单的新闻情绪分析流水线。虽然现在还没讲到真正的NLP,但我们可以模拟一下流程。
import csv
import json
# 1. 定义情绪分析函数(模拟)
def analyze_sentiment(text):
"""模拟情绪分析,返回得分和标签"""
# 这里只是演示,实际会用NLP模型
if "涨" in text or "利好" in text:
return 0.85, "正面"
elif "跌" in text or "利空" in text:
return -0.72, "负面"
else:
return 0.0, "中性"
# 2. 读取新闻数据(从CSV)
news_list = []
with open("raw_news.csv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
news_list.append(row["content"])
# 3. 批量分析情绪
results = []
for idx, news in enumerate(news_list):
score, label = analyze_sentiment(news)
results.append({
"id": idx + 1,
"content": news,
"score": score,
"label": label
})
print(f"第{idx+1}条: {label} (得分: {score})")
# 4. 保存结果
with open("sentiment_results.json", "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
print("分析完成,结果已保存到 sentiment_results.json")
这段代码展示了什么?
- 函数封装了分析逻辑
- 条件判断决定了情绪分类
- 循环批量处理了所有新闻
- 文件读写完成了数据输入输出
这就是一个完整的量化分析小工具了。
嗯,这一节的内容就到这里。函数、条件判断、循环、文件读写——这四个东西组合起来,你已经能写出不少实用的量化脚本了。下一节我们会把这些基础应用到真正的金融数据上,开始接触Pandas这个神器。