赞
踩
目录
ascii函数在Python中主要用于将对象(特别是字符和字符串)转换为它们的ASCII表示形式。这种转换在处理文本数据、调试代码以及确保文本以 ASCII 格式存储或传输时非常有用。常见应用场景有:
1、调试和文本处理:当处理包含非ASCII字符(如Unicode字符)的文本时,ascii()函数可以帮助你查看这些字符的ASCII表示形式。这对于识别和理解文本中的特殊字符或不可见字符(如控制字符)特别有用。
2、代码示例和文档:在编写代码示例或文档时,有时需要展示一个字符或字符串的ASCII表示。使用ascii()函数可以方便地生成这种表示,而无需手动编写转义序列。
3、数据清洗和规范化:在处理文本数据时,有时候需要将非ASCII字符替换为对应的ASCII字符,以便进行数据清洗和规范化。ascii()函数可以帮助我们实现这一目标,使得数据更易于处理和分析。
4、文本过滤和清理:如果你需要从文本中删除或替换非ASCII字符,可以使用ascii()函数结合其他字符串处理方法来实现。例如,你可以使用正则表达式结合ascii()函数来识别并处理非ASCII字符。
5、跨平台兼容性:在某些情况下,你可能需要确保文本数据在不同的平台或环境中都能正确解析。使用ascii()函数可以帮助你确保文本数据以兼容的方式表示,特别是在处理可能包含平台特定字符或编码的文本时。
6. 加密和解密:ASCII函数在某些简单的加密和解密算法中有所应用。通过将字符转换为ASCII码值,然后对这些值进行某种形式的变换(如位移、替换等),可以实现简单的加密。解密过程则是加密的逆操作,通过相同的变换将ASCII码值转换回字符。
7、网络编程:在编写涉及网络通信的代码时,有时需要确保发送或接收的数据只包含ASCII字符,因为某些协议或系统可能只支持ASCII字符集。在这种情况下,你可以使用ascii()函数来转换或验证数据。
需要注意的是,ascii()函数主要用于获取对象的ASCII表示形式,而不是用于编码或解码文本数据。如果你需要将文本数据编码为ASCII格式并处理非ASCII字符(如替换或忽略它们),应该使用字符串的".encode()"方法,并指定适当的错误处理策略(如"ignore" 或 "replace")。
此外,对于大多数现代应用来说,使用Unicode(通常是UTF-8编码)来处理文本数据更为常见和推荐,因为它支持更广泛的字符集和跨平台兼容性。但在某些特定场景下,ascii()函数仍然是一个有用的工具。
- # 1.函数:ascii
- # 2.功能:将一个对象转换为其可打印的ASCII表示形式
- # 3.语法:ascii(object)
- # 4.参数:Python中主要的内置对象类型,包括但不限于以下类型:
- # 4-1、 数字类型:
- # - `int`(整型):用于表示整数,如 `1`, `100`, `-8080` 等
- # - `float`(浮点型):用于表示浮点数,即带小数点的数字,如 `1.23`, `0.0`, `-99.9` 等
- # - `complex`(复数型):用于表示复数,如 `3+6j`
- # 4-2、 序列类型:
- # - `list`(列表):有序的元素集合,元素之间用逗号分隔,整个列表由方括号包围。例如:`[1, 2, 3, 'a', 'b', 'c']`
- # - `tuple`(元组):与列表类似,但元素不能修改。例如:`(1, 2, 3)`
- # - `str`(字符串):字符序列。例如:`"Hello, world!"`
- # - `bytes`:字节序列,常用于处理二进制数据
- # - `bytearray`:可变字节序列
- # 4-3、 集合类型:
- # - `set`(集合):无序且不包含重复元素的集合。例如:`{1, 2, 3}`
- # - `frozenset`(冻结集合):不可变的集合,与set类似,但内容不能修改
- # 4-4、 映射类型:
- # - `dict`(字典):无序的键值对集合。例如:`{'name': 'myelsa', 'age': 43}`
- # 4-5、布尔类型:
- # - `bool`:布尔值,只有两个值 `True` 和 `False`
- # 4-6、 特殊类型:
- # - `NoneType`:只有一个值 `None`,表示空或无值的状态
- # - `ellipsis`:表示省略号对象,通常用三个点 `...` 表示
- # - `notimplemented`:一个特殊的单例值,当对象不支持某个操作时返回此值
- # 4-7、其他类型:
- # - `type`:用于表示类型对象本身
- # - `range`:表示一个不可变的数字序列范围
- # - `memoryview`:内存中的字节序列的“窗口”或“视图”
- # - `slice`:表示切片对象,用于在序列类型上切片
- # - `enum.Enum`(通过`enum`模块):枚举类型,表示一组具名的常量
- # - `functions`、`methods`、`class objects`、`instances` 等:函数、方法、类对象、实例对象等
- # - `module`:模块对象
- # - `file`:文件对象
- # - `traceback`、`frame` 和 `code` 对象:用于表示调用栈、帧和代码对象
- # 5.返回值:返回一个表示该对象的字符串,这个字符串包含对象的可打印ASCII字符的表示形式
- # 6.说明:
- # 6-1、使用ascii()函数时,要注意它只返回对象的可打印ASCII字符表示形式,并且不是所有对象都有有意义的ASCII表示
- # 6-2、ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)
- # 7.示例:
- # 应用1:调试和文本处理
- def custom_ascii(s):
- # 将字符串转换为ASCII表示形式
- ascii_repr = ascii(s)
- # 添加调试信息
- debug_info = f"String length: {len(s)} \nASCII representation:{ascii_repr}"
- # 返回ASCII表示形式和调试信息
- return debug_info
- # 主函数
- if __name__ == '__main__':
- text = "人生苦短, 我用python!"
- ascii_debug_info = custom_ascii(text)
- print(ascii_debug_info)
- # String length: 15
- # ASCII representation:'\u4eba\u751f\u82e6\u77ed, \u6211\u7528python!'
-
- # 应用2:代码示例和文档
- def formatted_ascii(obj):
- """
- 返回对象的格式化ASCII表示形式,以便用于代码示例和文档。
- 参数:
- obj(any): 要转换的对象。
- 返回:
- str: 对象的格式化ASCII表示形式的字符串。
- """
- ascii_repr = ascii(obj)
- # 格式化ASCII字符串,比如添加换行符以便阅读
- formatted_repr = ascii_repr.replace("'", "").replace(",", ",\n ").strip()
- return formatted_repr
- # 主函数
- if __name__ == '__main__':
- example_list = [1, 2, 3, 'a', 'b', 'c']
- example_dict = {'name': 'myelsa', 'age': 43}
- # 使用formatted_ascii函数展示列表的ASCII表示
- print("列表的ASCII表示:")
- print(formatted_ascii(example_list))
- # 使用formatted_ascii函数展示字典的ASCII表示
- print("\n字典的ASCII表示:")
- print(formatted_ascii(example_dict))
- # 列表的ASCII表示:
- # [1,
- # 2,
- # 3,
- # a,
- # b,
- # c]
- #
- # 字典的ASCII表示:
- # {name: myelsa,
- # age: 43}
-
- # 应用3:数据清洗和规范化
- def custom_ascii(s, keep_ascii_only=False):
- # 如果keep_ascii_only为True,则只保留ASCII字符
- if keep_ascii_only:
- s = ''.join(c for c in s if ord(c) < 128)
- # 将字符串转换为ASCII表示形式
- ascii_repr = ascii(s)
- # 添加调试信息
- debug_info = f"Original string: {s} \nASCII-only string: {s if not keep_ascii_only else ''} \nASCII representation:{ascii_repr}"
- # 返回ASCII表示形式和调试信息
- return debug_info
- # 主函数
- if __name__ == '__main__':
- # 保留ASCII字符
- text_with_non_ascii = "人生苦短, 我用python!"
- ascii_debug_info_keep_ascii = custom_ascii(text_with_non_ascii, keep_ascii_only=True)
- print(ascii_debug_info_keep_ascii)
- # Original string: , python!
- # ASCII-only string:
- # ASCII representation:', python!'
-
- # 应用4:加密和解密
- def encrypt_with_ascii(plaintext, offset):
- """
- 使用ASCII值和给定的偏移量加密明文。
- 参数:
- plaintext(str): 要加密的明文。
- offset(int): 应用于每个字符ASCII值的偏移量。
- 返回:
- str: 加密后的密文。
- """
- # 初始化空字符串来保存加密后的字符
- ciphertext = ""
- # 遍历明文中的每个字符
- for char in plaintext:
- # 获取字符的ASCII值
- ascii_value = ord(char)
- # 应用偏移量
- encrypted_ascii_value = (ascii_value + offset) % 256 # 使用模运算来确保值在0-255之间
- # 将加密后的ASCII值转换回字符
- encrypted_char = chr(encrypted_ascii_value)
- # 将加密后的字符添加到密文字符串中
- ciphertext += encrypted_char
- return ciphertext
- # 主函数
- if __name__ == '__main__':
- plaintext = "Hello,Python!"
- offset = 43 # 可以选择任何整数作为偏移量
- # 加密明文
- encrypted_text = encrypt_with_ascii(plaintext, offset)
- print(f"加密后的文本: {encrypted_text}")
- # 解密密文需要知道相同的偏移量
- def decrypt_with_ascii(ciphertext, offset):
- """
- 使用相同的ASCII值和偏移量解密密文。
- 参数:
- ciphertext(str): 要解密的密文。
- offset(int): 用于加密的相同偏移量。
- 返回:
- str: 解密后的明文。
- """
- # 初始化空字符串来保存解密后的字符
- plaintext = ""
- # 遍历密文中的每个字符
- for char in ciphertext:
- # 获取字符的ASCII值
- ascii_value = ord(char)
- # 应用相反的偏移量来解密
- decrypted_ascii_value = (ascii_value - offset) % 256
- # 将解密后的ASCII值转换回字符
- decrypted_char = chr(decrypted_ascii_value)
- # 将解密后的字符添加到明文字符串中
- plaintext += decrypted_char
- return plaintext
- # 主函数
- if __name__ =='__main__':
- # 解密密文
- decrypted_text = decrypt_with_ascii(encrypted_text, offset)
- print(f"解密后的文本: {decrypted_text}")
- # 加密后的文本: sW{¤L
- # 解密后的文本: Hello,Python!
-
- # 应用5:网络编程
- def encode_to_ascii(data):
- """
- 将字符串编码为ASCII字节流。
- 参数:
- data(str): 要编码的字符串。
- 返回:
- bytes: 编码后的ASCII字节流。
- """
- # 使用'ascii'编码将字符串转换为字节流
- ascii_bytes = data.encode('ascii')
- return ascii_bytes
- # 主函数
- if __name__ == '__main__':
- text_to_send = "Hello, Python!"
- encoded_text = encode_to_ascii(text_to_send)
- print(f"Encoded text: {encoded_text}")
- def decode_from_ascii(data):
- """
- 将ASCII字节流解码为字符串。
- 参数:
- data(bytes): 要解码的ASCII字节流。
- 返回:
- str: 解码后的字符串。
- """
- # 使用'ascii'编码将字节流解码为字符串
- ascii_str = data.decode('ascii')
- return ascii_str
- # 主函数
- if __name__ == '__main__':
- received_data = b'Hello, Python!'
- decoded_text = decode_from_ascii(received_data)
- print(f"Decoded text: {decoded_text}")
- import socket
- def start_server():
- server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- server_socket.bind(('localhost', 10248))
- server_socket.listen(1)
- print("Server started, listening on port 10248...")
- while True:
- client_socket, client_address = server_socket.accept()
- print(f"Connection from {client_address}")
- # 接收数据
- received_data = client_socket.recv(1024)
- decoded_text = decode_from_ascii(received_data)
- print(f"Received: {decoded_text}")
- # 发送响应
- response = "Message received!"
- encoded_response = encode_to_ascii(response)
- client_socket.sendall(encoded_response)
- client_socket.close()
- # 主函数
- if __name__ == "__main__":
- start_server()
- def start_client():
- client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- client_socket.connect(('localhost', 10248))
- # 发送数据
- message = "Hello from client!"
- encoded_message = encode_to_ascii(message)
- client_socket.sendall(encoded_message)
- # 接收响应
- response_data = client_socket.recv(1024)
- decoded_response = decode_from_ascii(response_data)
- print(f"Received response: {decoded_response}")
- client_socket.close()
- # 主函数
- if __name__ == "__main__":
- start_client()
- # Encoded text: b'Hello, Python!'
- # Decoded text: Hello, Python!
- # Server started, listening on port 10248...
- ' 1.函数:Asc
- ' 2.功能:提取字符串中第一个字符的ASCII编码值
- ' 3.语法:Asc(string)
- ' 4.参数:
- ' 4-1、 string是必需的参数,表示要返回其ASCII值的字符或字符串表达式
- ' 4-2、 如果string包含多个字符,Asc函数仅返回第一个字符的ASCII值
- ' 5.返回值:一个整数,表示字符串中第一个字符的ASCII值.
- ' 6.说明:
- ' 6-1、如果字符串为空(""),则Asc函数返回0
- ' 6-2、Asc函数只能正确处理单字节字符集,如ANSI或默认的Windows代码页。对于双字节字符集(如Unicode),Asc函数可能无法正确返回预期的值,因为它只处理字符串的第一个字节
- ' 7.示例:
- '-----------------------------------------------------------------------------------------------------------------------------------------------------------------
- Rem 模拟Python中ascii函数应用1:调试和文本处理
- Function CustomAscii_1(s As String) As String
- Dim ascii_repr As String
- Dim debug_info As String
- Dim i As Integer
-
- ' 初始化调试信息
- debug_info = "String length: " & Len(s) & vbCrLf & "ASCII representation: "
- ' 遍历字符串的每个字符
- For i = 1 To Len(s)
- ' 获取字符的ASCII值,并添加到ascii_repr中
- ascii_repr = ascii_repr & vbCrLf & "Char: " & mid(s, i, 1) & " -> ASCII: " & Asc(mid(s, i, 1)) & vbCrLf
- Next i
- ' 拼接调试信息和ASCII表示形式
- CustomAscii_1 = debug_info & ascii_repr
- End Function
- Rem 执行程序,功能:调用自定义函数CustomAscii_1,实现文本信息处理
- Sub TestRun_1()
- Dim text As String
- Dim ascii_debug_info As String
- ' 输入的字符串
- text = "人生苦短,我用Python!"
-
- ' 调用CustomAscii函数
- ascii_debug_info = CustomAscii_1(text)
- ' 显示结果
- MsgBox ascii_debug_info, vbInformation, "文本处理"
- End Sub
- Rem 模拟Python中ascii函数应用2:数据清洗和规范化
- Function CustomAscii_2(s As String, keepAsciiOnly As Boolean) As String
- Dim originalString As String
- Dim asciiOnlyString As String
- Dim asciiRepr As String
- Dim debugInfo As String
- Dim i As Integer
- Dim c As String
-
- ' 保存原始字符串
- originalString = s
- ' 如果 keepAsciiOnly 为 True,则只保留 ASCII 字符
- If keepAsciiOnly Then
- asciiOnlyString = ""
- For i = 1 To Len(s)
- c = mid(s, i, 1)
- If AscW(c) < 128 Then
- asciiOnlyString = asciiOnlyString & c
- End If
- Next i
- Else
- asciiOnlyString = originalString
- End If
- ' VBA 没有内置的 ascii 函数来将整个字符串转换为 ASCII 表示形式
- ' 但我们可以手动构建一个字符串,将非 ASCII 字符替换为转义序列
- asciiRepr = ""
- For i = 1 To Len(originalString)
- c = mid(originalString, i, 1)
- If AscW(c) < 128 Then
- asciiRepr = asciiRepr & c
- Else
- ' 使用 VBA 的 ChrW 和 AscW 函数转换非 ASCII 字符为转义序列
- asciiRepr = asciiRepr & "\u" & Format(AscW(c), "X4")
- End If
- Next i
- ' 添加调试信息
- debugInfo = "Original string: " & originalString & vbCrLf & _
- "ASCII-only string: " & asciiOnlyString & vbCrLf & _
- "ASCII representation: " & asciiRepr
- ' 返回调试信息
- CustomAscii_2 = debugInfo
- End Function
- Rem 执行程序,功能:调用自定义函数CustomAscii_2,在立即窗口中输出结果
- Sub TestRun_2()
- Dim textWithNonAscii As String
- Dim asciiDebugInfoKeepAscii As String
-
- ' 示例文本包含非 ASCII 字符
- textWithNonAscii = "人生短暂,我用Python!" ' “苦”字的编码值超出127的范围,故将原来的“苦短”调整为“短暂”
- ' 调用 CustomAscii 函数,并保留 ASCII 字符
- asciiDebugInfoKeepAscii = CustomAscii_2(textWithNonAscii, True)
- ' 输出结果
- Debug.Print asciiDebugInfoKeepAscii
- End Sub
- 'Original string: 人生短暂,我用Python!
- 'ASCII-only string: ,Python!
- 'ASCII representation: \uX4\uX4\uX4\uX4,\uX4\uX4Python!
-
- Rem 模拟Python中ascii函数应用3:加密和解密
- Rem 加密函数,功能:将明文按照指定的偏移量加密为密文
- Function EncryptWithAscii(plaintext As String, offset As Integer) As String
- Dim ciphertext As String ' 初始化用于存储加密后文本的变量
- Dim char As String ' 用于临时存储每个字符的变量
- Dim asciiValue As Integer ' 用于存储字符的ASCII值的变量
- Dim encryptedAsciiValue As Integer ' 用于存储加密后的ASCII值的变量
-
- ciphertext = "" ' 初始化密文为空字符串
- ' 遍历明文中的每个字符
- For i = 1 To Len(plaintext)
- ' 提取明文中的第i个字符
- char = mid(plaintext, i, 1)
- ' 获取字符的Unicode(ASCII)值
- asciiValue = AscW(char)
- ' 将字符的ASCII值加上偏移量,并取模256以确保结果在0-255范围内
- encryptedAsciiValue = (asciiValue + offset) Mod 256
- ' 将加密后的ASCII值转换回字符
- encryptedChar = ChrW(encryptedAsciiValue)
- ' 将加密后的字符追加到密文字符串中
- ciphertext = ciphertext & encryptedChar
- Next i
- ' 返回加密后的密文
- EncryptWithAscii = ciphertext
- End Function
- Rem 解密函数,功能:将密文按照相同的偏移量解密为明文
- Function DecryptWithAscii(ciphertext As String, offset As Integer) As String
- Dim plaintext As String ' 初始化用于存储解密后文本的变量
- Dim char As String ' 用于临时存储每个字符的变量
- Dim asciiValue As Integer ' 用于存储字符的ASCII值的变量
- Dim decryptedAsciiValue As Integer ' 用于存储解密后的ASCII值的变量
-
- plaintext = "" ' 初始化明文为空字符串
- ' 遍历密文中的每个字符
- For i = 1 To Len(ciphertext)
- ' 提取密文中的第i个字符
- char = mid(ciphertext, i, 1)
- ' 获取字符的Unicode(ASCII)值
- asciiValue = AscW(char)
- ' 将字符的ASCII值减去偏移量,加上256确保结果为正数,然后取模256
- decryptedAsciiValue = (asciiValue - offset + 256) Mod 256
- ' 将解密后的ASCII值转换回字符
- decryptedChar = ChrW(decryptedAsciiValue)
- ' 将解密后的字符追加到明文字符串中
- plaintext = plaintext & decryptedChar
- Next i
- ' 返回解密后的明文
- DecryptWithAscii = plaintext
- End Function
- Rem 执行过程,功能:用于展示加密和解密的流程
- Sub TestRun_3()
- Dim plaintext As String ' 初始化明文变量
- Dim offset As Integer ' 初始化偏移量变量
- Dim encryptedText As String ' 初始化加密后的文本变量
- Dim decryptedText As String ' 初始化解密后的文本变量
-
- plaintext = "Hello,Python!" '设置密文内容
- offset = 43 ' 设置偏移量
- ' 调用加密函数加密明文
- encryptedText = EncryptWithAscii(plaintext, offset)
- ' 输出加密后的文本
- Debug.Print "加密后的文本: " & encryptedText
- ' 调用解密函数解密密文
- decryptedText = DecryptWithAscii(encryptedText, offset)
- ' 输出解密后的文本
- Debug.Print "解密后的文本: " & decryptedText
- End Sub
- '加密后的文本: s????W{¤????L
- '解密后的文本: Hello , Python!
注意:1-2中的代码需粘贴到你的VBA编辑器中,按F5执行对应的Sub程序即可输出结果。
Python算法之旅:Myelsa的Python算法之旅(高铁直达)-CSDN博客
Python函数之旅:Myelsa的Python函数之旅(高铁直达)
欢迎志同道合者一起交流学习,我的QQ:94509325/微信:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。