11.1字符串创建
字符串可以用单引号、双引号或三引号创建。单引号与双引号完全等价;三引号可以跨行,常用于长文本与文档字符串。
cql
# 三种创建方式
单引号 = '你好'
双引号 = "CQL"
三引号 = """第一行
第二行"""
打印(单引号, 双引号)
打印(三引号)提示:文档字符串(三引号)会被原样保留到编译产物中;
# 注释则会在词法阶段被忽略,不会出现在编译产物里。11.2字符串拼接与重复
使用 + 拼接字符串、* 重复字符串。需要格式化时使用内置函数 格式化(Python str.format 语义,双目标输出逐行一致)。
cql
# 拼接与重复
问候 = "你好" + "," + "世界"
打印(问候) # 你好,世界
打印("哈" * 3) # 哈哈哈格式化 支持位置占位({}、{0}、{1},含下标与属性访问)与具名占位({名称} 关键字参数):
cql
# 位置占位与具名占位
打印(格式化("{} 今年 {} 岁", "小明", 18))
打印(格式化("{0} 和 {1},还有 {0}", "甲", "乙"))
打印(格式化("{名称}:{分数} 分", 名称="小李", 分数=95))
打印(格式化("{0[键]}", {"键": "值"})) # 占位符内下标访问{!r} 调用 repr 转换、{{ }} 转义输出花括号本身:
cql
# 转换与转义
打印(格式化("{!r}", "文本")) # '文本'(repr 带引号)
打印(格式化("{!s}", 42)) # 42(str 转换)
打印(格式化("{{花括号}}", )) # {花括号}({{ }} 转义)格式说明符支持对齐、零填充、符号、进制、千分位与精度,完整形式为 [[填充]对齐][符号][#][0][宽度][,][.精度][类型]:
cql
# 格式说明符
打印(格式化("{:>10}|", "右对齐")) # 宽度 10 右对齐
打印(格式化("{:<10}|", "左对齐")) # 左对齐
打印(格式化("{:^10}", "居中")) # 居中
打印(格式化("{:05d}", 42)) # 零填充 -> 00042
打印(格式化("{:#x}", 255)) # 十六进制带前缀 -> 0xff
打印(格式化("{:o}", 8)) # 八进制 -> 10
打印(格式化("{:,}", 1234567)) # 千分位 -> 1,234,567
打印(格式化("{:.2f}", 3.14159)) # 精度 -> 3.14
打印(格式化("{:.3}", 3.14159)) # 总位数 -> 3.1411.3索引与切片
字符串与列表一样支持索引与切片,同样支持负索引与步长:
cql
# 索引与切片
文本 = "CQL 中文编程"
打印(文本[0]) # C
打印(文本[-1]) # 程(负索引从末尾倒数)
打印(文本[4:6]) # 中文(切片)
打印(文本[::-1]) # 程编文文中 LQC(反转)11.4常用字符串方法
CQL 字符串方法沿用 Python 风格的名字,功能与 Python 完全一致:
cql
# Python 风格字符串方法
打印(" 你好 ".strip()) # 去空白 -> 你好
打印("abc".upper()) # 大写 -> ABC
打印("ABC".lower()) # 小写 -> abc
打印("a,b,c".split(",")) # 分割 -> ['a', 'b', 'c']
打印("-".join(["1", "2", "3"])) # 连接 -> 1-2-3
打印("hello".replace("l", "L")) # 替换 -> heLLo
打印("hello".find("ll")) # 查找 -> 2
打印("hello".startswith("he")) # 前缀判断 -> 真
打印("hello".endswith("lo")) # 后缀判断 -> 真11.5中文方法名别名
CQL 为字符串方法提供了两批共 22 个中文方法名,Python 与 JavaScript 两个目标都会自动转译。第一批 12 个:
| 中文方法名 | 等价 Python 方法 | 中文方法名 | 等价 Python 方法 |
|---|---|---|---|
居中 | center | 左填充 | ljust |
右填充 | rjust | 首字母大写 | capitalize |
每个词大写 | title | 左去空白 | lstrip |
右去空白 | rstrip | 是否数字 | isdigit |
是否字母 | isalpha | 是否空白 | isspace |
删除前缀 | removeprefix | 删除后缀 | removesuffix |
第二批 10 个:
| 中文方法名 | 等价 Python 方法 | 中文方法名 | 等价 Python 方法 |
|---|---|---|---|
大小写切换 | swapcase | 分区 | partition |
右分区 | rpartition | 行分割 | splitlines |
零填充 | zfill | 出现次数 | count |
右查找 | rfind | 是否数字字母 | isalnum |
是否大写 | isupper | 是否小写 | islower |
cql
# 中文方法名别名(第一批)
打印("ab".居中(5, "_")) # 等价于 "ab".center(5, "_") -> "__ab_"
打印("aBC".首字母大写()) # 等价于 "aBC".capitalize() -> "Abc"
打印("hi there".每个词大写()) # 等价于 "hi there".title() -> "Hi There"
打印(" x".左去空白()) # 等价于 " x".lstrip() -> "x"
打印("x ".右去空白()) # 等价于 "x ".rstrip() -> "x"
打印("123".是否数字()) # 等价于 "123".isdigit() -> 真
打印("abc".是否字母()) # 等价于 "abc".isalpha() -> 真
打印(" \t".是否空白()) # 等价于 " \t".isspace() -> 真
打印("pre_x".删除前缀("pre_")) # 等价于 "pre_x".removeprefix("pre_") -> "x"
打印("x_suf".删除后缀("_suf")) # 等价于 "x_suf".removesuffix("_suf") -> "x"cql
# 中文方法名别名(第二批)
打印("Hello World".大小写切换()) # 等价于 "Hello World".swapcase() -> "hELLO wORLD"
打印("ab-cd".分区("-")) # 等价于 "ab-cd".partition("-") -> ("ab", "-", "cd")
打印("ab-cd".右分区("-")) # 等价于 "ab-cd".rpartition("-") -> ("ab", "-", "cd")
打印("a\nb".行分割()) # 等价于 "a\nb".splitlines() -> ["a", "b"]
打印("42".零填充(5)) # 等价于 "42".zfill(5) -> "00042"
打印("abab".出现次数("ab")) # 等价于 "abab".count("ab") -> 2
打印("abcabc".右查找("ab")) # 等价于 "abcabc".rfind("ab") -> 3
打印("a1".是否数字字母()) # 等价于 "a1".isalnum() -> 真
打印("ABC".是否大写()) # 等价于 "ABC".isupper() -> 真
打印("abc".是否小写()) # 等价于 "abc".islower() -> 真提示:Python 目标编译为原生方法调用(
.swapcase()、.partition() 等),JS 目标改写为 字符串大小写切换(s)、字符串分区(s, 分隔符) 等运行时函数,语义完全对齐。11.6注意事项
注意:CQL 不支持 f-string(带
f 前缀的字符串)。需要格式化字符串时,请统一使用内置函数 格式化("{} {}", a, b),其语义与 Python str.format 完全一致,且在 Python 与 JavaScript 双目标下输出逐行相同。