CnLang 编程语言教程
简介
CnLang 是一门面向中文开发者的编程语言,文件后缀为 .cn。它使用中文关键字、中文标点和中文函数名,让开发者能够用母语编写程序。
快速开始
第一个程序
输出*("你好,世界!")
变量
姓名 = "张三"
年龄 = 25
身高 = 1.75
输出*(姓名,年龄,身高)
数据类型
数字
整数 = 10
负数 = -5
小数 = 3.14
输出*(整数 + 负数)
输出*(小数 * 2)
字符串
问候 = "你好"
名字 = '李四'
输出*(问候 + 名字)
输出*("长度:" + 长度*(问候))
布尔值
是真 = 真
是假 = 假
输出*(是真 且 是假)
输出*(是真 或 是假)
输出*(非 是真)
列表
数字列表 = 【1, 2, 3, 4, 5】
水果 = 【"苹果", "香蕉", "橙子"】
输出*(数字列表)
输出*(水果【0】)
输出*(长度*(水果))
字典
学生 = {"姓名": "王五", "年龄": 20, "成绩": 95}
输出*(学生【"姓名"】)
输出*(学生.获取("年龄"))
元组
坐标 = (10, 20)
输出*(坐标【0】)
输出*(坐标【1】)
集合
数字集合 = {1, 2, 3, 3, 4}
输出*(数字集合)
运算符
算术运算符
输出*(10 + 5) # 加法
输出*(10 - 5) # 减法
输出*(10 * 5) # 乘法
输出*(10 / 5) # 除法
输出*(10 // 5) # 整除
输出*(10 % 3) # 取余
输出*(2 ** 3) # 幂运算
比较运算符
输出*(10 > 5) # 大于
输出*(10 < 5) # 小于
输出*(10 == 10) # 等于
输出*(10 != 5) # 不等于
输出*(10 >= 10) # 大于等于
输出*(10 <= 5) # 小于等于
逻辑运算符
输出*(真 且 真) # 逻辑与
输出*(真 或 假) # 逻辑或
输出*(非 真) # 逻辑非
成员运算符
列表 = 【1, 2, 3, 4, 5】
输出*(3 在 列表中)
输出*(10 在 列表中)
条件语句
如果...否则
年龄 = 20
如果 年龄 >= 18:
输出*("成年人")
否则:
输出*("未成年人")
多条件判断
分数 = 85
如果 分数 >= 90:
输出*("优秀")
另如 分数 >= 80:
输出*("良好")
另如 分数 >= 60:
输出*("及格")
否则:
输出*("不及格")
嵌套条件
年龄 = 25
有票 = 真
如果 年龄 >= 18:
如果 有票:
输出*("可以入场")
否则:
输出*("需要购票")
否则:
输出*("年龄不足")
循环语句
循环当
计数 = 0
循环当 计数 < 5:
输出*(计数)
计数 = 计数 + 1
遍历循环
遍历 我 在 区间*(5):
输出*(我)
遍历列表
水果 = 【"苹果", "香蕉", "橙子"】
遍历 水果名 在 水果:
输出*(水果名)
遍历字典
学生 = {"姓名": "张三", "年龄": 20}
遍历 键 在 学生.取键():
输出*(键,学生【键】)
跳出和跳过
遍历 我 在 区间*(10):
如果 我 == 3:
跳过
如果 我 == 7:
跳出
输出*(我)
函数
定义函数
定义 问候(名字):
输出*("你好," + 名字)
问候("张三")
问候("李四")
返回值
定义 加法(a, b):
返回 a + b
结果 = 加法(10, 5)
输出*(结果)
默认参数
定义 问候(名字, 问候语 = "你好"):
输出*(问候语 + "," + 名字)
问候("张三")
问候("李四", "早上好")
可变参数
定义 求和(*参数):
结果 = 0
遍历 数字 在 参数:
结果 = 结果 + 数字
返回 结果
输出*(求和(1, 2, 3))
输出*(求和(10, 20, 30, 40))
匿名函数
平方 = 匿名 x: x ** 2
输出*(平方(5))
加法 = 匿名 a, b: a + b
输出*(加法(3, 4))
类和对象
定义类
类 动物:
定义 初始化(自身,名称,年龄):
自身.名称 = 名称
自身.年龄 = 年龄
定义 介绍(自身):
输出*("我是" + 自身.名称 + ",今年" + 转文本*(自身.年龄) + "岁")
狗 = 动物("旺财", 3)
狗.介绍()
继承
类 宠物(动物):
定义 初始化(自身,名称,年龄,主人):
父类().初始化(名称,年龄)
自身.主人 = 主人
定义 介绍(自身):
输出*("我是" + 自身.名称 + ",主人是" + 自身.主人)
猫 = 宠物("咪咪", 2, "张三")
猫.介绍()
类方法
类 数学工具:
定义 加法(自身, a, b):
返回 a + b
定义 减法(自身, a, b):
返回 a - b
工具 = 数学工具()
输出*(工具.加法(10, 5))
输出*(工具.减法(10, 5))
静态方法
类 工具:
定义 问候():
输出*("你好!")
工具.问候()
属性装饰器
类 温度:
定义 初始化(自身,摄氏度):
自身._摄氏度 = 摄氏度
属性
定义 华氏度(自身):
返回 自身._摄氏度 * 9 / 5 + 32
temp = 温度(100)
输出*(temp.华氏度)
异常处理
尝试...捕获
尝试:
结果 = 10 / 0
捕获 除零错误:
输出*("不能除以零!")
捕获多种异常
尝试:
数字 = 转整数*("abc")
捕获 值错误:
输出*("无效的数值!")
捕获 类型错误:
输出*("类型错误!")
收尾执行
尝试:
文件 = 打开*("测试.txt", "r")
内容 = 文件.读取()
捕获 文件未找到错误:
输出*("文件不存在!")
收尾:
输出*("执行完毕")
抛出异常
定义 检查年龄(年龄):
如果 年龄 < 0:
抛出 值错误("年龄不能为负数!")
如果 年龄 > 150:
抛出 值错误("年龄不合理!")
输出*("年龄有效:" + 转文本*(年龄))
检查年龄(25)
检查年龄(-5)
断言
年龄 = 25
断言 年龄 > 0, "年龄必须为正数"
文件操作
写入文件
文件 = 打开*("测试.txt", "w")
文件.写入("第一行\n")
文件.写入("第二行\n")
文件.关闭()
读取文件
文件 = 打开*("测试.txt", "r")
内容 = 文件.读取()
输出*(内容)
文件.关闭()
逐行读取
文件 = 打开*("测试.txt", "r")
遍历 行 在 文件:
输出*(行)
文件.关闭()
追加内容
文件 = 打开*("测试.txt", "a")
文件.写入("追加的内容\n")
文件.关闭()
模块导入
引入整个模块
引入 数学
输出*(数学.圆周率)
输出*(数学.平方根(16))
引入特定函数
来自 数学 引入 圆周率, 平方根
输出*(圆周率)
输出*(平方根(16))
引入并别名
引入 数学 简称 m
输出*(m.圆周率)
输出*(m.平方根(25))
列表操作
基本操作
列表 = 【1, 2, 3】
列表.追加(4)
输出*(列表)
列表.插入(0, 0)
输出*(列表)
列表.删除(2)
输出*(列表)
元素 = 列表.弹出()
输出*(元素)
输出*(列表)
列表方法
数字 = 【3, 1, 4, 1, 5, 9, 2, 6】
输出*(数字.计数(1)) # 计数
输出*(数字.索引(4)) # 查找索引
数字.排序()
输出*(数字)
数字.反转()
输出*(数字)
列表推导式
平方 = 【x ** 2 遍历 x 在 区间*(10)】
输出*(平方)
偶数 = 【x 遍历 x 在 区间*(20) 如果 x % 2 == 0】
输出*(偶数)
字典操作
基本操作
学生 = {}
学生【"姓名"】 = "张三"
学生【"年龄"】 = 20
学生【"成绩"】 = 95
输出*(学生)
输出*(学生.取键())
输出*(学生.取值())
输出*(学生.取项())
字典方法
学生 = {"姓名": "张三", "年龄": 20}
输出*(学生.获取("姓名"))
输出*(学生.获取("地址", "未知"))
学生.更新({"成绩": 95})
输出*(学生)
姓名 = 学生.弹出("姓名")
输出*(姓名)
输出*(学生)
字典推导式
平方 = {x: x ** 2 遍历 x 在 区间*(5)}
输出*(平方)
集合操作
基本操作
集合 = {1, 2, 3, 4, 5}
集合.添加(6)
输出*(集合)
集合.丢弃(3)
输出*(集合)
集合运算
a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}
输出*(a.并集(b)) # 并集
输出*(a.交集(b)) # 交集
输出*(a.差集(b)) # 差集
字符串操作
基本方法
文本 = "Hello World"
输出*(文本.大写())
输出*(文本.小写())
查找和替换
文本 = "Hello World"
输出*(文本.查找("World"))
输出*(文本.替换("World", "Python"))
分割和连接
文本 = "苹果,香蕉,橙子"
列表 = 文本.分割(",")
输出*(列表)
连接 = "-".连接(列表)
输出*(连接)
去除空白
文本 = " Hello "
输出*(文本.去空格())
检查方法
文本 = "Hello123"
输出*(文本.开头匹配("Hello"))
输出*(文本.结尾匹配("World"))
内置函数
类型转换
输出*(转整数*("123"))
输出*(转小数*("3.14"))
输出*(转文本*(123))
输出*(列表*("abc"))
输出*(元组*(【1, 2, 3】))
输出*(集合*(【1, 2, 2, 3】))
数学函数
输出*(绝对值*(-10))
输出*(最大*(1, 2, 3))
输出*(最小*(1, 2, 3))
输出*(求和*(【1, 2, 3, 4, 5】))
输出*(次方*(2, 3))
输出*(商余*(10, 3))
输出*(取整*(3.14159, 2))
序列函数
输出*(区间*(5))
输出*(长度*("Hello"))
输出*(序遍历*(【"a", "b", "c"】))
输出*(排序*(【3, 1, 4, 1, 5】))
输出*(反转*(【1, 2, 3】))
输出*(配对*(【1, 2】, 【"a", "b"】))
函数式编程
输出*(映射*(匿名 x: x ** 2, 【1, 2, 3】))
输出*(筛选*(匿名 x: x > 2, 【1, 2, 3, 4, 5】))
逻辑函数
输出*(任一真*(【假, 假, 真】))
输出*(全成立*(【真, 真, 真】))
类型检查
输出*(类型*(123))
输出*(类型*("abc"))
输出*(类型*(【1, 2, 3】))
输出*(属类型*(123, 整数))
输出*(属类型*("abc", 字符串))
其他函数
输出*(哈希*("test"))
输出*(字符*(65))
输出*(编码*("A"))
高级特性
产出(生成器)
定义 计数到(n):
计数 = 0
循环当 计数 < n:
产出 计数
计数 = 计数 + 1
遍历 数字 在 计数到(5):
输出*(数字)
装饰器
定义 日志(函数):
定义 包装(*参数, **关键字参数):
输出*("调用函数:" + 函数.名称)
返回 函数(*参数, **关键字参数)
返回 包装
@日志
定义 问候(名字):
输出*("你好," + 名字)
问候("张三")
使用语句(上下文管理器)
使用 打开*("测试.txt", "r") 简称 f:
输出*(f.读取())
异步编程
异步 定义 获取数据():
输出*("开始获取")
等待 延迟(1)
输出*("获取完成")
返回 "数据"
异步 定义 主函数():
结果 = 等待 获取数据()
输出*(结果)
占位语句
定义 待实现():
占位
全局变量
定义 修改全局():
全局 计数器
计数器 = 计数器 + 1
计数器 = 0
修改全局()
输出*(计数器)
外层变量
定义 外层():
计数 = 0
定义 内层():
外层 计数
计数 = 计数 + 1
内层()
输出*(计数)
外层()
关键字速查表
| 中文关键字 |
说明 |
| 如果 |
条件判断 |
| 另如 |
多条件分支 |
| 否则 |
条件分支 |
| 匹配 |
模式匹配 |
| 分支 |
匹配分支 |
| 遍历 |
遍历循环 |
| 循环当 |
while循环 |
| 跳出 |
中断循环 |
| 跳过 |
继续循环 |
| 占位 |
空语句 |
| 定义 |
定义函数 |
| 返回 |
返回值 |
| 产出 |
生成器产出 |
| 匿名 |
匿名函数 |
| 全局 |
全局变量 |
| 外层 |
外层变量 |
| 类 |
定义类 |
| 自身 |
self引用 |
| 父类 |
super引用 |
| 引入 |
导入模块 |
| 来自 |
从模块导入 |
| 简称 |
别名 |
| 尝试 |
异常捕获开始 |
| 捕获 |
捕获异常 |
| 收尾 |
最终执行 |
| 抛出 |
抛出异常 |
| 断言 |
断言检查 |
| 非 |
逻辑非 |
| 且 |
逻辑与 |
| 或 |
逻辑或 |
| 真 |
True |
| 假 |
False |
| 空 |
None |
| 在 |
成员检查 |
| 是 |
身份比较 |
| 使用 |
上下文管理 |
| 异步 |
异步函数 |
| 等待 |
等待异步 |
内置函数速查表
| 中文函数 |
说明 |
| 输出* |
输出内容 |
| 输入* |
获取输入 |
| 区间* |
生成序列 |
| 长度* |
获取长度 |
| 最大* |
获取最大值 |
| 最小* |
获取最小值 |
| 求和* |
求和 |
| 绝对值* |
获取绝对值 |
| 取整* |
四舍五入 |
| 次方* |
幂运算 |
| 商余* |
商和余数 |
| 复数* |
复数对象 |
| 转整数* |
转换为整数 |
| 转小数* |
转换为浮点数 |
| 转文本* |
转换为字符串 |
| 转布尔* |
转换为布尔值 |
| 列表* |
转换为列表 |
| 元组* |
转换为元组 |
| 字典* |
转换为字典 |
| 集合* |
转换为集合 |
| 字符* |
字符编码转字符 |
| 编码* |
字符转编码 |
| 序遍历* |
枚举索引 |
| 配对* |
压缩多个序列 |
| 排序* |
排序 |
| 反转* |
反转序列 |
| 映射* |
映射函数 |
| 筛选* |
过滤序列 |
| 迭代器* |
创建迭代器 |
| 下一项* |
下一个元素 |
| 全成立* |
全部为真 |
| 任一真* |
任意为真 |
| 类型* |
获取类型 |
| 属类型* |
类型检查 |
| 哈希* |
获取哈希值 |
| 打开* |
打开文件 |
| 执行码* |
执行代码 |
对象方法速查表
| 中文方法 |
说明 |
| 追加 |
列表追加元素 |
| 插入 |
列表插入元素 |
| 弹出 |
弹出元素 |
| 删除 |
移除元素 |
| 清空 |
清空列表 |
| 反转 |
反转列表 |
| 排序 |
列表排序 |
| 计数 |
计数元素 |
| 扩展 |
列表扩展 |
| 索引 |
查找索引 |
| 取键 |
字典键 |
| 取值 |
字典值 |
| 取项 |
字典项 |
| 更新 |
字典更新 |
| 获取 |
字典获取 |
| 设默认 |
设置默认值 |
| 分割 |
字符串分割 |
| 连接 |
字符串连接 |
| 替换 |
字符串替换 |
| 查找 |
字符串查找 |
| 大写 |
转大写 |
| 小写 |
转小写 |
| 去空格 |
去除两端空白 |
| 开头匹配 |
检查开头 |
| 结尾匹配 |
检查结尾 |
| 读取 |
文件读取 |
| 读取行 |
文件读取行 |
| 写入 |
文件写入 |
| 关闭 |
文件关闭 |
| 添加 |
集合添加 |
| 丢弃 |
集合丢弃 |
| 交集 |
集合交集 |
| 并集 |
集合并集 |
| 差集 |
集合差集 |
标准库速查表
数学库
| 中文函数 |
说明 |
| 圆周率 |
π值 |
| 自然常数 |
e值 |
| 平方根 |
平方根 |
| 平方 |
幂运算 |
| 正弦 |
sin |
| 余弦 |
cos |
| 正切 |
tan |
| 反正弦 |
asin |
| 反余弦 |
acos |
| 反正切 |
atan |
| 弧度转角度 |
degrees |
| 角度转弧度 |
radians |
| 自然对数 |
log |
| 常用对数 |
log10 |
| 上取整 |
ceil |
| 下取整 |
floor |
| 浮点绝对值 |
fabs |
| 取模 |
fmod |
| 阶乘 |
factorial |
| 最大公约数 |
gcd |
| 欧拉伽马 |
gamma |
| 双曲正弦 |
sinh |
| 双曲余弦 |
cosh |
随机库
| 中文函数 |
说明 |
| 随机整数 |
randint |
| 零一小数 |
random |
| 区间小数 |
uniform |
| 种子 |
seed |
| 抽取一项 |
choice |
| 多项抽样 |
sample |
| 打乱序列 |
shuffle |
| 随机偏移 |
randrange |
系统库
| 中文函数 |
说明 |
| 系统当前路径 |
getcwd |
| 切换路径 |
chdir |
| 建单文件夹 |
mkdir |
| 递归建文件夹 |
makedirs |
| 删空文件夹 |
rmdir |
| 删文件 |
remove |
| 重命名 |
rename |
| 列出目录内容 |
listdir |
| 执行系统命令 |
system |
| 路径拼接 |
path.join |
| 路径存在 |
path.exists |
| 路径是文件 |
path.isfile |
| 路径是目录 |
path.isdir |
| 获取文件大小 |
path.getsize |
| 获取文件名 |
path.basename |
| 获取父路径 |
path.dirname |
路径库
| 中文函数 |
说明 |
| 路径对象 |
Path |
| 是否文件 |
is_file |
| 是否目录 |
is_dir |
| 是否存在 |
exists |
| 创建目录 |
mkdir |
| 删除文件 |
unlink |
| 遍历子文件 |
iterdir |
| 全局匹配文件 |
glob |
| 父目录 |
parent |
| 文件名 |
name |
| 后缀名 |
suffix |
| 绝对路径 |
absolute |
时间库
| 中文函数 |
说明 |
| 延时 |
sleep |
| 时间戳 |
time |
| 本地时间结构 |
localtime |
| 格式化时间 |
strftime |
| 文本转时间戳 |
strptime |
| UTC时间 |
gmtime |
日期时间库
| 中文函数 |
说明 |
| 当前时间 |
datetime.now |
| UTC当前时间 |
datetime.utcnow |
| 构造时间 |
datetime |
| 时间差 |
timedelta |
| 文本转时间 |
datetime.strptime |
| 替换年月日 |
replace |
| 获取时间戳 |
timestamp |
| 今日日期 |
date.today |
画笔库
| 中文函数 |
说明 |
| 前进 |
forward |
| 后退 |
backward |
| 右转 |
right |
| 左转 |
left |
| 移动到 |
goto |
| 设朝向 |
setheading |
| 画圆 |
circle |
| 画点 |
dot |
| 回原点 |
home |
| 抬笔 |
penup |
| 落笔 |
pendown |
| 设粗细 |
pensize |
| 设颜色 |
pencolor |
| 设填充色 |
fillcolor |
| 开始填充 |
begin_fill |
| 结束填充 |
end_fill |
| 设速度 |
speed |
| 隐藏 |
hideturtle |
| 显示 |
showturtle |
| 设形状 |
shape |
| 撤销一步 |
undo |
| 盖章 |
stamp |
| 写文字 |
write |
| 当前位置 |
position |
| X坐标 |
xcor |
| Y坐标 |
ycor |
| 当前朝向 |
heading |
| 是否落笔 |
isdown |
| 到某点距离 |
distance |
| 设窗口标题 |
title |
| 设背景色 |
bgcolor |
| 设窗口大小 |
setup |
| 清空画面 |
clear |
| 重置 |
reset |
| 设刷新模式 |
tracer |
| 刷新画面 |
update |
| 结束绘图 |
done |
| 点击退出 |
exitonclick |
标点符号速查表
| 中文标点 |
英文标点 |
说明 |
| ( ) |
( ) |
圆括号 |
| : |
: |
冒号 |
| ; |
; |
分号 |
| , |
, |
逗号 |
| ' ' |
' ' |
单引号 |
| 【 】 |
[ ] |
方括号 |
| ? |
? |
问号 |
| ! |
! |
叹号 |
| " " |
" " |
双引号 |