数据类型转换篇(一)

7.1 ascii()

ascii() 是 Python 的内置函数,用于将一个对象转换为其“ASCII”表示形式。具体来说,它返回一个字符串,该字符串包含对象的可打印表示形式,其中非ASCII字符被转义。

这个函数通常用于调试和日志记录,因为它提供了一种方式来查看对象的文本表示形式,即使该对象包含非ASCII字符。

下面是一些使用 ascii() 函数的示例:

# 字符串的ASCII表示
print(ascii('Hello, 世界!'))  # 输出: 'Hello, \\u4e16\\u754c!'

# 数字的ASCII表示
print(ascii(123))  # 输出: '123'

# 列表的ASCII表示
print(ascii([1, 'a', 2.3]))  # 输出: '[1, \\'a\\', 2.3]'

# 元组的ASCII表示
print(ascii((1, 'a', 2.3)))  # 输出: '(1, \\'a\\', 2.3)'

# 字典的ASCII表示
print(ascii({'name': 'Alice', 'age': 30}))  # 输出: "{'name': 'Alice', 'age': 30}"

在上面的例子中,你可以看到 ascii() 函数将非ASCII字符(如中文字符)转换为它们的Unicode转义序列(例如,\u4e16\u754c)。这对于在文本环境中表示非ASCII字符非常有用,尤其是当这些环境不支持直接显示这些字符时。

需要注意的是,ascii() 函数并不尝试将对象转换为有效的Python表达式,而是提供一个可读的、可打印的字符串表示。如果你需要得到一个可以重新评估为原始对象的表示,应该使用 repr() 函数。

7.2 bin()

bin() 是 Python 的内置函数,用于将一个整数转换为其二进制表示的字符串形式。这个函数返回一个字符串,其中包含表示给定整数的二进制数。

以下是 bin() 函数的一些使用示例:

# 将整数转换为二进制字符串
binary_representation = bin(10)
print(binary_representation)  # 输出: '0b1010'

# 带有更多位的整数
larger_binary = bin(123456)
print(larger_binary)  # 输出: '0b11110010000100000'

# 负数也被转换为二进制补码形式
negative_binary = bin(-15)
print(negative_binary)  # 输出: '-0b11110001'

# 尝试对非整数使用 bin() 会引发 TypeError
try:
    not_integer = bin(3.14)
    print(not_integer)
except TypeError as e:
    print("Error:", e)  # 输出: Error: 'bin() arg 1 must be an integer'

在上面的例子中,bin(10) 将整数 10 转换为其二进制表示,即 ‘0b1010’。注意返回的字符串以 ‘0b’ 开头,这表示它是一个二进制数。对于负数,bin() 函数返回的是该数的二进制补码形式。

二进制补码是一种表示负整数的方法,在计算机科学中非常常见。对于给定的负整数,其补码是通过将该整数的绝对值的二进制表示取反(即每位上的 0 变为 1,1 变为 0),然后加 1 来计算的。

需要注意的是,bin() 函数只能用于整数。如果你尝试对非整数使用它,将会引发 TypeError 异常。

7.3 bool()

bool() 是 Python 的内置函数,用于将给定的对象转换为一个布尔值(True 或 False)。在 Python 中,布尔值是两种可能的状态之一,通常用于条件判断、循环控制和其他逻辑操作。

bool() 函数的行为取决于传递给它的参数的类型和值:

  • 数字类型:非零数值被转换为 True,0(零)被转换为 False。
  • 字符串类型:非空字符串被转换为 True,空字符串 ‘’ 被转换为 False。
  • 列表、元组、字典等容器类型:非空容器被转换为 True,空容器(如 [], (), {})被转换为 False。
  • 对于自定义对象,如果定义了 bool() 方法,则调用该方法来确定对象的布尔值。如果没有定义 bool() 方法,但定义了 len() 方法,则对象被视为容器类型,并根据其长度来确定布尔值。如果既没有 bool() 也没有 len(),则引发 TypeError。

下面是一些使用 bool() 函数的例子:

# 数字的布尔值
print(bool(42))     # 输出: True
print(bool(0))      # 输出: False

