04 Python数据类型转换与运算符详解

114 阅读6分钟

1. Python数据类型转换

1.1 隐式类型转换

Python在某些情况下会自动进行类型转换,以保证运算的顺利进行。

# 整数和浮点数运算时自动转换为浮点数
result1 = 3 + 4.5    # result1 = 7.5

# 不同数值类型比较时的自动转换
result2 = 3 == 3.0   # result2 = True

# 布尔值与数值运算
result3 = True + 1   # result3 = 2 (True被转换为1)
result4 = False + 1  # result4 = 1 (False被转换为0)

1.2 显式类型转换

常用的类型转换函数及其特殊情况处理。

# 1. 转换为整数 int()
print(int(3.14))      # 输出: 3(截断小数部分)
print(int("123"))    # 输出: 123
print(int(True))      # 输出: 1
print(int(False))     # 输出: 0

# 注意:无法直接将含非数字字符的字符串转换为整数
try:
    print(int("12.34"))  # 错误:含小数点
except ValueError as e:
    print(f"转换错误:{e}")

# 2. 转换为浮点数 float()
print(float(3))        # 输出: 3.0
print(float("3.14"))  # 输出: 3.14
print(float("inf"))   # 输出: inf(无穷大)
print(float("-inf"))  # 输出: -inf(负无穷大)

# 3. 转换为字符串 str()
print(str(123))       # 输出: "123"
print(str(3.14))      # 输出: "3.14"
print(str([1,2,3]))   # 输出: "[1, 2, 3]"

# 4. 转换为布尔值 bool()
# 以下值会被转换为False
print(bool(0))        # False
print(bool(""))       # False(空字符串)
print(bool([]))       # False(空列表)
print(bool({}))       # False(空字典)
print(bool(None))     # False

# 其他值都会被转换为True
print(bool(1))        # True
print(bool("hello"))  # True
print(bool([1,2]))    # True

# 5. 复杂类型转换示例
# 列表转换
print(list("hello"))     # 输出: ['h', 'e', 'l', 'l', 'o']
print(list((1,2,3)))     # 输出: [1, 2, 3]

# 元组转换
print(tuple([1,2,3]))    # 输出: (1, 2, 3)
print(tuple("hello"))    # 输出: ('h', 'e', 'l', 'l', 'o')

# 集合转换(自动去重)
print(set([1,2,2,3,3]))  # 输出: {1, 2, 3}
print(set("hello"))      # 输出: {'h', 'e', 'l', 'o'}

2. Python算术运算符

2.1 基本算术运算符

# 基本算术运算符示例
a, b = 10, 3

# 1. 加法运算符 (+)
print(f"加法: {a} + {b} = {a + b}")  # 输出: 13

# 2. 减法运算符 (-)
print(f"减法: {a} - {b} = {a - b}")  # 输出: 7

# 3. 乘法运算符 (*)
print(f"乘法: {a} * {b} = {a * b}")  # 输出: 30

# 4. 除法运算符 (/)
print(f"除法: {a} / {b} = {a / b}")  # 输出: 3.3333... (总是返回浮点数)

# 5. 整除运算符 (//)
print(f"整除: {a} // {b} = {a // b}")  # 输出: 3

# 6. 取模运算符 (%)
print(f"取模: {a} % {b} = {a % b}")  # 输出: 1

# 7. 幂运算符 (**)
print(f"幂运算: {a} ** {b} = {a ** b}")  # 输出: 1000

2.2 特殊情况和注意事项

# 1. 除数为零的处理
try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"错误:{e}")  # 输出: division by zero

# 2. 浮点数精度问题
print(0.1 + 0.2)  # 输出: 0.30000000000000004

# 使用decimal模块处理精确decimal计算
'''
decimal模块提供了Decimal类,用于进行精确的十进制数学计算。它特别适用于:
1. 金融计算:需要精确表示货币金额
2. 科学计算:需要控制精度和舍入行为
3. 任何不允许有舍入误差的场景
'''

# 1. 基本使用
from decimal import Decimal, getcontext
print(Decimal('0.1') + Decimal('0.2'))  # 输出: 0.3

# 2. 精度控制
getcontext().prec = 4  # 设置全局精度为4位
result = Decimal('1') / Decimal('3')
print(f"1/3 (精度4位): {result}")  # 输出: 0.3333

# 3. 不同的舍入模式
from decimal import ROUND_HALF_UP, ROUND_DOWN
getcontext().rounding = ROUND_HALF_UP  # 设置舍入模式为四舍五入

# 4. 金融计算示例
def calculate_interest(principal, rate, years):
    """计算单利"""
    p = Decimal(str(principal))
    r = Decimal(str(rate))
    t = Decimal(str(years))
    interest = p * r * t
    return interest.quantize(Decimal('0.01'))  # 保留两位小数

print(f"利息: {calculate_interest(1000, 0.05, 2)}")  # 输出: 100.00

