百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

python常用得内置函数解析——chr()函数

wptr33 2025-09-29 13:37 20 浏览

大家好详细解析 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. 注意事项和最佳实践

  1. 参数验证:始终确保参数在有效范围内
  2. 字符集兼容性:考虑目标环境的字符集支持
  3. 性能考虑:对于已知字符,直接使用字符字面量更高效
  4. 编码问题:在处理文件或网络时,注意字符编码
# 最佳实践:使用错误处理
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 文本处理中非常基础且强大的工具,它使得程序能够动态生成和处理各种字符,特别是在需要处理多语言文本、特殊符号或创建动态内容时非常有用。

相关推荐

oracle数据导入导出_oracle数据导入导出工具

关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...

继续学习Python中的while true/break语句

上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...

python continue和break的区别_python中break语句和continue语句的区别

python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...

简单学Python——关键字6——break和continue

Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...

2-1,0基础学Python之 break退出循环、 continue继续循环 多重循

用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...

Python 中 break 和 continue 傻傻分不清

大家好啊,我是大田。...

python中的流程控制语句:continue、break 和 return使用方法

Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...

L017:continue和break - 教程文案

continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...

作为前端开发者,你都经历过怎样的面试?

已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...

面试被问 const 是否不可变?这样回答才显功底

作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...

2023金九银十必看前端面试题!2w字精品!

导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...

前端面试总结_前端面试题整理

记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...

2024前端面试真题之—VUE篇_前端面试题vue2020及答案

添加图片注释,不超过140字(可选)...

今年最常见的前端面试题,你会做几道?

在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...