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

标点符号速查表

中文标点 英文标点 说明
( ) ( ) 圆括号
: : 冒号
; ; 分号
, , 逗号
' ' ' ' 单引号
【 】 [ ] 方括号
? ? 问号
! ! 叹号
" " " " 双引号