灵语lingyu

官方示例

下方代码逐个拷贝为 *.灵 文件,即可用 lingyu 文件名.灵 直接运行。全部源码位于灵语项目 examples/ 目录。点「在线运行」不用安装也能玩。

hello.灵

14 行
从 系统 导入 参数

定义 斐波那契(n):
    若 n <= 1:
        返回 n
    返回 斐波那契(n - 1) + 斐波那契(n - 2)

定义 主函数():
    打印("你好,灵语!")
    打印("斐波那契(10) =", 斐波那契(10))
    打印("命令行参数:", 参数[1:])

若 __名__ == "__main__":
    主函数()

九九乘法表.灵

7 行

九九乘法表:教学示例 —— 嵌套循环 / 格式化输出

# 九九乘法表:教学示例 —— 嵌套循环 / 格式化输出

循环 行数 于 范围(1, 10):
    行 = ""
    循环 列数 于 范围(1, 行数 + 1):
        行 = 行 + f"{行数}×{列数}={行数 * 列数:<4}"
    打印(行)

全角示例.灵

8 行
总和 = 0
循环 x 于 范围(5):
    总和 += x
打印("总和 =", 总和)
若 总和 == 10:
    打印("正确!")
否则:
    打印("错误")

列表与字典.灵

22 行

列表与字典:教学示例 —— 容器 / 循环 / 常用内置

# 列表与字典:教学示例 —— 容器 / 循环 / 常用内置

水果 = 列表()
水果.追加("苹果")
水果.追加("香蕉")
水果.追加("橘子")

打印("共有 " + 字符串(长度(水果)) + " 种水果")
循环 序号 于 范围(长度(水果)):
    打印(字符串(序号 + 1) + ". " + 水果[序号])

分数 = 字典()
分数["小明"] = 92
分数["小红"] = 88
分数["小刚"] = 97

总成绩 = 求和(分数.值列表())
平均分 = 总成绩 / 长度(分数)
打印("平均分:" + 字符串(平均分))

最低分 = 最小值(分数.值列表())
打印("最低分:" + 字符串(最低分))

多文件示例.灵

5 行
导入 数学工具箱

打印("3 的平方 =", 数学工具箱.平方(3))
打印("半径 2 圆的面积 =", 数学工具箱.圆面积(2))
打印("3-4-5 直角三角形的斜边 =", 数学工具箱.斜边(3, 4))

数学工具箱.灵

10 行
导入 数学

定义 平方(x):
    返回 x * x

定义 圆面积(r):
    返回 数学.圆周率 * r * r

定义 斜边(a, b):
    返回 数学.平方根(平方(a) + 平方(b))

数据框示例.灵

12 行

跑法:python -m lingyu examples\数据框示例.灵

# 灵语 M10 演示:写中文版代码——导入中文库名、用中文 API
# 跑法:python -m lingyu examples\数据框示例.灵
导入 数据框库

表 = 数据框库.数据框({"甲": [1, 2, 3], "乙": [4, 5, 6]})

打印("—— 数据表头部 ——")
打印(表.头部(2))          # 实例中文方法 .头部 → pandas.head

打印("—— 中文 API ——")
打印("平均 =", 表.平均())      # .平均 → DataFrame.mean
打印("求和 =", 表.求和())      # .求和 → DataFrame.sum

文本统计.灵

18 行

文本统计:教学示例 —— 文件读取 / 字典计数 / 排序

# 文本统计:教学示例 —— 文件读取 / 字典计数 / 排序

文本 = "山外青山楼外楼 西湖歌舞几时休 暖风熏得游人醉 直把杭州作汴州"

词表 = 文本.字符替换(" ", "")
字典统计 = 字典()
循环 每个字 于 词表:
    若 每个字 于 字典统计:
        字典统计[每个字] = 字典统计[每个字] + 1
    否则:
        字典统计[每个字] = 1

统计结果 = []
循环 字符 于 字典统计:
    统计结果.追加([-字典统计[字符], 字符])

循环 次数, 字符 于 排序(统计结果):
    打印(字符, "出现", -次数, "次")

未命名.灵

247 行

不再因缺第三方库整体崩溃,也无 e/exec 类英文残留。

# 灵语备忘录 —— Qt 图形界面版
# 跑法:python -m lingyu examples\未命名.灵
# #42/#43:界面需 PySide6(pip install PySide6);缺失时示例优雅降级为提示并正常退出,
# 不再因缺第三方库整体崩溃,也无 e/exec 类英文残留。

导入 系统
从 系统 导入 参数
导入 JSON
从 lingyu.i18n 导入 汉化, 注册词表