# 字符串的布尔值
print(bool("hello")) # 输出: True
print(bool(""))      # 输出: False

# 容器的布尔值
print(bool([1, 2, 3]))   # 输出: True
print(bool([]))          # 输出: False
print(bool({"key": "value"})) # 输出: True
print(bool({}))          # 输出: False

# 自定义对象的布尔值(需要定义 __bool__ 方法)
class MyClass:
    def __bool__(self):
        return True

obj = MyClass()
print(bool(obj))  # 输出: True

# 没有定义 __bool__ 方法的自定义对象
class AnotherClass:
    pass

another_obj = AnotherClass()
try:
    print(bool(another_obj))
except TypeError as e:
    print("Error:", e)  # 输出: Error: <__main__.AnotherClass object at 0x...> is not callable

在这个例子中,我们展示了不同类型的对象如何被 bool() 函数转换为布尔值。需要注意的是,对于自定义对象,如果没有定义适当的魔术方法(如 bool() 或 len()),则不能直接使用 bool() 函数。

7.4 bytearray()

bytearray() 是 Python 的内置函数,用于创建一个可变的字节数组对象。字节数组是一个序列类型,它包含范围为 0 <= x < 256 的整数,这些整数表示 8 位字节。字节数组在内部使用数组存储,因此它可以比普通的字节字符串(bytes)更高效地进行修改。

以下是 bytearray() 函数的一些使用示例:

# 创建一个空的字节数组
ba = bytearray()
print(ba)  # 输出: bytearray(b'')

# 创建一个包含一些字节的字节数组
ba = bytearray([65, 66, 67])
print(ba)  # 输出: bytearray(b'ABC')

# 从字节字符串创建字节数组
bs = b'Hello'
ba = bytearray(bs)
print(ba)  # 输出: bytearray(b'Hello')

# 从字符串创建字节数组(需要指定编码)
s = 'Hello'
ba = bytearray(s, 'utf-8')
print(ba)  # 输出: bytearray(b'Hello')

# 通过迭代来创建字节数组
ba = bytearray(iter([65, 66, 67]))
print(ba)  # 输出: bytearray(b'ABC')

# 修改字节数组的内容
ba = bytearray(b'Hello')
ba[0] = ord('X')  # 使用 ord 函数将字符转换为 ASCII 值
print(ba)  # 输出: bytearray(b'Xello')

# 在字节数组中添加新内容
ba.append(ord('!'))
print(ba)  # 输出: bytearray(b'Xello!')

# 从字节数组中删除内容
del ba[1]
print(ba)  # 输出: bytearray(b'Xello')

在上面的例子中,bytearray() 函数可以接受多种参数类型来创建字节数组,包括一个整数列表、一个字节字符串、一个可迭代对象(产生整数的),或者一个字符串和字符编码。

一旦创建了字节数组,就可以像处理列表一样处理它,包括索引、切片、追加、删除等操作。这使得 bytearray 在需要频繁修改字节数据的情况下比 bytes 类型更加灵活和高效。

7.5 bytes()

bytes() 是 Python 的内置函数,用于创建字节对象。字节是不可变的序列,通常用于表示二进制数据。与字节数组 (bytearray) 不同,字节对象一旦创建就不能被修改。

bytes() 函数可以接受几种不同类型的参数来创建字节对象:

  • 一个整数,表示要创建的字节对象的长度,并且生成包含空字节 (\x00) 的序列。
  • 一个整数序列,其中的每个整数都在 0 到 255 的范围内,表示字节的值。
  • 一个字节字符串,它将被复制到一个新的字节对象中。
  • 一个可迭代的对象,产生在 0 到 255 范围内的整数,用于创建字节对象。

下面是一些使用 bytes() 函数的例子:

# 创建一个长度为 5 的字节对象,包含空字节
b = bytes(5)
print(b)  # 输出可能是: b'\x00\x00\x00\x00\x00'

# 创建一个包含特定值的字节对象
b = bytes([65, 66, 67])
print(b)  # 输出: b'ABC'

# 从字节字符串创建字节对象
s = b'Hello'
b = bytes(s)
print(b)  # 输出: b'Hello'

