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 本章知识体系

我把今天讲的内容画成了一张图,帮你理清脉络:

Python 基础速通(下)知识体系 函数定义 第三方库安装 Etherscan API 实战 def 关键字 参数与返回值 文档字符串 pip install requests(HTTP请求) pandas(数据处理) matplotlib(可视化) 获取 API Key 构造请求参数 解析 JSON 响应 Wei → ETH 转换 最终产出:可复用的链上数据获取工具

这张图把今天的三个核心模块串起来了:函数定义是基础,第三方库是工具,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