# #42:非 PySide6 环境不硬崩——占位同名类使函数/类体可编译,入口处按 界面可用 分流
尝试:
    从 PySide6.QtWidgets 导入 QMainWindow, QWidget, QLineEdit
    从 PySide6.QtWidgets 导入 QPushButton, QScrollArea, QCheckBox, QLabel
    从 PySide6.QtWidgets 导入 QVBoxLayout, QHBoxLayout, QApplication
    注册词表({"执行": "exec"})   # #43:应用.执行() → exec()(规避英文残留)
    汉化(QApplication)
    界面可用 = 真
捕获 模块未找到:
    界面可用 = 假
    QMainWindow = QWidget = QLineEdit = QPushButton = 对象
    QScrollArea = QCheckBox = QLabel = QApplication = 对象
    QVBoxLayout = QHBoxLayout = 对象

数据文件 = "我的备忘录.json"

类 主窗口(QMainWindow):
    定义 初始化(自身):
        父类().初始化()          # 正确调用 super().__init__()
        自身.备忘录数据 = []
        自身.当前过滤文本 = ""

        自身.setWindowTitle("📒 灵语备忘录")
        自身.setFixedSize(520, 700)

        中央部件 = QWidget()
        自身.setCentralWidget(中央部件)
        主布局 = QVBoxLayout(中央部件)
        主布局.setSpacing(12)
        主布局.setContentsMargins(16, 16, 16, 16)

        自身.setStyleSheet("""
            QMainWindow {
                背景: #f0f2f5;
            }
            QLineEdit {
                边框: 2px solid #d1d5db;
                边框半径: 12px;
                背景: #ffffff;
                字体大小: 14px;
                内边距: 10px 14px;
            }
            QLineEdit:focus {
                边框: 2px solid #6366f1;
            }
            QPushButton {
                边框: 无;
                边框半径: 12px;
                背景: #6366f1;
                颜色: white;
                字体大小: 13px;
                字体粗细: 600;
                内边距: 10px 18px;
            }
            QPushButton:hover {
                背景: #4f46e5;
            }
            QPushButton#删除按钮 {
                背景: #f43f5e;
                最小宽度: 30px;
                最大宽度: 30px;
                最小高度: 30px;
                最大高度: 30px;
                边框半径: 15px;
                内边距: 0px;
            }
            QPushButton#删除按钮:hover {
                背景: #e11d48;
            }
            QScrollArea {
                边框: 无;
                背景: 透明;
            }
            QWidget#条目背景 {
                背景: #ffffff;
                边框半径: 12px;
            }
        """)

        搜索框 = QLineEdit()
        搜索框.setPlaceholderText("🔍 搜索备忘录内容...")
        搜索框.textChanged.connect(自身.当搜索变化)
        主布局.addWidget(搜索框)

        添加布局 = QHBoxLayout()
        自身.输入框 = QLineEdit()
        自身.输入框.setPlaceholderText("写点什么...")
        自身.输入框.returnPressed.connect(自身.添加备忘录)
        添加按钮 = QPushButton("➕ 新增")
        添加按钮.clicked.connect(自身.添加备忘录)

        添加布局.addWidget(自身.输入框, 3)
        添加布局.addWidget(添加按钮, 1)
        主布局.addLayout(添加布局)

        自身.滚动区域 = QScrollArea()
        自身.滚动区域.setWidgetResizable(真)
        自身.滚动区域.setStyleSheet("背景: 透明; 边框: 无;")

        自身.容器 = QWidget()
        自身.容器.setObjectName("条目背景")
        自身.容器布局 = QVBoxLayout(自身.容器)
        自身.容器布局.setSpacing(10)
        自身.容器布局.setContentsMargins(8, 8, 8, 8)
        自身.容器布局.addStretch(1)

        自身.滚动区域.setWidget(自身.容器)
        主布局.addWidget(自身.滚动区域)

        底部布局 = QHBoxLayout()
        自身.计数标签 = QLabel("共 0 项")
        自身.计数标签.setStyleSheet("颜色: #6b7280; 字体大小: 12px;")
        底部布局.addWidget(自身.计数标签)

        底部布局.addStretch(1)

        清空完成按钮 = QPushButton("✅ 清除已完成")
        清空完成按钮.clicked.connect(自身.清除已完成)
        底部布局.addWidget(清空完成按钮)

        主布局.addLayout(底部布局)

        自身.加载数据()
        自身.刷新列表()

    # ---------- 核心功能 ----------
    定义 添加备忘录(自身):
        文本 = 自身.输入框.text().strip()
        若 文本:
            自身.备忘录数据.追加({"文本": 文本, "完成": 假})
            自身.输入框.clear()
            自身.保存数据()
            自身.刷新列表()

    定义 切换完成状态(自身, 索引):
        若 0 <= 索引 < 长度(自身.备忘录数据):
            自身.备忘录数据[索引]["完成"] = 非 自身.备忘录数据[索引]["完成"]
            自身.保存数据()
            自身.刷新列表()

    定义 删除指定(自身, 索引):
        若 0 <= 索引 < 长度(自身.备忘录数据):
            自身.备忘录数据.弹出(索引)
            自身.保存数据()
            自身.刷新列表()

    定义 清除已完成(自身):
        新数据 = []
        循环 项 于 自身.备忘录数据:
            若 非 项["完成"]:
                新数据.追加(项)
        自身.备忘录数据 = 新数据
        自身.保存数据()
        自身.刷新列表()

    定义 当搜索变化(自身, 文本):
        自身.当前过滤文本 = 文本
        自身.刷新列表()

    定义 刷新列表(自身):
        循环 i 于 反转(范围(自身.容器布局.count())):
            项 = 自身.容器布局.itemAt(i)
            若 项.widget() 且 项.widget() 是 QWidget:
                项.widget().deleteLater()
            删除 项

        过滤词 = 自身.当前过滤文本.strip().lower()
        显示列表 = []
        循环 项 于 自身.备忘录数据:
            若 过滤词 == "" 或 过滤词 于 项["文本"].lower():
                显示列表.追加(项)

        索引 = 0
        循环 数据 于 显示列表:
            条目 = QWidget()
            条目.setStyleSheet("""
                背景: #ffffff;
                边框半径: 12px;
            """)
            条目布局 = QHBoxLayout(条目)
            条目布局.setContentsMargins(12, 12, 12, 12)

            复选框 = QCheckBox()
            复选框.setChecked(数据["完成"])
            复选框.stateChanged.connect(匿名函数 checked, idx=索引: 自身.切换完成状态(idx))
            条目布局.addWidget(复选框)

            标签 = QLabel(数据["文本"])
            标签.setWordWrap(真)
            若 数据["完成"]:
                标签.setStyleSheet("文字修饰: 贯穿线; 颜色: #9ca3af; 字体大小: 14px;")
            否则:
                标签.setStyleSheet("颜色: #1f2937; 字体大小: 14px;")
            条目布局.addWidget(标签, 1)

            删除钮 = QPushButton("✕")
            删除钮.setObjectName("删除按钮")
            删除钮.clicked.connect(匿名函数 _, idx=索引: 自身.删除指定(idx))
            条目布局.addWidget(删除钮)

            自身.容器布局.insertWidget(自身.容器布局.count() - 1, 条目)
            索引 += 1

        自身.计数标签.setText(f"共 {长度(显示列表)} 项 / 总计 {长度(自身.备忘录数据)} 项")

    # ---------- 数据持久化 ----------
    定义 保存数据(自身):
        尝试:
            使用 打开(数据文件, "w", 编码="utf-8") 作为 f:
                JSON.转储(自身.备忘录数据, f, 确保ascii=假, 缩进=2)
        捕获 异常 作为 失败原因:
            打印("⚠️ 保存失败:", 失败原因)

    定义 加载数据(自身):
        尝试:
            使用 打开(数据文件, "r", 编码="utf-8") 作为 f:
                自身.备忘录数据 = JSON.加载(f)
        捕获 文件未找到:
            自身.备忘录数据 = []
        捕获 异常 作为 失败原因:
            打印("⚠️ 加载数据出错,重置为空。", 失败原因)
            自身.备忘录数据 = []

