16.1基础函数
打印、输入、长度、范围、类型、求和、最大值、最小值、绝对、是否是实例是使用频率最高的一批函数:
cql
# 基础内置函数
打印("长度:", 长度("你好")) # 2
打印("求和:", 求和([1, 2, 3])) # 6
打印("最大值:", 最大值([3, 7, 2])) # 7
打印("最小值:", 最小值([3, 7, 2])) # 2
打印("绝对:", 绝对(-5)) # 5
打印("类型:", 类型(42)) # <class 'int'>
打印("是否是实例:", 是否是实例(42, 整数)) # 真
打印("范围:", 列表(范围(3))) # [0, 1, 2]cql
# 输入函数
名字 = 输入("请输入你的名字:")
打印("你好,", 名字)提示:中文别名在函数调用位置(如
打印(...))会被转译器替换为 Python 内置函数,性能与手写 Python 等价;当别名被当作普通值引用(如 别名 = 长度)时,由运行时注入的中文命名空间兜底。16.2类型转换
整数、文本、浮点数、布尔、列表、字典、集合、元组既是类型名,也是转换函数。其中 整数 额外支持基数参数:
cql
# 类型转换
打印(整数("42")) # 42
打印(整数("ff", 16)) # 255(基数参数)
打印(文本(42)) # 42
打印(浮点数("3.14")) # 3.14
打印(布尔(1)) # 真
打印(列表("abc")) # ['a', 'b', 'c']
打印(字典([("a", 1)])) # {'a': 1}
打印(集合([1, 1, 2])) # {1, 2}
打印(元组([1, 2])) # (1, 2)对应的中文类型注解写法为:x: 整数 = 5、名称: 文本 = "CQL"、函数 加(a: 整数, b: 整数) -> 整数。
16.3序列函数
枚举、压缩、排序、地图、过滤器、归约、全部、任意用于序列处理;去重、打乱、扁平是 CQL 的容器增强函数:
cql
# 枚举 与 压缩
打印(列表(枚举(["甲", "乙"]))) # [(0, '甲'), (1, '乙')]
打印(列表(压缩([1, 2], ["a", "b"]))) # [(1, 'a'), (2, 'b')]cql
# 排序 地图 过滤器 归约
打印(排序([3, 1, 2])) # [1, 2, 3]
打印(列表(地图(延迟 x: x * 2, [1, 2, 3]))) # [2, 4, 6]
打印(列表(过滤器(延迟 x: x > 2, [1, 2, 3]))) # [3]
从 functools 导入 reduce
打印(归约(延迟 x, y: x + y, [1, 2, 3, 4])) # 10
打印(全部([真, 真])) # 真
打印(任意([假, 真])) # 真cql
# 容器增强:去重 打乱 扁平
打印(去重([1, 1, 2, 3, 3])) # [1, 2, 3](保序去重)
打印(扁平([[1, 2], [3, 4]])) # [1, 2, 3, 4](展平一层)
随机种子(42) # 固定种子,让打乱结果可复现
数据 = [1, 2, 3, 4, 5]
打乱(数据) # 原地打乱
打印(数据)16.4随机数函数
随机数函数语义与 Python random 模块对齐,随机种子 设置后可复现随机序列:
cql
# 随机数函数
随机种子(42)
打印(随机()) # [0, 1) 均匀浮点
打印(随机整数(1, 10)) # 含两端,如 10
打印(随机范围(0, 10)) # 不含上界,支持步长
打印(随机均匀(1, 2)) # [1, 2] 均匀浮点
打印(随机选择([1, 2, 3])) # 随机选一个元素
打印(随机样本([1, 2, 3, 4, 5], 2)) # 不放回抽样,取 2 个16.5JSON 与文本
转成JSON 与 格式化JSON 序列化数据(中文不转义、无多余空格),解析JSON 还原为字典 / 列表;解析CSV 与 转成CSV 处理表格文本:
cql
# JSON 序列化与解析
数据 = {"名称": "CQL", "版本": 1.4}
打印(转成JSON(数据)) # {"名称":"CQL","版本":1.4}
打印(格式化JSON(数据)) # 缩进美化输出,缩进默认 2
解析 = 解析JSON('{"a": 1}')
打印(解析["a"]) # 1(解析后可直接下标取值)cql
# CSV 解析与生成
打印(解析CSV("a,b\n1,2")) # [['a', 'b'], ['1', '2']]
打印(解析CSV("a;b\n1;2", ";")) # 支持自定义分隔符
打印(转成CSV([["a", "b"], [1, 2]])) # 生成 CSV 文本,行尾 \r\n16.6编解码
Base64 编解码与 URL 编解码处理文本传输;解析查询参数 与 转成查询参数 处理 URL 查询串;解析URL 按 RFC 3986 分解链接:
cql
# Base64 与 URL 编解码
编码 = 编码Base64("喵酱")
打印(编码) # 5Za16YWx(中文按 UTF-8 编码)
打印(解码Base64(编码)) # 喵酱
打印(URL编码("你好 世界")) # 空格 -> %20,中文百分号编码
打印(URL解码("%E4%BD%A0%E5%A5%BD")) # 你好cql
# 查询参数与 URL 解析
打印(解析查询参数("a=1&a=2&b=3"))
# {'a': ['1', '2'], 'b': ['3']}(重复键收集为列表)
打印(转成查询参数({"q": "你好 世界"}))
打印(解析URL("https://user:pass@a.com:8080/path?q=1#f"))
# {'协议': 'https', '主机': 'user:pass@a.com:8080', '路径': '/path', '查询': 'q=1', '片段': 'f'}16.7哈希与 HTML
哈希MD5、哈希SHA1、哈希SHA256、哈希SHA512 按 UTF-8 字节计算十六进制小写摘要;转义HTML 与 反转义HTML 防注入与还原内容:
cql
# 哈希函数(十六进制小写,中文安全)
打印(哈希MD5("喵酱"))
打印(哈希SHA1("喵酱"))
打印(哈希SHA256("喵酱"))
打印(哈希SHA512("喵酱"))cql
# HTML 转义与反转义
打印(转义HTML("<b>你好</b>")) # 会转义 & < > 双引号与单引号(引号默认转义)
打印(转义HTML("<b>你好</b>", 假)) # 第二参传 假 时不转义引号
打印(反转义HTML("<b>你好</b>")) # 还原实体16.8数学函数
数学函数自动替换为 math.xxx 并注入 import math,进制与字符函数替换为原生内置 hex / oct / bin / chr / ord / hash:
cql
# 数学函数
打印(平方根(16)) # 4.0
打印(正弦(0)) # 0.0
打印(余弦(0)) # 1.0
打印(正切(0)) # 0.0
打印(对数值(自然常数)) # 1.0(自然对数)
打印(指数(1)) # 2.718281828459045
打印(向上取整(3.2)) # 4
打印(向下取整(3.8)) # 3
打印(截断(-3.8)) # -3cql
# 数值与组合计数
打印(阶乘(5)) # 120
打印(最大公约数(12, 18)) # 6(支持多参)
打印(最小公倍数(4, 6)) # 12(支持多参)
打印(组合数(5, 2)) # 10
打印(排列数(5, 2)) # 20
打印(π) # 3.141592653589793(数学常量)cql
# 进制与字符
打印(十六进制(255)) # 0xff
打印(八进制(8)) # 0o10
打印(二进制(5)) # 0b101
打印(字符(65)) # A
打印(序数("A")) # 6516.9类型判断
类型判断函数双目标逻辑一致。注意两个特例:是否数字 排除布尔;是否字典 排除数组与空值:
cql
# 类型判断
打印(是否文本("hi")) # 真
打印(是否数字(42)) # 真
打印(是否数字(真)) # 假(是否数字 排除布尔)
打印(是否列表([1])) # 真
打印(是否字典({"a": 1})) # 真
打印(是否字典(空)) # 假(排除空值)
打印(是否字典([1])) # 假(排除数组)
打印(是否布尔(真)) # 真
打印(是否函数(打印)) # 真