一个认为一切根源都是"自己不够强"的INTJ
个人主页:用哲学编程-CSDN博客
专栏:每日一题------举一反三
Python编程学习
Python内置函数
目录
[使用场景 1:字符排序和比较](#使用场景 1:字符排序和比较)
[使用场景 2:字符编码转换](#使用场景 2:字符编码转换)
[使用场景 3:简单加密](#使用场景 3:简单加密)
[使用场景 5:字符映射和处理](#使用场景 5:字符映射和处理)
[使用技巧 1:检测字符串是否排序](#使用技巧 1:检测字符串是否排序)
[使用技巧 2:生成字符范围列表](#使用技巧 2:生成字符范围列表)
[使用技巧 3:实现自定义的字符编码方案](#使用技巧 3:实现自定义的字符编码方案)
[使用技巧 4:找到字符串中第一个非重复字符](#使用技巧 4:找到字符串中第一个非重复字符)
[使用技巧 5:计算字符串的哈希值](#使用技巧 5:计算字符串的哈希值)
[巧妙用法 1:实现基本的字符串加密(维吉尼亚密码)](#巧妙用法 1:实现基本的字符串加密(维吉尼亚密码))
[巧妙用法 2:生成可读的唯一标识符](#巧妙用法 2:生成可读的唯一标识符)
[巧妙用法 3:字符矩阵的旋转操作](#巧妙用法 3:字符矩阵的旋转操作)
详细说明
概述
ord() 函数是 Python 内置函数之一,用于返回表示单个 Unicode 字符的字符串的 Unicode 码点(Unicode code point)的整数值。这个函数在处理 Unicode 字符时非常有用,特别是在需要获取字符的数值表示时。
语法
ord(c)
参数
- c:表示单个 Unicode 字符的字符串。注意,这个字符串必须是长度为 1 的字符串,如果长度不为 1 或者不是字符串类型,将会抛出 TypeError。
返回值
返回给定字符的 Unicode 码点,类型为整数。
示例
以下是一些 ord() 函数的示例:
python
# 获取小写字母 'a' 的 Unicode 码点
unicode_a = ord('a')
print(unicode_a) # 输出 97
# 获取大写字母 'A' 的 Unicode 码点
unicode_A = ord('A')
print(unicode_A) # 输出 65
# 获取欧元符号 '€' 的 Unicode 码点
unicode_euro = ord('€')
print(unicode_euro) # 输出 8364
# 获取中文字符 '你' 的 Unicode 码点
unicode_chinese_char = ord('你')
print(unicode_chinese_char) # 输出 20320
注意事项
ord() 函数只接受长度为 1 的字符串。如果传入的字符串长度不为 1,将会引发 TypeError 异常。例如:
python
ord('ab') # 将会导致 TypeError: ord() expected a character, but string of length 2 found
虽然 ord() 函数主要用于 Unicode 字符,但它也适用于 ASCII 字符,因为 ASCII 是 Unicode 的一个子集。例如:
python
ord('A') # 返回 65
ord('a') # 返回 97
ord() 是 chr() 函数的逆函数。chr() 函数用于将 Unicode 码点转换为对应的字符。例如:
python
chr(97) # 返回 'a'
chr(8364) # 返回 '€'
应用场景
- 字符编码:在文本处理和自然语言处理 (NLP) 中,了解字符的 Unicode 码点可以帮助进行字符编码和解码。
- 排序和比较:在某些情况下,需要根据字符的 Unicode 码点进行排序或比较。
- 数据处理:在一些数据处理任务中,可能需要将字符转换为其数值表示,以便进行进一步处理。
通过了解和使用 ord() 函数,可以更好地处理和操作字符串及其对应的 Unicode 码点。
记忆策略
联想记忆:
- ord 可以联想到 "ordinal"(序数)的缩写,表示顺序或位置。Unicode 码点正是字符在 Unicode 表中的位置。
- 可以想象每个字符在 Unicode 表中都有一个"序号",ord() 函数就是获取这个"序号"。
常用场景
当然,以下是几个 ord() 函数的详细使用场景,每行代码都有注释:
使用场景 1:字符排序和比较
在需要对字符串中的字符进行排序或比较时,ord() 函数非常有用。
python
# 定义两个字符进行比较
char1 = 'b'
char2 = 'a'
# 使用 ord() 获取字符的 Unicode 码点并进行比较
if ord(char1) > ord(char2):
print(f"'{char1}' 大于 '{char2}'") # 输出: 'b' 大于 'a'
else:
print(f"'{char1}' 小于或等于 '{char2}'")
# 对字符串进行排序
string = "hello"
sorted_string = ''.join(sorted(string, key=ord))
print(sorted_string) # 输出: 'ehllo'
使用场景 2:字符编码转换
在需要进行字符编码转换或处理特殊字符时,可以使用 ord() 函数获取字符的 Unicode 码点。
python
# 定义一个包含特殊字符的字符串
special_chars = "你好,世界!"
# 将字符串中的每个字符转换为 Unicode 码点
unicode_points = [ord(char) for char in special_chars]
# 打印 Unicode 码点
print(unicode_points) # 输出: [20320, 22909, 65292, 19990, 30028, 65281]
# 将 Unicode 码点转换回字符
reconstructed_string = ''.join(chr(point) for point in unicode_points)
print(reconstructed_string) # 输出: '你好,世界!'
使用场景 3:简单加密
可以使用 ord() 函数进行简单的字符加密,例如凯撒密码。
python
def caesar_encrypt(text, shift):
encrypted_text = []
for char in text:
# 对字母进行加密
if char.isalpha():
# 根据字符大小写,使用不同的开始点
start = ord('A') if char.isupper() else ord('a')
# 计算加密后的字符
encrypted_char = chr((ord(char) - start + shift) % 26 + start)
encrypted_text.append(encrypted_char)
else:
# 非字母字符不变
encrypted_text.append(char)
return ''.join(encrypted_text)
# 示例加密
original_text = "Hello, World!"
encrypted_text = caesar_encrypt(original_text, 3)
print(encrypted_text) # 输出: 'Khoor, Zruog!'
使用场景 5:字符映射和处理
在需要对特定字符进行映射或处理时,可以结合 ord() 和 chr() 函数使用。
python
# 定义需要处理的字符集
characters = "ABCabc123"
# 定义字符映射表,将每个字符转换为其 Unicode 码点的十六进制表示
char_map = {char: hex(ord(char)) for char in characters}
# 打印字符映射表
for char, hex_value in char_map.items():
print(f"字符 '{char}' 的 Unicode 码点为: {hex_value}")
# 输出类似:
# 字符 'A' 的 Unicode 码点为: 0x41
# 字符 'B' 的 Unicode 码点为: 0x42
# 字符 'C' 的 Unicode 码点为: 0x43
# 字符 'a' 的 Unicode 码点为: 0x61
# 字符 'b' 的 Unicode 码点为: 0x62
# 字符 'c' 的 Unicode 码点为: 0x63
# 字符 '1' 的 Unicode 码点为: 0x31
# 字符 '2' 的 Unicode 码点为: 0x32
# 字符 '3' 的 Unicode 码点为: 0x33
巧妙用法
ord() 函数虽然简单,但在某些情况下可以用来实现一些巧妙的功能。以下是几个不常见但非常巧妙的使用技巧:
使用技巧 1:检测字符串是否排序
可以使用 ord() 函数快速检测一个字符串是否已经按字母顺序排序。
python
def is_sorted_string(s):
# 用 ord() 获取每个字符的 Unicode 码点,检查是否按顺序排列
return all(ord(s[i]) <= ord(s[i + 1]) for i in range(len(s) - 1))
# 示例
print(is_sorted_string("abc")) # 输出: True
print(is_sorted_string("cba")) # 输出: False
print(is_sorted_string("aabb")) # 输出: True
使用技巧 2:生成字符范围列表
使用 ord() 和 chr() 函数,可以生成一系列连续的字符列表,比如生成从 'a' 到 'z' 的字母表。
python
def generate_char_range(start_char, end_char):
# 获取起始和结束字符的 Unicode 码点
start = ord(start_char)
end = ord(end_char)
# 生成从起始字符到结束字符之间的所有字符
return [chr(i) for i in range(start, end + 1)]
# 示例
alphabet = generate_char_range('a', 'z')
print(alphabet) # 输出: ['a', 'b', 'c', ..., 'z']
使用技巧 3:实现自定义的字符编码方案
可以使用 ord() 来实现一个简单的自定义字符编码方案,在特定情况下可以用于加密或数据处理。
python
def custom_encode(text, offset):
encoded_chars = []
for char in text:
# 将每个字符的 Unicode 码点加上偏移量进行编码
encoded_char = chr(ord(char) + offset)
encoded_chars.append(encoded_char)
return ''.join(encoded_chars)
def custom_decode(encoded_text, offset):
decoded_chars = []
for char in encoded_text:
# 将每个编码字符的 Unicode 码点减去偏移量进行解码
decoded_char = chr(ord(char) - offset)
decoded_chars.append(decoded_char)
return ''.join(decoded_chars)
# 示例
original_text = "Hello, World!"
offset = 5
# 编码
encoded_text = custom_encode(original_text, offset)
print(encoded_text) # 输出: 'Mjqqt,~Btwqi!'
# 解码
decoded_text = custom_decode(encoded_text, offset)
print(decoded_text) # 输出: 'Hello, World!'
使用技巧 4:找到字符串中第一个非重复字符
使用 ord() 函数来实现更高效地找到字符串中第一个非重复字符。
python
def first_non_repeating_char(s):
# 使用数组来统计字符出现的次数(假设字符在 ASCII 范围内)
char_count = [0] * 256
for char in s:
char_count[ord(char)] += 1
# 找到第一个出现次数为 1 的字符
for char in s:
if char_count[ord(char)] == 1:
return char
return None
# 示例
test_string = "swiss"
result = first_non_repeating_char(test_string)
print(result) # 输出: 'w'
使用技巧 5:计算字符串的哈希值
可以使用 ord() 函数来计算字符串的简单哈希值,尽管这不是一个强散列函数,但在某些简单场景下可以使用。
python
def simple_hash(s):
# 使用 ord() 来计算每个字符的哈希值
hash_value = 0
for char in s:
hash_value = (hash_value * 31 + ord(char)) % (10**9 + 7)
return hash_value
# 示例
test_string = "hello"
print(simple_hash(test_string)) # 输出: 哈希值(如 99162322)
这些技巧展示了 ord() 函数在一些不太常见但非常巧妙的用法。在实际开发中,灵活运用 ord() 和 chr() 函数,可以为解决问题提供一些独特的思路和方法。
综合技巧
当然,以下是几个非常巧妙的 ord() 函数和其他函数或方法组合使用的示例:
巧妙用法 1:实现基本的字符串加密(维吉尼亚密码)
维吉尼亚密码是一种基于凯撒密码的多表密码。可以利用 ord() 和 chr() 函数来实现。
python
def vigenere_encrypt(text, key):
encrypted_text = []
key_length = len(key)
for i, char in enumerate(text):
if char.isalpha():
# 获取文本和密钥字符的 Unicode 码点
text_char_code = ord(char)
key_char_code = ord(key[i % key_length])
base = ord('A') if char.isupper() else ord('a')
# 计算加密字符
encrypted_char = chr((text_char_code + key_char_code - 2 * base) % 26 + base)
encrypted_text.append(encrypted_char)
else:
encrypted_text.append(char)
return ''.join(encrypted_text)
def vigenere_decrypt(encrypted_text, key):
decrypted_text = []
key_length = len(key)
for i, char in enumerate(encrypted_text):
if char.isalpha():
# 获取加密文本和密钥字符的 Unicode 码点
encrypted_char_code = ord(char)
key_char_code = ord(key[i % key_length])
base = ord('A') if char.isupper() else ord('a')
# 计算解密字符
decrypted_char = chr((encrypted_char_code - key_char_code + 26) % 26 + base)
decrypted_text.append(decrypted_char)
else:
decrypted_text.append(char)
return ''.join(decrypted_text)
# 示例
original_text = "Hello, World!"
key = "KEY"
# 加密
encrypted_text = vigenere_encrypt(original_text, key)
print(encrypted_text) # 输出: 'Rijvs, Uyvjn!'
# 解密
decrypted_text = vigenere_decrypt(encrypted_text, key)
print(decrypted_text) # 输出: 'Hello, World!'
巧妙用法 2:生成可读的唯一标识符
通过组合 ord() 和 hashlib 模块生成一个基于字符串内容的唯一标识符。
python
import hashlib
def generate_readable_id(text):
# 使用 hashlib 生成字符串的 SHA256 哈希值
sha256_hash = hashlib.sha256(text.encode()).hexdigest()
# 将哈希值的前几位转换为可读字符(例如:a-z)
readable_id = ''.join(chr((ord(char) % 26) + ord('a')) for char in sha256_hash[:8])
return readable_id
# 示例
unique_id = generate_readable_id("Hello, World!")
print(unique_id) # 输出: 类似 'fghijabc'
巧妙用法 3:字符矩阵的旋转操作
利用 ord() 函数和 numpy 模块实现字符矩阵的90度旋转。
python
import numpy as np
def rotate_matrix_90(matrix):
# 将字符矩阵转换为 Unicode 码点矩阵
num_matrix = np.array([[ord(char) for char in row] for row in matrix])
# 进行矩阵旋转
rotated_num_matrix = np.rot90(num_matrix, k=-1)
# 将 Unicode 码点矩阵转换回字符矩阵
rotated_matrix = [''.join(chr(num) for num in row) for row in rotated_num_matrix]
return rotated_matrix
# 示例
char_matrix = [
"abc",
"def",
"ghi"
]
rotated_matrix = rotate_matrix_90(char_matrix)
for row in rotated_matrix:
print(row) # 输出:
# gda
# heb
# ifc
感谢阅读。