# 从整数序列创建字节对象
b = bytes([72, 101, 108, 108, 111])
print(b)  # 输出: b'Hello'

# 从可迭代对象创建字节对象
b = bytes(iter([72, 101, 108, 108, 111]))
print(b)  # 输出: b'Hello'

# 创建一个空字节对象
b = bytes()
print(b)  # 输出: b''

在上面的例子中,bytes() 函数被用来创建不同类型的字节对象。值得注意的是,当你传递一个整数给 bytes() 时,你创建的是一个包含该数量的空字节的字节对象。当你传递一个整数列表或其他可迭代对象时,列表中的每个整数都被视为一个字节,并用于创建字节对象。

由于字节是不可变的,所以一旦创建了一个字节对象,你就不能修改它包含的数据。如果你需要一个可以修改的字节序列,你应该使用 bytearray() 函数来创建一个字节数组对象。

7.6 chr()

chr() 是 Python 的内置函数,用于将整数(在 0 到 255 的范围内)转换为其对应的 ASCII 字符。ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种字符编码标准,它用 7 位或 8 位二进制数表示 128 或 256 种可能的字符。

下面是一些使用 chr() 函数的例子:

# 将 ASCII 值转换为对应的字符
char = chr(65)
print(char)  # 输出: A

# 转换其他 ASCII 值
print(chr(97))  # 输出: a
print(chr(32))  # 输出: 空格
print(chr(10))  # 输出: 换行符(在控制台可能不显示为可见字符)

# 超出范围的整数值会引发 ValueError
try:
    print(chr(256))
except ValueError as e:
    print("Error:", e)  # 输出: Error: chr() arg not in range(256)

# 使用 ord() 函数和 chr() 函数进行转换
original_char = 'A'
ascii_value = ord(original_char)
converted_char = chr(ascii_value)
print(converted_char)  # 输出: A

在这个例子中,chr(65) 将整数 65 转换为 ASCII 字符 ‘A’。类似地,chr(97) 将返回 ‘a’,因为 97 是小写字母 ‘a’ 的 ASCII 值。

值得注意的是,chr() 函数仅适用于 ASCII 字符集。对于更广泛的 Unicode 字符集,可以使用 chr() 的 Unicode 版本 unichr()(在 Python 2 中)或简单地使用 chr()(在 Python 3 中,因为 Python 3 默认支持 Unicode)。

此外,ord() 函数是 chr() 的逆操作,它接受一个字符并返回其对应的 ASCII 值。

7.8 complex()

complex() 是 Python 的内置函数,用于创建复数。复数是一个数学概念,可以表示为 a + bj,其中 a 和 b 是实数,j(或 i 在某些上下文中)是虚数单位,满足 j**2 = -1。

complex() 函数可以接受不同数量和类型的参数,以创建复数。以下是一些使用 complex() 的例子:

# 创建一个实数部分为 0,虚数部分为 1 的复数
c = complex(0, 1)
print(c)  # 输出: (0+1j)

# 创建一个实数部分为 4,虚数部分为 3 的复数
c = complex(4, 3)
print(c)  # 输出: (4+3j)

# 只传递一个参数时,该参数被视为复数的实数部分,虚数部分为 0
c = complex(4)
print(c)  # 输出: (4+0j)

# 从字符串创建复数,格式应为 'real+imagj' 或 'real+imagI'
c = complex('4+3j')
print(c)  # 输出: (4+3j)

# 从字符串创建复数,使用 'I' 作为虚数单位
c = complex('4+3I')
print(c)  # 输出: (4+3j)

# 使用两个字符串分别表示实部和虚部
c = complex('4', '3')
print(c)  # 输出: (4+3j)

# 复数也可以作为参数传递给 complex() 函数,它将返回相同的复数
c = complex(4+3j)
print(c)  # 输出: (4+3j)

除了创建复数,complex() 函数还可以用来将其他数据类型(如字符串、整数、浮点数等)转换为复数。当传递一个字符串给 complex() 时,该字符串应该遵循 ‘real[+imagj|imagI]’ 的格式,其中 real 是实部,imag 是虚部,[+imagj|imagI] 表示虚部可以带有符号,并且可以使用 j 或 I 作为虚数单位。

