首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

Python-VBA函数之旅-ord函数

  • 25-03-03 04:30
  • 3622
  • 13364
blog.csdn.net

目录

一、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. # 1.函数:ord
  2. # 2.功能:用于把一个字符串表示的Unicode字符转换为该字符对应的整数
  3. # 3.语法:ord(c)
  4. # 4.参数:c,表示要转换的单个字符
  5. # 5.返回值:返回Unicode字符对应的整数数值,范围为0~1114111
  6. # 6.说明:
  7. # 7.示例:
  8. # 用dir()函数获取该函数内置的属性和方法
  9. print(dir(ord))
  10. # ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
  11. # '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__',
  12. # '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__',
  13. # '__str__', '__subclasshook__', '__text_signature__']
  14. # 用help()函数获取该函数的文档信息
  15. help(ord)
  16. # 应用一:字符映射和转换
  17. # 示例1:字符到Unicode码点的映射
  18. # 定义一个字符
  19. char = 'A'
  20. # 使用ord()函数获取字符的Unicode码点
  21. unicode_code_point = ord(char)
  22. print(f"字符 '{char}' 的 Unicode 码点是: {unicode_code_point}")
  23. # 字符 'A' 的 Unicode 码点是: 65
  24. # 尝试使用ord()函数获取一个字符串(多于一个字符)的码点(这将引发错误)
  25. # char_string = 'AB'
  26. # unicode_code_point = ord(char_string) # 这会抛出一个 TypeError 异常
  27. # 示例2:Unicode码点到字符的转换
  28. # 定义一个Unicode码点
  29. unicode_code_point = 65
  30. # 使用chr()函数将Unicode码点转换回字符
  31. char = chr(unicode_code_point)
  32. print(f"Unicode 码点 {unicode_code_point} 对应的字符是: '{char}'")
  33. # Unicode 码点 65 对应的字符是: 'A'
  34. # 示例3:简单的字符映射和转换
  35. # 假设我们有一个字符到另一个字符的映射
  36. mapping = {
  37. 'A': 'X',
  38. 'B': 'Y',
  39. 'C': 'Z',
  40. }
  41. # 定义一个字符
  42. char = 'B'
  43. # 检查字符是否在映射中,并获取对应的字符或原始字符
  44. if char in mapping:
  45. mapped_char = mapping[char]
  46. else:
  47. mapped_char = char
  48. # 输出原始字符和映射后的字符
  49. print(f"原始字符: '{char}', 映射后的字符: '{mapped_char}'")
  50. # 如果你想通过ord()和chr()进行转换(虽然在这个例子中不是必要的)
  51. unicode_code_point = ord(char)
  52. mapped_unicode_code_point = ord(mapped_char) if mapped_char != char else unicode_code_point
  53. print(f"原始字符的 Unicode 码点: {unicode_code_point}, 映射后字符的 Unicode 码点: {mapped_unicode_code_point}")
  54. # 原始字符: 'B', 映射后的字符: 'Y'
  55. # 原始字符的 Unicode 码点: 66, 映射后字符的 Unicode 码点: 89
  56. # 应用二:字符集检查
  57. # 示例1:检查字符是否为ASCII字符
  58. def is_ascii(char):
  59. return 0 <= ord(char) <= 127
  60. # 测试
  61. print(is_ascii('A')) # True
  62. print(is_ascii('\n')) # True,换行符也是ASCII字符
  63. # True
  64. # True
  65. # 示例2:检查字符是否为拉丁字母(a-z或A-Z)
  66. def is_latin_letter(char):
  67. return (65 <= ord(char) <= 90) or (97 <= ord(char) <= 122)
  68. # 测试
  69. print(is_latin_letter('A')) # True
  70. print(is_latin_letter('a')) # True
  71. print(is_latin_letter('你')) # False,因为这不是拉丁字母
  72. print(is_latin_letter('1')) # False,因为这不是字母
  73. # True
  74. # True
  75. # False
  76. # False
  77. # 示例3:检查字符是否为中文字符
  78. def is_chinese_char(char):
  79. return '\u4e00' <= char <= '\u9fff'
  80. # 测试
  81. print(is_chinese_char('你'))
  82. print(is_chinese_char('A'))
  83. print(is_chinese_char('1'))
  84. # 注意:由于这个范围有限,它可能不包括所有中文字符
  85. # 例如,'\U0001F600' 是一个笑脸表情符,但它不是中文字符
  86. print(is_chinese_char('\U0001F600'))
  87. # True
  88. # False
  89. # False
  90. # False
  91. # 示例4:检查字符是否为数字(0-9)
  92. def is_digit(char):
  93. return 48 <= ord(char) <= 57
  94. # 测试
  95. print(is_digit('1'))
  96. print(is_digit('a'))
  97. print(is_digit('-'))
  98. # True
  99. # False
  100. # False
  101. # 应用三:处理特殊字符
  102. # 示例1:处理控制字符
  103. # 示例特殊字符:换行符和制表符
  104. newline_char = '\n'
  105. tab_char = '\t'
  106. # 使用ord()函数获取它们的Unicode码点
  107. newline_code_point = ord(newline_char)
  108. tab_code_point = ord(tab_char)
  109. print(f"换行符的 Unicode 码点是: {newline_code_point}")
  110. print(f"制表符的 Unicode 码点是: {tab_code_point}")
  111. # 换行符的 Unicode 码点是: 10
  112. # 制表符的 Unicode 码点是: 9
  113. # 示例2:处理Unicode表情符号
  114. # 示例特殊字符:Unicode笑脸表情符号
  115. emoji = '?'
  116. # 使用ord()函数获取它的Unicode码点(注意:ord()只处理单个字符)
  117. # 对于多字符的emoji(在Python 3.x的某些版本中),你可能需要使用其他方法
  118. # 例如,使用UTF-16编码的surrogate pairs
  119. emoji_code_point = ord(emoji) # 注意:对于某些emoji,这可能不会返回完整的码点
  120. # 对于完整的Unicode码点(例如,使用UTF-32或UTF-16 surrogate pairs),
  121. # 你可能需要使用专门的库,如 `unicodedata`
  122. # 使用 unicodedata 库来获取emoji的名称(如果可用)
  123. import unicodedata
  124. emoji_name = unicodedata.name(emoji, "Unknown emoji")
  125. print(f"emoji '{emoji}' 的 Unicode 码点(可能不完整): {emoji_code_point}")
  126. print(f"emoji '{emoji}' 的名称是: {emoji_name}")
  127. # emoji '?' 的 Unicode 码点(可能不完整): 128522
  128. # emoji '?' 的名称是: SMILING FACE WITH SMILING EYES
  129. # 示例3:处理Unicode转义序列
  130. # 示例:从Unicode转义序列获取字符
  131. unicode_escape_sequence = '\u263A' # 这是一个笑脸表情符号的Unicode转义序列
  132. # 使用chr()函数将Unicode码点转换回字符
  133. character_from_escape = chr(int('263A', 16)) # 将十六进制字符串转换为整数,并使用chr()
  134. print(f"从Unicode转义序列 '\\u263A' 得到的字符是: {character_from_escape}")
  135. # 从Unicode转义序列 '\u263A' 得到的字符是: ☺
  136. # 示例4:检查字符是否为非打印字符
  137. def is_non_printable(char):
  138. # 控制字符的Unicode码点范围大致是0到31和127(包括这些值)
  139. # 但有些字符(如空格、制表符等)虽然在这个范围内,但被认为是可打印的
  140. # 这里我们只检查0到31和127(不包括空格、制表符等)
  141. code_point = ord(char)
  142. return (code_point <= 31 and code_point != 9 and code_point != 10 and code_point != 13) or code_point == 127
  143. # 测试
  144. print(is_non_printable('\n')) # False,换行符是可打印的(尽管是控制字符)
  145. print(is_non_printable('\x07')) # True,这是一个响铃字符(非打印)
  146. print(is_non_printable('A')) # False,字母A是可打印的
  147. # False
  148. # True
  149. # False
  150. # 应用四:加密和解密
  151. # 示例1:凯撒密码加密解密
  152. def caesar_encrypt(text, shift):
  153. """
  154. 使用凯撒密码加密文本
  155. :param text: 要加密的文本
  156. :param shift: 偏移量
  157. :return: 加密后的文本
  158. """
  159. result = ""
  160. for char in text:
  161. if char.isalpha():
  162. ascii_offset = ord('a') if char.islower() else ord('A')
  163. new_char = chr((ord(char) - ascii_offset + shift) % 26 + ascii_offset)
  164. result += new_char
  165. else:
  166. result += char
  167. return result
  168. def caesar_decrypt(text, shift):
  169. """
  170. 使用凯撒密码解密文本。注意:这里的shift应该是用于加密的相同偏移量
  171. :param text: 要解密的文本
  172. :param shift: 偏移量
  173. :return: 解密后的文本
  174. """
  175. # 对于解密,我们可以简单地使用负数的偏移量,或者从加密函数中减去shift
  176. return caesar_encrypt(text, -shift)
  177. # 示例用法
  178. plain_text = "Hello, Python!"
  179. shift = 6 # 偏移3个字符
  180. # 加密
  181. encrypted_text = caesar_encrypt(plain_text, shift)
  182. print(f"Encrypted: {encrypted_text}")
  183. # 解密
  184. decrypted_text = caesar_decrypt(encrypted_text, shift)
  185. print(f"Decrypted: {decrypted_text}")
  186. # Encrypted: Nkrru, Veznut!
  187. # Decrypted: Hello, Python!
  188. # 应用五:文本分析和数据清洗
  189. # 示例1:检测并删除非ASCII字符
  190. def remove_non_ascii(text):
  191. return ''.join(char for char in text if ord(char) <= 127)
  192. # 示例文本
  193. text = "Hello, 世界!"
  194. # 删除非ASCII字符
  195. cleaned_text = remove_non_ascii(text)
  196. print(cleaned_text)
  197. # Hello, !
  198. # 示例2:检测并替换特殊字符
  199. import string
  200. def replace_special_chars(text, replace_with=' '):
  201. translator = str.maketrans('', '', string.punctuation + string.digits)
  202. return replace_with.join(
  203. ''.join(char if ord(char) < 128 and char not in string.punctuation + string.digits else replace_with
  204. for char in text).split())
  205. # 示例文本
  206. text = "Hello, world! 123"
  207. # 替换特殊字符为空格
  208. cleaned_text = replace_special_chars(text)
  209. print(cleaned_text)
  210. # 替换特殊字符为下划线
  211. cleaned_text_underscore = replace_special_chars(text, '_')
  212. print(cleaned_text_underscore)
  213. # Hello world
  214. # Hello__world_____
  215. # 示例3:文本中的字符频率分析
  216. def character_frequency(text):
  217. frequency = {}
  218. for char in text:
  219. if ord(char) < 128: # 只考虑ASCII字符
  220. frequency[char] = frequency.get(char, 0) + 1
  221. return frequency
  222. # 示例文本
  223. text = "aaabbbccc"
  224. # 分析字符频率
  225. freq = character_frequency(text)
  226. print(freq)
  227. # {'a': 3, 'b': 3, 'c': 3}
  228. # 示例4:检测并删除控制字符
  229. def remove_control_chars(text):
  230. return ''.join(char for char in text if 32 <= ord(char) <= 126) # 保留ASCII可打印字符
  231. # 示例文本,包含控制字符
  232. text = "Hello\tworld\n!"
  233. # 删除控制字符
  234. cleaned_text = remove_control_chars(text)
  235. print(cleaned_text)
  236. # Helloworld!
  237. # 应用六:自定义字符串操作
  238. # 示例1:将字符串中的大写字母转换为小写字母(不使用内置的lower()方法)
  239. def custom_lowercase(s):
  240. return ''.join(chr(ord(c) + 32) if 'A' <= c <= 'Z' else c for c in s)
  241. # 示例
  242. text = "HELLO WORLD"
  243. lowercase_text = custom_lowercase(text)
  244. print(lowercase_text)
  245. # hello world
  246. # 示例2:检查字符串是否只包含数字
  247. def is_numeric(s):
  248. return all(ord(c) >= ord('0') and ord(c) <= ord('9') for c in s)
  249. # 示例
  250. text1 = "12345"
  251. text2 = "123abc"
  252. print(is_numeric(text1))
  253. print(is_numeric(text2))
  254. # True
  255. # False
  256. # 示例3:将字符串中的元音字母替换为指定的字符
  257. def replace_vowels(s, replacement_char):
  258. vowels = 'aeiouAEIOU'
  259. return ''.join(replacement_char if c in vowels else c for c in s)
  260. # 使用 ord() 的版本(仅为了演示,实际上这个例子中不需要 ord())
  261. def replace_vowels_with_ord(s, replacement_char):
  262. vowels = [ord(c) for c in 'aeiouAEIOU']
  263. return ''.join(chr(replacement_char) if ord(c) in vowels else c for c in s)
  264. # 示例
  265. text = "Hello, World!"
  266. replaced_text = replace_vowels(text, '*')
  267. print(replaced_text)
  268. # 使用ord()的版本(这个例子稍显冗余)
  269. replaced_text_with_ord = replace_vowels_with_ord(text, ord('*'))
  270. print(replaced_text_with_ord)
  271. # H*ll*, W*rld!
  272. # H*ll*, W*rld!
  273. # 示例4:将字符串中的字符按照其Unicode码点排序
  274. def sort_by_ord(s):
  275. return ''.join(sorted(s, key=ord))
  276. # 示例
  277. text = "myelsa jimmy"
  278. sorted_text = sort_by_ord(text)
  279. print(sorted_text) # 输出: ' aeijlmmmsyy' (注意排序是基于Unicode码点,不是字母顺序)
  280. # aeijlmmmsyy
  281. # 应用七:创建自定义哈希函数
  282. def custom_hash(s):
  283. # 初始化哈希值为一个质数(通常用于哈希函数以减少冲突)
  284. hash_value = 2166136261
  285. # 选择一个质数作为乘数(可以根据需要调整)
  286. multiplier = 16777619
  287. # 遍历字符串中的每个字符
  288. for char in s:
  289. # 使用ord()函数获取字符的Unicode码点
  290. hash_value = (hash_value * multiplier) ^ ord(char)
  291. # 使用异或(^)运算和乘数来“混合”哈希值
  292. # 这可以增加哈希函数的“雪崩效应”,使得输入字符串的微小变化导致哈希值的显著不同
  293. # 为了避免负哈希值(如果需要的话),可以取绝对值或者进行模运算
  294. hash_value = hash_value & 0x7fffffff # 取无符号整数的低31位(假设Python int足够大)
  295. return hash_value
  296. # 示例
  297. text1 = "hello"
  298. text2 = "world"
  299. # 计算哈希值
  300. hash1 = custom_hash(text1)
  301. hash2 = custom_hash(text2)
  302. print(f"Hash of '{text1}': {hash1}")
  303. print(f"Hash of '{text2}': {hash2}")
  304. # Hash of 'hello': 922382695
  305. # Hash of 'world': 462325295
  306. # 应用八:与二进制数据交互
  307. # 示例1:将ASCII字符串转换为字节列表
  308. def string_to_bytes(s):
  309. return [ord(c) for c in s]
  310. # 示例
  311. ascii_string = "Hello"
  312. bytes_list = string_to_bytes(ascii_string)
  313. print(bytes_list)
  314. # [72, 101, 108, 108, 111]
  315. # 示例2:将字节列表转换回ASCII字符串(ord函数未直接参与)
  316. def bytes_to_string(bytes_list):
  317. return ''.join(chr(b) for b in bytes_list)
  318. # 示例
  319. bytes_list = [72, 101, 108, 108, 111]
  320. ascii_string = bytes_to_string(bytes_list)
  321. print(ascii_string)
  322. # Hello
1-2、VBA:
略,待后补。
2、推荐阅读:

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

Python算法之旅:Algorithm

Python函数之旅:Functions

个人主页:神奇夜光杯-CSDN博客 
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览61139 人正在系统学习中
遨游码海,我心飞扬
微信名片
注:本文转载自blog.csdn.net的神奇夜光杯的文章"https://myelsa1024.blog.csdn.net/article/details/138470809"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top