首页 > Python资料 博客日记
Python-VBA函数之旅-ord函数
2024-05-11 06:00:04Python资料围观181次
目录
一、ord函数的常见应用场景
ord函数是Python中的一个内置函数,它接受一个长度为1的字符串(即一个字符)作为参数,并返回该字符的Unicode码点(也称为Unicode字符号或Unicode编码点),这个码点是一个介于0和1,114,111(即0x10FFFF,Unicode字符集的最大值)之间的整数。该函数常见的应用场景有:
1、字符映射和转换:你可以使用ord()和chr()(将Unicode码点转换为字符)函数来创建自定义的字符映射和转换,例如,你可以编写一个函数来将字符串中的某些字符替换为其他字符。
2、字符集检查:通过比较ord()函数返回的Unicode码点,您可以检查一个字符是否属于某个特定的字符集。例如,您可以检查一个字符是否是ASCII字符(其Unicode码点在0到127之间),或者是否是扩展ASCII字符(其Unicode码点在128到255之间)。
3、处理特殊字符:有时,您可能需要在字符串中查找或替换某些特殊字符,通过知道这些字符的Unicode码点,您可以使用ord()函数来检测它们的存在,并使用chr()函数(ord()的逆函数)来创建它们。
4、加密和解密:虽然ord()函数本身并不直接用于加密或解密,但在某些加密算法中,它可能是一个有用的工具。例如,在某些简单的替换密码中,您可能需要将字符映射到其对应的整数值,然后再应用某种加密算法。
5、文本分析和数据清洗:在处理大量文本数据时,ord()函数可以用于分析文本中的字符分布、检测异常字符等。例如,你可以使用ord()函数来检查文本中是否包含非打印字符(如空格、制表符、换行符等),并据此进行清洗或替换。
6、自定义字符串操作:在某些情况下,你可能需要实现自定义的字符串操作,而这些操作可能需要基于字符的Unicode码点进行。例如,你可以使用ord()函数来实现一个自定义的字符串排序函数,该函数根据字符的Unicode码点进行排序。
7、创建自定义哈希函数:虽然Python提供了内置的哈希函数(如 hash()),但你也可以使用ord()函数来创建自定义的哈希函数,这种哈希函数可能更适合于你的特定应用场景或数据结构。
8、与二进制数据交互:在处理二进制数据时(如网络通信、文件 I/O 等),ord()函数可以帮助你将字节(bytes)对象中的字节(byte)转换为整数,从而进行更复杂的操作。例如,你可以使用ord()函数来解析二进制协议中的字段。
注意,虽然ord()函数在处理单个字符时非常有用,但它并不能直接处理整个字符串。如果你需要对整个字符串进行操作,你可能需要使用其他字符串处理方法(如 str.split()、str.replace()等)或循环遍历字符串中的每个字符。
二、ord函数使用注意事项
在Python中使用ord()函数时,有几个注意事项需要牢记:
1、参数必须是长度为1的字符串:ord()函数只能接受一个长度为1的字符串作为参数,也就是一个单独的字符。如果你传递了一个空字符串或者长度大于1的字符串,将会引发TypeError异常。
2、处理非字符数据:如果你尝试将非字符类型(如整数、浮点数、列表、元组等)传递给ord()函数,也会引发TypeError异常。
3、Unicode编码:ord()函数返回的是字符在Unicode编码中的整数值(也称为Unicode码点),这意味着它可以用于处理任何Unicode字符,而不仅仅是ASCII字符。
4、注意字符编码的环境:虽然Python的内部字符串表示使用Unicode,但当你从外部源(如文件或网络)读取文本时,可能需要处理不同的字符编码(如UTF-8、ISO-8859-1等),确保在读取和写入文本时正确处理字符编码,以避免编码问题。
5、异常处理:由于ord()函数可能会引发TypeError异常,因此在使用它时最好进行异常处理,以确保代码的健壮性。
6、返回值范围:Unicode码点的范围是非常大的(从0到0x10FFFF,即0-1114111),但大多数常用字符的码点都在较小的范围内,了解Unicode码点的范围和特定字符的码点可以帮助你更好地理解字符和字符串。
7、跨平台兼容性:由于Python使用Unicode作为内部字符串表示,因此ord()函数在大多数现代操作系统和平台上都是可用的,并且具有相同的行为,但是,在处理与特定平台或环境相关的字符编码时,仍然需要谨慎。
三、如何用好ord函数?
要充分利用ord()函数并发挥其最大的效用,需遵循以下建议:
1、理解Unicode和字符编码:在使用ord()函数之前,理解字符编码和Unicode是非常重要的;Unicode为每个字符提供了一个唯一的标识符,即码点,而ord()函数就是返回这个码点。
2、字符分类:你可以使用ord()函数来根据字符的Unicode码点范围进行字符分类。例如,检查一个字符是否是大写字母、小写字母、数字、标点符号等。
3、字符串转换:使用ord()函数结合chr()函数(它将一个整数(Unicode码点)转换为一个字符)来进行字符串的转换,这可以用于简单的加密/解密算法,或者只是将字符串中的某些字符替换为其他字符。
4、字符串分析:通过ord()函数,你可以分析字符串中字符的分布情况、频率等,这对于自然语言处理、文本挖掘等任务是非常有用的。
5、自定义哈希函数:如之前所述,你可以使用ord()函数来构建自定义的哈希函数,这在处理需要快速查找或比较大量字符串的场景时可能非常有用。
6、错误处理:当使用ord()函数时,确保你的代码能够妥善处理可能发生的错误。例如,如果传入的参数不是单个字符,那么ord()函数会抛出一个TypeError异常。
7、性能考虑:虽然ord()函数本身是非常快的,但如果你在处理大型字符串或需要频繁地调用它,那么可能会影响到性能,在这种情况下,考虑使用更高效的数据结构和算法,或者将字符串处理任务分批进行。
8、结合其他函数和库:ord()函数可以与其他Python函数和库(如 str.isalpha(), str.isdigit(), `re` 模块等)结合使用,以实现更复杂的字符串处理任务。
9、学习示例和案例:查看其他开发者如何使用ord()函数的示例和案例,这可以帮助你更好地理解其用法和最佳实践。
10、实践:最重要的是,通过实践来加深对ord()函数的理解,尝试编写一些小程序或脚本,使用ord()函数来解决实际问题,这样不仅可以提高你的编程技能,还可以帮助你发现新的应用场景和用法。
1、ord函数:
1-1、Python:
# 1.函数:ord
# 2.功能:用于把一个字符串表示的Unicode字符转换为该字符对应的整数
# 3.语法:ord(c)
# 4.参数:c,表示要转换的单个字符
# 5.返回值:返回Unicode字符对应的整数数值,范围为0~1114111
# 6.说明:
# 7.示例:
# 用dir()函数获取该函数内置的属性和方法
print(dir(ord))
# ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
# '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__',
# '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__',
# '__str__', '__subclasshook__', '__text_signature__']
# 用help()函数获取该函数的文档信息
help(ord)
# 应用一:字符映射和转换
# 示例1:字符到Unicode码点的映射
# 定义一个字符
char = 'A'
# 使用ord()函数获取字符的Unicode码点
unicode_code_point = ord(char)
print(f"字符 '{char}' 的 Unicode 码点是: {unicode_code_point}")
# 字符 'A' 的 Unicode 码点是: 65
# 尝试使用ord()函数获取一个字符串(多于一个字符)的码点(这将引发错误)
# char_string = 'AB'
# unicode_code_point = ord(char_string) # 这会抛出一个 TypeError 异常
# 示例2:Unicode码点到字符的转换
# 定义一个Unicode码点
unicode_code_point = 65
# 使用chr()函数将Unicode码点转换回字符
char = chr(unicode_code_point)
print(f"Unicode 码点 {unicode_code_point} 对应的字符是: '{char}'")
# Unicode 码点 65 对应的字符是: 'A'
# 示例3:简单的字符映射和转换
# 假设我们有一个字符到另一个字符的映射
mapping = {
'A': 'X',
'B': 'Y',
'C': 'Z',
}
# 定义一个字符
char = 'B'
# 检查字符是否在映射中,并获取对应的字符或原始字符
if char in mapping:
mapped_char = mapping[char]
else:
mapped_char = char
# 输出原始字符和映射后的字符
print(f"原始字符: '{char}', 映射后的字符: '{mapped_char}'")
# 如果你想通过ord()和chr()进行转换(虽然在这个例子中不是必要的)
unicode_code_point = ord(char)
mapped_unicode_code_point = ord(mapped_char) if mapped_char != char else unicode_code_point
print(f"原始字符的 Unicode 码点: {unicode_code_point}, 映射后字符的 Unicode 码点: {mapped_unicode_code_point}")
# 原始字符: 'B', 映射后的字符: 'Y'
# 原始字符的 Unicode 码点: 66, 映射后字符的 Unicode 码点: 89
# 应用二:字符集检查
# 示例1:检查字符是否为ASCII字符
def is_ascii(char):
return 0 <= ord(char) <= 127
# 测试
print(is_ascii('A')) # True
print(is_ascii('\n')) # True,换行符也是ASCII字符
# True
# True
# 示例2:检查字符是否为拉丁字母(a-z或A-Z)
def is_latin_letter(char):
return (65 <= ord(char) <= 90) or (97 <= ord(char) <= 122)
# 测试
print(is_latin_letter('A')) # True
print(is_latin_letter('a')) # True
print(is_latin_letter('你')) # False,因为这不是拉丁字母
print(is_latin_letter('1')) # False,因为这不是字母
# True
# True
# False
# False
# 示例3:检查字符是否为中文字符
def is_chinese_char(char):
return '\u4e00' <= char <= '\u9fff'
# 测试
print(is_chinese_char('你'))
print(is_chinese_char('A'))
print(is_chinese_char('1'))
# 注意:由于这个范围有限,它可能不包括所有中文字符
# 例如,'\U0001F600' 是一个笑脸表情符,但它不是中文字符
print(is_chinese_char('\U0001F600'))
# True
# False
# False
# False
# 示例4:检查字符是否为数字(0-9)
def is_digit(char):
return 48 <= ord(char) <= 57
# 测试
print(is_digit('1'))
print(is_digit('a'))
print(is_digit('-'))
# True
# False
# False
# 应用三:处理特殊字符
# 示例1:处理控制字符
# 示例特殊字符:换行符和制表符
newline_char = '\n'
tab_char = '\t'
# 使用ord()函数获取它们的Unicode码点
newline_code_point = ord(newline_char)
tab_code_point = ord(tab_char)
print(f"换行符的 Unicode 码点是: {newline_code_point}")
print(f"制表符的 Unicode 码点是: {tab_code_point}")
# 换行符的 Unicode 码点是: 10
# 制表符的 Unicode 码点是: 9
# 示例2:处理Unicode表情符号
# 示例特殊字符:Unicode笑脸表情符号
emoji = '😊'
# 使用ord()函数获取它的Unicode码点(注意:ord()只处理单个字符)
# 对于多字符的emoji(在Python 3.x的某些版本中),你可能需要使用其他方法
# 例如,使用UTF-16编码的surrogate pairs
emoji_code_point = ord(emoji) # 注意:对于某些emoji,这可能不会返回完整的码点
# 对于完整的Unicode码点(例如,使用UTF-32或UTF-16 surrogate pairs),
# 你可能需要使用专门的库,如 `unicodedata`
# 使用 unicodedata 库来获取emoji的名称(如果可用)
import unicodedata
emoji_name = unicodedata.name(emoji, "Unknown emoji")
print(f"emoji '{emoji}' 的 Unicode 码点(可能不完整): {emoji_code_point}")
print(f"emoji '{emoji}' 的名称是: {emoji_name}")
# emoji '😊' 的 Unicode 码点(可能不完整): 128522
# emoji '😊' 的名称是: SMILING FACE WITH SMILING EYES
# 示例3:处理Unicode转义序列
# 示例:从Unicode转义序列获取字符
unicode_escape_sequence = '\u263A' # 这是一个笑脸表情符号的Unicode转义序列
# 使用chr()函数将Unicode码点转换回字符
character_from_escape = chr(int('263A', 16)) # 将十六进制字符串转换为整数,并使用chr()
print(f"从Unicode转义序列 '\\u263A' 得到的字符是: {character_from_escape}")
# 从Unicode转义序列 '\u263A' 得到的字符是: ☺
# 示例4:检查字符是否为非打印字符
def is_non_printable(char):
# 控制字符的Unicode码点范围大致是0到31和127(包括这些值)
# 但有些字符(如空格、制表符等)虽然在这个范围内,但被认为是可打印的
# 这里我们只检查0到31和127(不包括空格、制表符等)
code_point = ord(char)
return (code_point <= 31 and code_point != 9 and code_point != 10 and code_point != 13) or code_point == 127
# 测试
print(is_non_printable('\n')) # False,换行符是可打印的(尽管是控制字符)
print(is_non_printable('\x07')) # True,这是一个响铃字符(非打印)
print(is_non_printable('A')) # False,字母A是可打印的
# False
# True
# False
# 应用四:加密和解密
# 示例1:凯撒密码加密解密
def caesar_encrypt(text, shift):
"""
使用凯撒密码加密文本
:param text: 要加密的文本
:param shift: 偏移量
:return: 加密后的文本
"""
result = ""
for char in text:
if char.isalpha():
ascii_offset = ord('a') if char.islower() else ord('A')
new_char = chr((ord(char) - ascii_offset + shift) % 26 + ascii_offset)
result += new_char
else:
result += char
return result
def caesar_decrypt(text, shift):
"""
使用凯撒密码解密文本。注意:这里的shift应该是用于加密的相同偏移量
:param text: 要解密的文本
:param shift: 偏移量
:return: 解密后的文本
"""
# 对于解密,我们可以简单地使用负数的偏移量,或者从加密函数中减去shift
return caesar_encrypt(text, -shift)
# 示例用法
plain_text = "Hello, Python!"
shift = 6 # 偏移3个字符
# 加密
encrypted_text = caesar_encrypt(plain_text, shift)
print(f"Encrypted: {encrypted_text}")
# 解密
decrypted_text = caesar_decrypt(encrypted_text, shift)
print(f"Decrypted: {decrypted_text}")
# Encrypted: Nkrru, Veznut!
# Decrypted: Hello, Python!
# 应用五:文本分析和数据清洗
# 示例1:检测并删除非ASCII字符
def remove_non_ascii(text):
return ''.join(char for char in text if ord(char) <= 127)
# 示例文本
text = "Hello, 世界!"
# 删除非ASCII字符
cleaned_text = remove_non_ascii(text)
print(cleaned_text)
# Hello, !
# 示例2:检测并替换特殊字符
import string
def replace_special_chars(text, replace_with=' '):
translator = str.maketrans('', '', string.punctuation + string.digits)
return replace_with.join(
''.join(char if ord(char) < 128 and char not in string.punctuation + string.digits else replace_with
for char in text).split())
# 示例文本
text = "Hello, world! 123"
# 替换特殊字符为空格
cleaned_text = replace_special_chars(text)
print(cleaned_text)
# 替换特殊字符为下划线
cleaned_text_underscore = replace_special_chars(text, '_')
print(cleaned_text_underscore)
# Hello world
# Hello__world_____
# 示例3:文本中的字符频率分析
def character_frequency(text):
frequency = {}
for char in text:
if ord(char) < 128: # 只考虑ASCII字符
frequency[char] = frequency.get(char, 0) + 1
return frequency
# 示例文本
text = "aaabbbccc"
# 分析字符频率
freq = character_frequency(text)
print(freq)
# {'a': 3, 'b': 3, 'c': 3}
# 示例4:检测并删除控制字符
def remove_control_chars(text):
return ''.join(char for char in text if 32 <= ord(char) <= 126) # 保留ASCII可打印字符
# 示例文本,包含控制字符
text = "Hello\tworld\n!"
# 删除控制字符
cleaned_text = remove_control_chars(text)
print(cleaned_text)
# Helloworld!
# 应用六:自定义字符串操作
# 示例1:将字符串中的大写字母转换为小写字母(不使用内置的lower()方法)
def custom_lowercase(s):
return ''.join(chr(ord(c) + 32) if 'A' <= c <= 'Z' else c for c in s)
# 示例
text = "HELLO WORLD"
lowercase_text = custom_lowercase(text)
print(lowercase_text)
# hello world
# 示例2:检查字符串是否只包含数字
def is_numeric(s):
return all(ord(c) >= ord('0') and ord(c) <= ord('9') for c in s)
# 示例
text1 = "12345"
text2 = "123abc"
print(is_numeric(text1))
print(is_numeric(text2))
# True
# False
# 示例3:将字符串中的元音字母替换为指定的字符
def replace_vowels(s, replacement_char):
vowels = 'aeiouAEIOU'
return ''.join(replacement_char if c in vowels else c for c in s)
# 使用 ord() 的版本(仅为了演示,实际上这个例子中不需要 ord())
def replace_vowels_with_ord(s, replacement_char):
vowels = [ord(c) for c in 'aeiouAEIOU']
return ''.join(chr(replacement_char) if ord(c) in vowels else c for c in s)
# 示例
text = "Hello, World!"
replaced_text = replace_vowels(text, '*')
print(replaced_text)
# 使用ord()的版本(这个例子稍显冗余)
replaced_text_with_ord = replace_vowels_with_ord(text, ord('*'))
print(replaced_text_with_ord)
# H*ll*, W*rld!
# H*ll*, W*rld!
# 示例4:将字符串中的字符按照其Unicode码点排序
def sort_by_ord(s):
return ''.join(sorted(s, key=ord))
# 示例
text = "myelsa jimmy"
sorted_text = sort_by_ord(text)
print(sorted_text) # 输出: ' aeijlmmmsyy' (注意排序是基于Unicode码点,不是字母顺序)
# aeijlmmmsyy
# 应用七:创建自定义哈希函数
def custom_hash(s):
# 初始化哈希值为一个质数(通常用于哈希函数以减少冲突)
hash_value = 2166136261
# 选择一个质数作为乘数(可以根据需要调整)
multiplier = 16777619
# 遍历字符串中的每个字符
for char in s:
# 使用ord()函数获取字符的Unicode码点
hash_value = (hash_value * multiplier) ^ ord(char)
# 使用异或(^)运算和乘数来“混合”哈希值
# 这可以增加哈希函数的“雪崩效应”,使得输入字符串的微小变化导致哈希值的显著不同
# 为了避免负哈希值(如果需要的话),可以取绝对值或者进行模运算
hash_value = hash_value & 0x7fffffff # 取无符号整数的低31位(假设Python int足够大)
return hash_value
# 示例
text1 = "hello"
text2 = "world"
# 计算哈希值
hash1 = custom_hash(text1)
hash2 = custom_hash(text2)
print(f"Hash of '{text1}': {hash1}")
print(f"Hash of '{text2}': {hash2}")
# Hash of 'hello': 922382695
# Hash of 'world': 462325295
# 应用八:与二进制数据交互
# 示例1:将ASCII字符串转换为字节列表
def string_to_bytes(s):
return [ord(c) for c in s]
# 示例
ascii_string = "Hello"
bytes_list = string_to_bytes(ascii_string)
print(bytes_list)
# [72, 101, 108, 108, 111]
# 示例2:将字节列表转换回ASCII字符串(ord函数未直接参与)
def bytes_to_string(bytes_list):
return ''.join(chr(b) for b in bytes_list)
# 示例
bytes_list = [72, 101, 108, 108, 111]
ascii_string = bytes_to_string(bytes_list)
print(ascii_string)
# Hello
1-2、VBA:
略,待后补。
2、推荐阅读:
Python算法之旅:Algorithm
Python函数之旅:Functions
个人主页:神奇夜光杯-CSDN博客
标签:
相关文章
最新发布
- 光流法结合深度学习神经网络的原理及应用(完整代码都有Python opencv)
- Python 图像处理进阶:特征提取与图像分类
- 大数据可视化分析-基于python的电影数据分析及可视化系统_9532dr50
- 【Python】入门(运算、输出、数据类型)
- 【Python】第一弹---解锁编程新世界:深入理解计算机基础与Python入门指南
- 华为OD机试E卷 --第k个排列 --24年OD统一考试(Java & JS & Python & C & C++)
- Python已安装包在import时报错未找到的解决方法
- 【Python】自动化神器PyAutoGUI —告别手动操作,一键模拟鼠标键盘,玩转微信及各种软件自动化
- Pycharm连接SQL Sever(详细教程)
- Python编程练习题及解析(49题)
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Anaconda版本和Python版本对应关系(持续更新...)
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- Windows上安装 Python 环境并配置环境变量 (超详细教程)
- Python与PyTorch的版本对应
- 安装spacy+zh_core_web_sm避坑指南