首页 > Python资料 博客日记

Python-VBA函数之旅-ord函数

2024-05-11 06:00:04Python资料围观84

本篇文章分享Python-VBA函数之旅-ord函数,对你有帮助的话记得收藏一下,看Python资料网收获更多编程知识

目录

一、ord函数的常见应用场景

二、ord函数使用注意事项

三、如何用好ord函数?

1、ord函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页:神奇夜光杯-CSDN博客 

一、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、推荐阅读:

2-1、Python-VBA函数之旅-open()函数

Python算法之旅:Algorithm

Python函数之旅:Functions

个人主页:神奇夜光杯-CSDN博客 

版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