# ---------- 程序入口 ----------
若 __名__ == "__main__":
    若 非 界面可用:
        # 无 PySide6:示例仍可运行,提示安装后体验完整界面
        打印("📒 未命名.灵 的图形界面需要 PySide6,请先安装:")
        打印("    pip install PySide6")
        系统.退出(0)
    # 安全处理 QApplication 单例(通常不需要,但以防万一)
    应用 = QApplication.instance()
    若 应用 是 空:
        应用 = QApplication(参数)
    窗口 = 主窗口()
    窗口.show()
    系统.退出(应用.执行())

猜数字游戏.灵

25 行

猜数字游戏:教学示例 —— 循环 / 条件 / 输入 / 随机 / 整数转换

# 猜数字游戏:教学示例 —— 循环 / 条件 / 输入 / 随机 / 整数转换

导入 随机

秘密号 = 随机.随机整数(1, 100)
次数 = 0

打印("我已想好一个 1 到 100 之间的数字……")

当 真:
    尝试:
        猜测 = 整数(输入("请猜一个数字:"))
    捕获 EOF错误:
        打印("输入已结束,游戏中止。")
        退出循环
    次数 = 次数 + 1
    若 猜测 < 秘密号:
        打印("太小了,再大一点")
    否则若 猜测 > 秘密号:
        打印("太大了,再小一点")
    否则:
        打印(f"恭喜!猜中了,共猜了 {次数} 次")
        退出循环

