3. Python 基础速通(下):函数定义与第三方库实战
好,咱们接着聊。上一节我们把 Python 的基础语法过了一遍,今天要解决两个实际问题:怎么把重复的代码打包成函数,以及怎么用别人写好的库。说白了,就是让你从「手写每一行」变成「站在巨人的肩膀上干活」。
我个人习惯,学任何新语言,第一件事就是搞明白它的函数怎么写。因为函数就是你的「积木块」,搭好了,后面盖楼才快。
3.1 函数定义——把你的逻辑装进盒子里
先看一个最简单的场景:你要查 10 个地址的 ETH 余额。没有函数的时候,你得把同样的代码复制粘贴 10 遍。有了函数,你只需要写一次,然后调用 10 次。
Python 定义函数用 def 关键字,格式长这样:
def 函数名(参数1, 参数2, ...):
"""文档字符串,说明这个函数是干嘛的"""
# 函数体
return 返回值
举个例子,我写一个获取 ETH 余额的函数:
def get_eth_balance(address, api_key):
"""
通过 Etherscan API 获取指定地址的 ETH 余额
:param address: 钱包地址
:param api_key: Etherscan API Key
:return: 余额(单位:ETH)
"""
url = f"https://api.etherscan.io/api?module=account&action=balance&address={address}&tag=latest&apikey={api_key}"
# 这里先留个位置,后面我们用 requests 去请求
return balance
函数的好处是什么?封装、复用、可读性。你想想看,如果所有逻辑都堆在 main 函数里,那代码读起来就像一团乱麻。把每个独立功能拆成函数,调试的时候也方便——哪个函数出问题,单独测它就行。
3.2 第三方库安装——pip 是你的快递员
Python 强大在哪?生态。你要什么功能,基本都有现成的库。安装工具叫 pip,用法极其简单:
pip install 库名
我们今天要用三个库:
| 库名 | 用途 | 安装命令 |
|---|---|---|
| requests | 发送 HTTP 请求,调 API 就靠它 | pip install requests |
| pandas | 数据处理,表格操作神器 | pip install pandas |
| matplotlib | 画图,把数据可视化 | pip install matplotlib |
--user 参数,结果权限不够报错。如果你遇到 Permission denied,试试 pip install --user 库名。另外,建议用虚拟环境,别把全局 Python 搞乱了。
安装完成后,在代码里用 import 导入就能用了:
import requests
import pandas as pd
import matplotlib.pyplot as plt
嗯,这里要注意:import pandas as pd 是给 pandas 起了个别名 pd,后面写代码时用 pd 代替 pandas,省事。这是社区惯例,大家都这么写。
3.3 调用 Etherscan API——实战演练
好,理论讲完了,咱们直接上手。目标:用 Python 调用 Etherscan API,获取一个地址的 ETH 余额。
首先,你需要一个 Etherscan API Key。去 etherscan.io 注册账号,在「API Keys」页面生成一个。免费的,够用。
然后,看代码:
import requests
def get_eth_balance(address, api_key):
"""获取 ETH 余额"""
url = "https://api.etherscan.io/api"
params = {
"module": "account",
"action": "balance",
"address": address,
"tag": "latest",
"apikey": api_key
}
response = requests.get(url, params=params)
data = response.json()
if data["status"] == "1":
# 余额单位是 Wei,要除以 10^18 转换成 ETH
balance_wei = int(data["result"])
balance_eth = balance_wei / 10**18
return balance_eth
else:
print(f"API 请求失败:{data['message']}")
return None
# 使用示例
API_KEY = "你的API_KEY"
address = "0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae" # 以太坊基金会地址
balance = get_eth_balance(address, API_KEY)
if balance:
print(f"地址 {address} 的 ETH 余额:{balance:.4f} ETH")
requests.get(url, params=params)——把参数拼到 URL 后面,比手动拼接字符串优雅多了response.json()——直接把返回的 JSON 字符串转成 Python 字典int(data["result"])——Etherscan 返回的是字符串,要转成整数balance_wei / 10**18——Wei 转 ETH,1 ETH = 10^18 Wei
跑一下这段代码,你会看到类似这样的输出:
地址 0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae 的 ETH 余额:312456.7890 ETH
当然,以太坊基金会的余额不会这么少,我只是举个例子。你换成自己的地址试试看。
3.4 把数据存下来——pandas 登场
光查一个地址没意思,咱们查 5 个地址,把结果存成表格。这时候 pandas 就派上用场了:
import pandas as pd
addresses = [
"0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae",
"0x...", # 换成你自己的地址
# 再加几个地址
]
results = []
for addr in addresses:
balance = get_eth_balance(addr, API_KEY)
results.append({"地址": addr, "余额(ETH)": balance})
df = pd.DataFrame(results)
print(df)
df.to_csv("eth_balances.csv", index=False)
你看,几行代码就把数据存成了 CSV 文件。pandas 的 DataFrame 就像 Excel 表格,操作起来非常顺手。
3.5 画个图看看——matplotlib 可视化
数据有了,画个柱状图直观展示一下:
import matplotlib.pyplot as plt
# 假设 df 是上面那个 DataFrame
plt.figure(figsize=(10, 6))
plt.bar(df["地址"], df["余额(ETH)"])
plt.xlabel("钱包地址")
plt.ylabel("余额 (ETH)")
plt.title("各地址 ETH 余额对比")
plt.xticks(rotation=45) # 地址太长,旋转一下
plt.tight_layout()
plt.show()
运行后,会弹出一个窗口显示柱状图。如果你在 Jupyter Notebook 里,记得加一行 %matplotlib inline 让图表直接显示在页面里。
3.6 本章知识体系
我把今天讲的内容画成了一张图,帮你理清脉络:
这张图把今天的三个核心模块串起来了:函数定义是基础,第三方库是工具,Etherscan API 实战是应用场景。三者结合,你就能搭建自己的链上数据获取工具。
3.7 避坑总结
最后,分享几个我踩过的坑:
- API Key 别硬编码——我曾经把 Key 直接写在代码里,然后不小心上传到了 GitHub。几分钟后,邮箱里就收到了 Etherscan 的警告邮件。建议用环境变量或者配置文件。
- 请求频率限制——Etherscan 免费版每秒最多 5 个请求。如果你要查几千个地址,记得加
time.sleep(0.2)控制节奏。 - Wei 和 ETH 别搞混——Etherscan 返回的余额单位是 Wei,直接当 ETH 用的话,数值会大得离谱。除以 10^18 这个操作,我刚开始至少忘了三次。
- 异常处理——网络请求可能失败,API 可能返回错误。写代码时加个 try-except,别让程序直接崩溃。
好了,这一节的内容就到这。函数、第三方库、API 调用,这三个技能你掌握了,后面做链上数据分析就顺手多了。代码多敲几遍,别光看。
公众号:蓝海资料掘金营,微信deep3321