复数在数学、物理、工程和其他科学领域中有广泛应用,特别是在处理波动、交流电、量子力学等复杂问题时。Python 的 complex 类型提供了对这些复杂计算的支持。

7.9 dict()

dict() 是 Python 的内置函数,用于创建字典对象。字典是一种无序的键值对集合,其中每个键都是唯一的,并且与一个值相关联。

dict() 函数可以接受多种类型的参数来创建字典:

  • 无参数调用 dict() 会创建一个空字典。
  • 一个可迭代对象,如另一个字典、键值对的序列(例如列表的列表或元组的元组)或键值对的集合,其中每个元素都是一个包含两个元素的序列(例如列表或元组),第一个元素是键,第二个元素是值。
  • 一系列关键字参数,其中每个参数名成为字典的键,参数值成为对应的值。

下面是一些使用 dict() 函数的例子:

# 创建一个空字典
d = dict()
print(d)  # 输出: {}

# 使用可迭代对象创建字典
keys = ['a', 'b', 'c']
values = [1, 2, 3]
d = dict(zip(keys, values))
print(d)  # 输出: {'a': 1, 'b': 2, 'c': 3}

# 使用键值对的序列创建字典
d = dict([('a', 1), ('b', 2), ('c', 3)])
print(d)  # 输出: {'a': 1, 'b': 2, 'c': 3}

# 使用键值对的集合创建字典
d = dict({('a', 1), ('b', 2), ('c', 3)})
print(d)  # 输出: {'a': 1, 'b': 2, 'c': 3}

# 使用关键字参数创建字典
d = dict(a=1, b=2, c=3)
print(d)  # 输出: {'a': 1, 'b': 2, 'c': 3}

# 字典推导式也可以用来创建字典
d = {x: x**2 for x in range(3)}
print(d)  # 输出: {0: 0, 1: 1, 2: 4}

在上面的例子中,dict() 函数通过不同的方式创建了包含相同键值对的字典。

字典在 Python 中是一种非常有用的数据结构,因为它们允许你通过键快速查找、添加和删除值。字典的键必须是不可变的类型(如整数、浮点数、字符串或元组),而值可以是任何类型的数据。

7.10 eval()

eval() 是 Python 的内置函数,用于执行一个字符串表达式,并返回表达式的值。它基本上是一个内置的 Python 解释器,能够解析并执行传递给它的字符串。

使用 eval() 时要小心,因为它可以执行任何 Python 代码,这可能导致安全问题,特别是当执行的字符串来自不可信的来源(如用户输入或网络)时。恶意用户可能会尝试注入恶意代码来执行系统命令、访问敏感数据等。

下面是一些使用 eval() 的例子:

# 计算数学表达式
result = eval('3 + 4 * 2')
print(result)  # 输出: 11 (因为乘法优先级高于加法)

# 执行简单的变量赋值
x = 10
eval('y = x + 5')
print(y)  # 输出: 15

# 使用变量
x = 10
eval('print(x)')  # 输出: 10

# 执行更复杂的逻辑
eval('if 1 > 0: print("True")')  # 输出: True

尽管 eval() 在某些情况下很有用,但通常最好避免使用它,特别是当处理来自用户或不可信的输入时。更安全的方法是使用其他方法,如 ast.literal_eval(),它只能评估 Python 字面量结构(如列表、元组、数字、字符串和字典),而不能执行任意代码。

例如,使用 ast.literal_eval() 来安全地评估字符串表示的字典:

import ast

# 安全地评估一个字符串表示的字典
s = '{"key": "value"}'
dictionary = ast.literal_eval(s)
print(dictionary)  # 输出: {'key': 'value'}

# 尝试评估恶意输入时会引发异常
s = '__import__("os").system("rm -rf /")'
try:
    ast.literal_eval(s)
except (ValueError, SyntaxError):
    print("Invalid or malicious input detected.")  # 输出: Invalid or malicious input detected.

在这个例子中,ast.literal_eval() 尝试评估一个字符串表示的字典,但如果字符串包含恶意代码,它会引发异常,从而防止执行恶意代码。

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊猫Devin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值