打印("游戏结束。")

窗口示例.灵

19 行

跑法:python -m lingyu examples\窗口示例.灵

# 灵语 M9 演示:第三方库(tkinter)成员全程中文——「窗口.标题」合法
# 跑法:python -m lingyu examples\窗口示例.灵
从 lingyu.i18n 导入 汉化, 注册词表

导入 tkinter 作为 界面库

注册词表({"标题": "title", "几何": "geometry", "关闭": "destroy",
          "主循环": "mainloop", "更新": "update", "打包": "pack",
          "按钮": "Button", "标签": "Label", "绑定": "bind", "聚焦": "focus",
          "退出": "quit", "配置": "config", "文本": "text"})

汉化(界面库.Tk)

根 = 界面库.Tk()
根.标题("灵语窗口")       # .标题 → .title()
根.几何("240x120")         # .几何  → .geometry()
根.更新()                  # 立即渲染,不阻塞主循环
打印("窗口标题 =", 根.标题())   # 读取回显
根.关闭()                  # .关闭  → .destroy()

语法全览.灵

75 行

见 lingyu\keywords.py 的 METHODS 表),示例全程中文,无需切英文。

# 语法全览:一个例子串起灵语的主要语法点
# 运行:python -m lingyu examples\语法全览.灵
# 说明:容器/字符串/文件对象的方法名也有中文别名(追加/值列表/读/写/大写……,
#       见 lingyu\keywords.py 的 METHODS 表),示例全程中文,无需切英文。

导入 数学
导入 随机
导入 操作系统


定义 主():
    # 变量与基本类型
    名字 = "小明"
    年龄 = 16
    身高 = 1.72
    是学生 = 真

    # 容器
    科目 = ["语文", "数学", "英语"]
    成绩 = {名字: 92, "小红": 88}

    # 函数
    定义 介绍(某名):
        返回 f"{某名} 今年 {年龄} 岁,身高 {身高}"

    打印(介绍(名字))
    打印("科目数:", 长度(科目))
    打印("总分:", 求和(成绩.值列表()))
    打印("随机数:1~6 →", 随机.随机整数(1, 6))
    打印("半径4的圆的面积:", 数学.圆周率 * 4 * 4)
    打印("16 的平方根:", 数学.平方根(16))

    # 条件
    若 年龄 >= 18:
        打印("已成年")
    否则:
        打印("未成年")

    # 循环
    循环 序号 于 范围(长度(科目)):
        打印("科目", 序号 + 1, ":", 科目[序号])

    # 类与继承
    类 动物():
        定义 初始化(自身, 某名):
            自身.某名 = 某名
        定义 叫声(自身):
            返回 "……"

    类 猫(动物):
        定义 叫声(自身):
            返回 "喵"

    小猫 = 猫("团子")
    打印("多态:", 小猫.某名, "说", 小猫.叫声())

    # 异常处理
    尝试:
        打印(10 / 0)
    捕获 零除错误:
        打印("除零错误已被捕获")

    # 文件读写
    临时文件 = "临时.txt"
    使用 打开(临时文件, "w", encoding="utf-8") 作为 文件对象:
        文件对象.写("灵语文件示例")
    使用 打开(临时文件, encoding="utf-8") 作为 文件对象:
        打印("文件内容:", 文件对象.读())
    操作系统.删除文件(临时文件)

    打印("结束:语法全览示例运行完毕。")


若 __名__ == "__main__":
    主()

面向对象示例.灵

22 行
类 动物():
    定义 初始化(自身, 名字):
        自身.名字 = 名字

    定义 叫声(自身):
        返回 "……"

类 猫(动物):
    定义 叫声(自身):
        返回 "喵"

类 狗(动物):
    定义 叫声(自身):
        返回 "汪"

定义 主函数():
    动物们 = [猫("小白"), 狗("大黄")]
    循环 动物 于 动物们:
        打印(动物.名字 + "说:" + 动物.叫声())

若 __名__ == "__main__":
    主函数()