python常用得内置函数解析——chr()函数
wptr33 2025-09-29 13:37 11 浏览
大家好详细解析 Python 中用于字符编码转换的内置函数 chr()。
1. 函数定义
chr() 函数用于将整数(Unicode 码位)转换为对应的字符。
- 语法:chr(i)
- 参数:
- i:整数,表示 Unicode 码位(范围:0 <= i <= 0x10FFFF)
- 返回值:对应的 Unicode 字符(字符串)
2. 基本用法示例
ASCII 字符转换
# 基本的 ASCII 字符
print(chr(65)) # 输出: 'A'
print(chr(97)) # 输出: 'a'
print(chr(48)) # 输出: '0'
print(chr(32)) # 输出: ' ' (空格)
# 特殊字符
print(chr(10)) # 输出: '\n' (换行符)
print(chr(9)) # 输出: '\t' (制表符)
print(chr(13)) # 输出: '\r' (回车符)
数字到字符的转换
# 数字字符
for i in range(48, 58):
print(chr(i), end=' ')
# 输出: 0 1 2 3 4 5 6 7 8 9
# 大写字母
for i in range(65, 91):
print(chr(i), end=' ')
# 输出: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
# 小写字母
for i in range(97, 123):
print(chr(i), end=' ')
# 输出: a b c d e f g h i j k l m n o p q r s t u v w x y z
3. Unicode 字符支持
chr() 支持完整的 Unicode 字符集,包括各种语言的文字、符号和表情。
各种语言的字符
# 中文汉字
print(chr(20013)) # 输出: '中' (U+4E2D)
print(chr(25991)) # 输出: '文' (U+6587)
# 日文假名
print(chr(12354)) # 输出: 'あ' (U+3042)
print(chr(12450)) # 输出: 'ア' (U+30A2)
# 韩文字母
print(chr(44032)) # 输出: '' (U+AC00)
# 希腊字母
print(chr(913)) # 输出: 'Α' (Alpha)
print(chr(945)) # 输出: 'α' (alpha)
特殊符号和表情
# 数学符号
print(chr(8734)) # 输出: '∞' (无穷大)
print(chr(8747)) # 输出: '∫' (积分符号)
# 货币符号
print(chr(8364)) # 输出: 'EUR' (欧元)
print(chr(165)) # 输出: 'yen' (日元/人民币)
# 表情符号 (Emoji)
print(chr(128512)) # 输出: '' (笑脸)
print(chr(128515)) # 输出: '' (大笑)
print(chr(128169)) # 输出: '' (便便)
print(chr(127881)) # 输出: '' (庆祝)
# 扑克牌花色
print(chr(9824)) # 输出: '' (黑桃)
print(chr(9827)) # 输出: '' (梅花)
print(chr(9829)) # 输出: '' (红心)
print(chr(9830)) # 输出: '' (方块)
4. 与ord()函数的对应关系
chr() 和 ord() 是一对互逆的函数:
函数 | 功能 | 参数 | 返回值 |
chr(i) | 码位 → 字符 | 整数码位 | 字符 |
ord(c) | 字符 → 码位 | 单个字符 | 整数码位 |
# 互逆操作示例
char = 'A'
code = ord(char)
print(f"字符 '{char}' 的码位: {code}") # 输出: 字符 'A' 的码位: 65
back_to_char = chr(code)
print(f"码位 {code} 的字符: '{back_to_char}'") # 输出: 码位 65 的字符: 'A'
# 测试互逆性
test_chars = ['中', '文', '', '∞', 'EUR']
for char in test_chars:
code = ord(char)
recovered = chr(code)
print(f"'{char}' -> {code} -> '{recovered}' : {char == recovered}")
5. 实际应用场景
场景1:生成字符序列
def generate_alphabet(start, end):
"""生成指定范围的字符序列"""
return [chr(i) for i in range(ord(start), ord(end) + 1)]
# 生成字母表
alphabet = generate_alphabet('a', 'z')
print("小写字母表:", ''.join(alphabet))
# 生成数字字符
digits = generate_alphabet('0', '9')
print("数字字符:", ''.join(digits))
# 生成特殊符号范围
symbols = [chr(i) for i in range(33, 48)] # !"#$%&'()*+,-./
print("标点符号:", ''.join(symbols))
场景2:密码生成器
import random
def generate_password(length=12, use_special=True):
"""生成随机密码"""
# 字符池
lower = [chr(i) for i in range(97, 123)] # a-z
upper = [chr(i) for i in range(65, 91)] # A-Z
numbers = [chr(i) for i in range(48, 58)] # 0-9
special = [chr(i) for i in range(33, 48)] # !"#$%&'()*+,-./
# 组合字符池
pool = lower + upper + numbers
if use_special:
pool += special
# 生成密码
password = ''.join(random.choice(pool) for _ in range(length))
return password
# 生成密码
print("随机密码:", generate_password())
print("简单密码:", generate_password(8, False))
场景3:字符编码转换工具
def string_to_codes(text):
"""将字符串转换为Unicode码位列表"""
return [ord(char) for char in text]
def codes_to_string(codes):
"""将Unicode码位列表转换回字符串"""
return ''.join(chr(code) for code in codes)
# 测试转换
original = "Hello, 世界! "
codes = string_to_codes(original)
recovered = codes_to_string(codes)
print("原始字符串:", original)
print("Unicode码位:", codes)
print("恢复的字符串:", recovered)
print("是否一致:", original == recovered)
场景4:文本艺术生成
def create_text_art():
"""创建简单的文本艺术"""
# 使用各种字符创建图案
art = []
# 边框字符
border_char = chr(9617) #
# 创建带边框的文本
art.append(border_char * 20)
art.append(f"{border_char} Hello! {border_char}")
art.append(f"{border_char} World! {border_char}")
art.append(border_char * 20)
return '\n'.join(art)
print(create_text_art())
6. 错误处理和边界条件
# 有效范围检查
print("有效范围: 0 to", hex(0x10FFFF))
# 边界测试
print(chr(0)) # 输出: '\x00' (空字符)
print(chr(0x10FFFF)) # 输出: '\U0010ffff' (最大有效字符)
# 无效范围测试
try:
print(chr(-1)) # ValueError: chr() arg not in range(0x110000)
except ValueError as e:
print(f"错误: {e}")
try:
print(chr(0x110000)) # ValueError: chr() arg not in range(0x110000)
except ValueError as e:
print(f"错误: {e}")
# 浮点数会自动取整
print(chr(65.7)) # 输出: 'A' (65.7 → 65)
print(chr(65.2)) # 输出: 'A' (65.2 → 65)
7. 高级用法:字符处理和转换
字符编码检测
def detect_character_type(char):
"""检测字符类型"""
code = ord(char)
if 0 <= code <= 127:
return "ASCII"
elif 128 <= code <= 255:
return "Latin-1"
elif 19968 <= code <= 40959: # 常用汉字范围
return "中文汉字"
elif 44032 <= code <= 55203: # 韩文字母
return "韩文字母"
elif 12352 <= code <= 12447: # 日文假名
return "日文假名"
elif code > 0xFFFF:
return "扩展Unicode"
else:
return "其他Unicode"
# 测试字符类型检测
test_chars = ['A', '中', 'あ', '', '', '∞']
for char in test_chars:
char_type = detect_character_type(char)
print(f"'{char}' -> {char_type} (U+{ord(char):04X})")
自定义字符映射
def caesar_cipher(text, shift):
"""凯撒密码加密"""
result = []
for char in text:
if char.isalpha():
# 获取基础码位
base = ord('A') if char.isupper() else ord('a')
# 计算新字符
code = (ord(char) - base + shift) % 26 + base
result.append(chr(code))
else:
result.append(char)
return ''.join(result)
# 测试凯撒密码
message = "Hello, World!"
encrypted = caesar_cipher(message, 3)
decrypted = caesar_cipher(encrypted, -3)
print("原始消息:", message)
print("加密后:", encrypted)
print("解密后:", decrypted)
8. 性能考虑
import timeit
# 比较不同方式生成字符序列
def test_performance():
# 使用 chr()
time_chr = timeit.timeit('[chr(i) for i in range(65, 91)]', number=10000)
# 使用字符串
time_str = timeit.timeit('list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")', number=10000)
print(f"chr() 方式: {time_chr:.6f}秒")
print(f"字符串方式: {time_str:.6f}秒")
test_performance()
9. 与其他相关函数的比较
# chr() vs str()
print(chr(65)) # 输出: 'A' (字符)
print(str(65)) # 输出: '65' (数字字符串)
# 处理非整数
print(chr(65)) # 输出: 'A'
# print(chr('65')) # TypeError: an integer is required
# 与 bytes 的关系
byte_data = b'A'
print(chr(byte_data[0])) # 输出: 'A'
10. 注意事项和最佳实践
- 参数验证:始终确保参数在有效范围内
- 字符集兼容性:考虑目标环境的字符集支持
- 性能考虑:对于已知字符,直接使用字符字面量更高效
- 编码问题:在处理文件或网络时,注意字符编码
# 最佳实践:使用错误处理
def safe_chr(code, default='?'):
"""安全的chr函数,提供默认值"""
try:
return chr(code)
except ValueError:
return default
print(safe_chr(65)) # 输出: 'A'
print(safe_chr(-1)) # 输出: '?'
print(safe_chr(999999)) # 输出: '?'
总结
特性 | 描述 |
功能 | 将Unicode码位转换为字符 |
语法 | chr(i) |
参数 | 整数码位(0-0x10FFFF) |
返回值 | 对应的Unicode字符 |
逆函数 | ord() |
主要用途 | 字符生成、编码转换、文本处理 |
支持范围 | 完整Unicode字符集(包括表情符号) |
chr() 函数是 Python 文本处理中非常基础且强大的工具,它使得程序能够动态生成和处理各种字符,特别是在需要处理多语言文本、特殊符号或创建动态内容时非常有用。
相关推荐
- 什么是Java中的继承?如何实现继承?
-
什么是继承?...
- Java 继承与多态:从基础到实战的深度解析
-
在面向对象编程(OOP)的三大支柱中,继承与多态是构建灵活、可复用代码的核心。无论是日常开发还是框架设计,这两个概念都扮演着至关重要的角色。本文将从基础概念出发,结合实例与图解,带你彻底搞懂Java...
- Java基础教程:Java继承概述_java的继承
-
继承概述假如我们要定义如下类:学生类,老师类和工人类,分析如下。学生类属性:姓名,年龄行为:吃饭,睡觉老师类属性:姓名,年龄,薪水行为:吃饭,睡觉,教书班主任属性:姓名,年龄,薪水行为:吃饭,睡觉,管...
- java4个技巧:从继承和覆盖,到最终的类和方法
-
日复一日,我们编写的大多数Java只使用了该语言全套功能的一小部分。我们实例化的每个流以及我们在实例变量前面加上的每个@Autowired注解都足以完成我们的大部分目标。然而,有些时候,我们必须求助于...
- java:举例说明继承的概念_java继承的理解
-
在现实生活中,继承一般指的是子女继承父辈的财产。在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物,同理,...
- 从零开始构建一款开源的 Vibe Coding 产品 Week1Day4:业界调研之 Agent 横向对比
-
前情回顾前面两天我们重点调研了了一下Cursor的原理和Cursor中一个关键的工具edit_file的实现,但是其他CodingAgent也需要稍微摸一下底,看看有没有优秀之处,下...
- 学会这几个插件,让你的Notepad++使用起来更丝滑
-
搞程序开发的小伙伴相信对Notepad++都不会陌生,是一个占用空间少、打开启动快的文件编辑器,很多程序员喜欢使用Notepad++进行纯文本编辑或者脚本开发,但是Notepad++的功能绝不止于此,...
- 将 node_modules 目录放入 Git 仓库的优点
-
推荐一篇文章Whyyoushouldcheck-inyournodedependencies[1]...
- 再度加码AI编程,腾讯发布AI CLI并宣布CodeBuddy IDE开启公测
-
“再熬一年,90%的程序员可能再也用不着写for循环。”凌晨两点半,王工还在公司敲键盘。他手里那份需求文档写了足足六页,产品经理反复改了三次。放在过去,光数据库建表、接口对接、单元测试就得写两三天。现...
- git 如何查看stash的内容_git查看ssh key
-
1.查看Stash列表首先,使用gitstashlist查看所有已保存的stash:...
- 6万星+ Git命令懒人必备!lazygit 终端UI神器,效率翻倍超顺手!
-
项目概览lazygit是一个基于终端的Git命令可视化工具,通过简易的TUI(文本用户界面)提升Git操作效率。开发者无需记忆复杂命令,即可完成分支管理、提交、合并等操作。...
- 《Gemini CLI 实战系列》(一)Gemini CLI 入门:AI 上命令行的第一步
-
谷歌的Gemini模型最近热度很高,而它的...
- deepin IDE新版发布:支持玲珑构建、增强AI智能化
-
IT之家8月7日消息,深度操作系统官方公众号昨日(8月6日)发布博文,更新推出新版deepin集成开发环境(IDE),重点支持玲珑构建。支持玲珑构建deepinIDE在本次重磅更...
- 狂揽82.7k的star,这款开源可视化神器,轻松创建流程图和图表
-
再不用Mermaid,你的技术文档可能已经在悄悄“腐烂”——图表版本对不上、同事改完没同步、评审会上被一句“这图哪来的”问得哑口无言。这不是危言耸听。GitHub2025年开发者报告显示,63%的新仓...
- 《Gemini CLI 实战系列》(五)打造专属命令行工具箱
-
在前几篇文章中,我们介绍了GeminiCLI的基础用法、效率提升、文件处理和与外部工具结合。今天我们进入第五篇...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
程序员的开源月刊《HelloGitHub》第 71 期
-
详细介绍一下Redis的Watch机制,可以利用Watch机制来做什么?
-
如何将AI助手接入微信(打开ai手机助手)
-
SparkSQL——DataFrame的创建与使用
-
假如有100W个用户抢一张票,除了负载均衡办法,怎么支持高并发?
-
Java面试必考问题:什么是乐观锁与悲观锁
-
redission YYDS spring boot redission 使用
-
一文带你了解Redis与Memcached? redis与memcached的区别
-
如何利用Redis进行事务处理呢? 如何利用redis进行事务处理呢英文
-
- 最近发表
-
- 什么是Java中的继承?如何实现继承?
- Java 继承与多态:从基础到实战的深度解析
- Java基础教程:Java继承概述_java的继承
- java4个技巧:从继承和覆盖,到最终的类和方法
- java:举例说明继承的概念_java继承的理解
- 从零开始构建一款开源的 Vibe Coding 产品 Week1Day4:业界调研之 Agent 横向对比
- 学会这几个插件,让你的Notepad++使用起来更丝滑
- 将 node_modules 目录放入 Git 仓库的优点
- 再度加码AI编程,腾讯发布AI CLI并宣布CodeBuddy IDE开启公测
- git 如何查看stash的内容_git查看ssh key
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)