# 5. 科学计算示例
def calculate_circle_area(radius):
    """计算圆的面积,精确到小数点后4位"""
    pi = Decimal('3.1415926535')
    r = Decimal(str(radius))
    area = pi * r * r
    return area.quantize(Decimal('0.0001'))

print(f"圆面积: {calculate_circle_area(2)}")  # 输出: 12.5664

# 3. 大数运算
big_num = 2 ** 100
print(f"2的100次方: {big_num}")  # Python自动处理大数

# 4. 复数运算
z1 = 3 + 4j
z2 = 2 + 3j
print(f"复数加法: {z1 + z2}")  # 输出: (5+7j)
print(f"复数乘法: {z1 * z2}")  # 输出: (-6+17j)

3. Python赋值运算符

3.1 基本赋值和复合赋值运算符

# 1. 基本赋值运算符 (=)
x = 10

# 2. 复合赋值运算符
x += 5   # 等同于 x = x + 5
print(f"加法赋值后:{x}")  # 输出: 15

x -= 3   # 等同于 x = x - 3
print(f"减法赋值后:{x}")  # 输出: 12

x *= 2   # 等同于 x = x * 2
print(f"乘法赋值后:{x}")  # 输出: 24

x /= 4   # 等同于 x = x / 4
print(f"除法赋值后:{x}")  # 输出: 6.0

x //= 2  # 等同于 x = x // 2
print(f"整除赋值后:{x}")  # 输出: 3.0

x %= 2   # 等同于 x = x % 2
print(f"取模赋值后:{x}")  # 输出: 1.0

# 3. 多重赋值
a, b = 1, 2  # 同时给多个变量赋值
print(f"a = {a}, b = {b}")  # 输出: a = 1, b = 2

# 4. 变量值交换
a, b = b, a  # 不需要临时变量
print(f"交换后:a = {a}, b = {b}")  # 输出: a = 2, b = 1

4. Python位运算符

4.1 位运算基础

# 位运算符示例
a = 60  # 二进制:0011 1100
b = 13  # 二进制:0000 1101

# 1. 按位与运算 (&)
print(f"a & b = {a & b}")  # 输出: 12 (0000 1100)

# 2. 按位或运算 (|)
print(f"a | b = {a | b}")  # 输出: 61 (0011 1101)

# 3. 按位异或运算 (^)
print(f"a ^ b = {a ^ b}")  # 输出: 49 (0011 0001)

# 4. 按位取反运算 (~)
print(f"~a = {~a}")  # 输出: -61

# 5. 左移运算 (<<)
print(f"a << 2 = {a << 2}")  # 输出: 240 (1111 0000)

# 6. 右移运算 (>>)
print(f"a >> 2 = {a >> 2}")  # 输出: 15 (0000 1111)

4.2 位运算实际应用

# 1. 判断奇偶性
def is_even(n):
    return n & 1 == 0  # 如果最后一位是0,则为偶数

print(f"4是偶数:{is_even(4)}")  # True
print(f"5是偶数:{is_even(5)}")  # False

# 2. 交换两个数
def swap_bits(a, b):
    a = a ^ b
    b = a ^ b
    a = a ^ b
    return a, b

x, y = 10, 20
x, y = swap_bits(x, y)
print(f"交换后:x = {x}, y = {y}")  # x = 20, y = 10

# 3. 设置标志位(权限控制)
class Permissions:
    READ = 4    # 100
    WRITE = 2   # 010
    EXEC = 1    # 001
    
    def __init__(self):
        self.permissions = 0
    
    def add_permission(self, permission):
        self.permissions |= permission
    
    def remove_permission(self, permission):
        self.permissions &= ~permission
    
    def has_permission(self, permission):
        return self.permissions & permission == permission

# 使用示例
p = Permissions()
p.add_permission(Permissions.READ | Permissions.WRITE)  # 设置读写权限
print(f"有读权限:{p.has_permission(Permissions.READ)}")    # True
print(f"有写权限:{p.has_permission(Permissions.WRITE)}")   # True
print(f"有执行权限:{p.has_permission(Permissions.EXEC)}")  # False

总结

  1. 数据类型转换

    • 掌握隐式和显式类型转换的区别
    • 注意特殊情况的处理(如字符串转数字的异常处理)
    • 理解不同类型转换的规则和限制
  2. 算术运算符

    • 理解基本算术运算符的使用和优先级
    • 注意浮点数精度问题,必要时使用decimal模块
    • 掌握整除和取模运算的应用场景
  3. 赋值运算符

    • 熟练使用复合赋值运算符提高代码简洁性
    • 掌握多重赋值和变量交换技巧
    • 理解赋值操作的执行顺序
  4. 位运算符

    • 理解位运算的基本原理和性能优势
    • 掌握位运算在实际编程中的应用(如权限控制、优化等)
    • 注意位运算的优先级和结合性

最佳实践

  1. 选择合适的数据类型和运算符,提高代码效率
  2. 处理精确数值计算时使用decimal模块
  3. 合理使用位运算优化性能关键代码
  4. 注意处理异常情况和边界条件
  5. 保持代码的可读性和维护性