Skip to content

variables.py

文件信息

  • 📄 原文件:01_variables.py
  • 🔤 语言:python

Python 变量与数据类型 本文件介绍 Python 中的变量声明、基本数据类型、类型转换等核心概念。

Python 是动态类型语言,变量不需要声明类型,类型在运行时确定。

完整代码

python
def main01_variables():
    """
    ============================================================
                        1. 变量声明与赋值
    ============================================================
    Python 变量特点:
    - 不需要声明类型(动态类型)
    - 变量名区分大小写
    - 变量本质是对象的引用(一切皆对象)
    """
    print("=" * 60)
    print("1. 变量声明与赋值")
    print("=" * 60)

    # 【基本赋值】直接赋值,类型自动推断
    name = "Alice"          # str 类型
    age = 25                # int 类型
    height = 1.75           # float 类型
    is_student = True       # bool 类型

    print(f"name = {name}, 类型: {type(name)}")
    print(f"age = {age}, 类型: {type(age)}")
    print(f"height = {height}, 类型: {type(height)}")
    print(f"is_student = {is_student}, 类型: {type(is_student)}")

    # 【多重赋值】一行赋值多个变量
    x, y, z = 1, 2, 3
    print(f"\n多重赋值: x={x}, y={y}, z={z}")

    # 【链式赋值】多个变量指向同一对象
    a = b = c = 100
    print(f"链式赋值: a={a}, b={b}, c={c}")
    print(f"a is b: {a is b}")  # True,指向同一对象

    # 【变量交换】Python 特有的优雅写法
    x, y = 10, 20
    print(f"\n交换前: x={x}, y={y}")
    x, y = y, x  # 无需临时变量!
    print(f"交换后: x={x}, y={y}")

    # 【解包赋值】从序列中解包
    coordinates = (100, 200, 300)
    x, y, z = coordinates
    print(f"\n解包赋值: x={x}, y={y}, z={z}")

    # 【星号解包】收集剩余元素
    first, *rest, last = [1, 2, 3, 4, 5]
    print(f"星号解包: first={first}, rest={rest}, last={last}")


def main02_numbers():
    """
    ============================================================
                        2. 数字类型
    ============================================================
    Python 数字类型:
    - int: 整数(无限精度!)
    - float: 浮点数(双精度)
    - complex: 复数
    """
    print("\n" + "=" * 60)
    print("2. 数字类型")
    print("=" * 60)

    # 【整数 int】
    # 【重要】Python 3 的整数没有长度限制!
    small_int = 42
    big_int = 123456789012345678901234567890  # 任意大的整数
    print(f"小整数: {small_int}")
    print(f"大整数: {big_int}")

    # 不同进制表示
    binary = 0b1010       # 二进制,值为 10
    octal = 0o17          # 八进制,值为 15
    hexadecimal = 0xFF    # 十六进制,值为 255
    print(f"\n二进制 0b1010 = {binary}")
    print(f"八进制 0o17 = {octal}")
    print(f"十六进制 0xFF = {hexadecimal}")

    # 数字分隔符(Python 3.6+)
    million = 1_000_000
    print(f"使用下划线分隔: {million}")

    # 【浮点数 float】
    pi = 3.14159
    scientific = 1.23e-4  # 科学计数法,值为 0.000123
    print(f"\n浮点数 pi = {pi}")
    print(f"科学计数法 1.23e-4 = {scientific}")

    # 【警告】浮点数精度问题!
    result = 0.1 + 0.2
    print(f"\n【警告】0.1 + 0.2 = {result}")  # 不是 0.3!
    print(f"0.1 + 0.2 == 0.3: {result == 0.3}")  # False!

    # 【技巧】使用 decimal 模块处理精确计算
    from decimal import Decimal
    d1 = Decimal('0.1')
    d2 = Decimal('0.2')
    print(f"Decimal: 0.1 + 0.2 = {d1 + d2}")  # 精确的 0.3

    # 【复数 complex】
    c1 = 3 + 4j
    c2 = complex(1, 2)
    print(f"\n复数: c1 = {c1}, 实部 = {c1.real}, 虚部 = {c1.imag}")
    print(f"复数运算: {c1} + {c2} = {c1 + c2}")

    # 【数学运算】
    print("\n--- 数学运算 ---")
    a, b = 17, 5
    print(f"a={a}, b={b}")
    print(f"加法: a + b = {a + b}")
    print(f"减法: a - b = {a - b}")
    print(f"乘法: a * b = {a * b}")
    print(f"除法: a / b = {a / b}")      # 总是返回 float
    print(f"整除: a // b = {a // b}")    # 向下取整
    print(f"取模: a % b = {a % b}")
    print(f"幂运算: a ** b = {a ** b}")  # 17^5
    print(f"divmod: divmod(a, b) = {divmod(a, b)}")  # 同时返回商和余数

    # 【内置数学函数】
    print("\n--- 内置数学函数 ---")
    print(f"abs(-10) = {abs(-10)}")
    print(f"round(3.7) = {round(3.7)}")
    print(f"round(3.14159, 2) = {round(3.14159, 2)}")
    print(f"pow(2, 10) = {pow(2, 10)}")
    print(f"max(1, 5, 3) = {max(1, 5, 3)}")
    print(f"min(1, 5, 3) = {min(1, 5, 3)}")


def main03_strings():
    """
    ============================================================
                        3. 字符串类型
    ============================================================
    Python 字符串特点:
    - 不可变(immutable)
    - 支持 Unicode(UTF-8)
    - 单引号和双引号等价
    """
    print("\n" + "=" * 60)
    print("3. 字符串类型")
    print("=" * 60)

    # 【字符串创建】
    s1 = 'Hello'           # 单引号
    s2 = "World"           # 双引号
    s3 = '''多行
字符串'''                   # 三引号(多行)
    s4 = """也可以用
双引号"""

    print(f"单引号: {s1}")
    print(f"双引号: {s2}")
    print(f"三引号: {s3}")

    # 【转义字符】
    escaped = "Hello\tWorld\n换行了"
    print(f"\n转义字符: {escaped}")

    # 【原始字符串】r前缀,不处理转义
    raw = r"C:\Users\name\file.txt"
    print(f"原始字符串: {raw}")

    # 【字符串拼接】
    print("\n--- 字符串拼接 ---")
    greeting = s1 + " " + s2
    print(f"+ 拼接: {greeting}")

    repeated = "Ha" * 3
    print(f"* 重复: {repeated}")

    # 【格式化字符串】
    print("\n--- 字符串格式化 ---")
    name = "Alice"
    age = 25

    # f-string(推荐,Python 3.6+)
    print(f"f-string: Hello, {name}! You are {age} years old.")
    print(f"表达式: 2 + 3 = {2 + 3}")
    print(f"格式化数字: pi = {3.14159:.2f}")
    print(f"填充对齐: |{name:>10}| |{name:<10}| |{name:^10}|")

    # format() 方法
    template = "Hello, {}! You are {} years old."
    print(f"format(): {template.format(name, age)}")

    # % 格式化(旧式,不推荐)
    print("%%格式化: Hello, %s! You are %d years old." % (name, age))

    # 【字符串索引和切片】
    print("\n--- 索引和切片 ---")
    s = "Hello, Python!"
    print(f"字符串: '{s}'")
    print(f"s[0] = '{s[0]}'")       # 第一个字符
    print(f"s[-1] = '{s[-1]}'")     # 最后一个字符
    print(f"s[0:5] = '{s[0:5]}'")   # 切片 [start:end)
    print(f"s[7:] = '{s[7:]}'")     # 从索引7到末尾
    print(f"s[:5] = '{s[:5]}'")     # 从开头到索引5
    print(f"s[::2] = '{s[::2]}'")   # 步长为2
    print(f"s[::-1] = '{s[::-1]}'") # 反转字符串

    # 【常用字符串方法】
    print("\n--- 常用字符串方法 ---")
    text = "  Hello, World!  "
    print(f"原字符串: '{text}'")
    print(f"strip(): '{text.strip()}'")
    print(f"lower(): '{text.lower()}'")
    print(f"upper(): '{text.upper()}'")
    print(f"replace(): '{text.replace('World', 'Python')}'")
    print(f"split(): {text.split(',')}")
    print(f"find('World'): {text.find('World')}")
    print(f"startswith('  Hello'): {text.startswith('  Hello')}")
    print(f"endswith('!  '): {text.endswith('!  ')}")

    # 【字符串判断方法】
    print("\n--- 字符串判断 ---")
    print(f"'123'.isdigit(): {'123'.isdigit()}")
    print(f"'abc'.isalpha(): {'abc'.isalpha()}")
    print(f"'abc123'.isalnum(): {'abc123'.isalnum()}")
    print(f"'   '.isspace(): {'   '.isspace()}")

    # 【join 方法】
    words = ["Hello", "World", "Python"]
    joined = " ".join(words)
    print(f"\njoin: {joined}")

    # 【注意】字符串是不可变的!
    # s[0] = 'h'  # 这会报错!TypeError


def main04_bool_none():
    """
    ============================================================
                    4. 布尔值和 None
    ============================================================
    """
    print("\n" + "=" * 60)
    print("4. 布尔值和 None")
    print("=" * 60)

    # 【布尔值】True 和 False
    is_valid = True
    is_empty = False
    print(f"is_valid = {is_valid}, 类型: {type(is_valid)}")

    # 【布尔运算】
    print("\n--- 布尔运算 ---")
    print(f"True and False = {True and False}")
    print(f"True or False = {True or False}")
    print(f"not True = {not True}")

    # 【比较运算】
    print("\n--- 比较运算 ---")
    a, b = 10, 20
    print(f"a={a}, b={b}")
    print(f"a == b: {a == b}")
    print(f"a != b: {a != b}")
    print(f"a < b: {a < b}")
    print(f"a >= b: {a >= b}")

    # 【链式比较】Python 特有!
    x = 15
    print(f"\n链式比较: 10 < {x} < 20 = {10 < x < 20}")

    # 【真值判断】
    # 以下值被视为 False:
    # - None
    # - False
    # - 数字零:0, 0.0, 0j
    # - 空序列:'', [], (), {}
    # - 空集合:set()
    # - 自定义类的 __bool__() 或 __len__() 返回 False 或 0
    print("\n--- 真值判断(Truthy/Falsy)---")
    falsy_values = [None, False, 0, 0.0, '', [], {}, set()]
    for val in falsy_values:
        print(f"bool({repr(val):10}) = {bool(val)}")

    print("\n非空值都为 True:")
    truthy_values = [1, -1, "hello", [1], {"a": 1}]
    for val in truthy_values:
        print(f"bool({repr(val):15}) = {bool(val)}")

    # 【None 类型】
    print("\n--- None 类型 ---")
    result = None
    print(f"result = {result}, 类型: {type(result)}")

    # 【重要】使用 is 而不是 == 来判断 None
    if result is None:
        print("result is None: True(使用 is 判断)")

    # 【技巧】函数没有显式 return 时返回 None
    def no_return():
        pass

    print(f"无返回值函数: {no_return()}")


def main05_type_conversion():
    """
    ============================================================
                        5. 类型转换
    ============================================================
    """
    print("\n" + "=" * 60)
    print("5. 类型转换")
    print("=" * 60)

    # 【显式类型转换】
    print("--- 显式类型转换 ---")

    # 转换为整数
    print(f"int('123') = {int('123')}")
    print(f"int(3.9) = {int(3.9)}")      # 截断,不是四舍五入
    print(f"int('0xFF', 16) = {int('0xFF', 16)}")  # 指定进制

    # 转换为浮点数
    print(f"\nfloat('3.14') = {float('3.14')}")
    print(f"float(10) = {float(10)}")

    # 转换为字符串
    print(f"\nstr(123) = '{str(123)}'")
    print(f"str(3.14) = '{str(3.14)}'")
    print(f"str(True) = '{str(True)}'")

    # 转换为布尔
    print(f"\nbool(1) = {bool(1)}")
    print(f"bool(0) = {bool(0)}")
    print(f"bool('') = {bool('')}")
    print(f"bool('hello') = {bool('hello')}")

    # 转换为列表/元组/集合
    print(f"\nlist('abc') = {list('abc')}")
    print(f"tuple([1, 2, 3]) = {tuple([1, 2, 3])}")
    print(f"set([1, 2, 2, 3]) = {set([1, 2, 2, 3])}")

    # 【类型检查】
    print("\n--- 类型检查 ---")
    x = 42
    print(f"type(x) = {type(x)}")
    print(f"type(x) == int: {type(x) == int}")
    print(f"isinstance(x, int): {isinstance(x, int)}")
    print(f"isinstance(x, (int, float)): {isinstance(x, (int, float))}")

    # 【注意】isinstance 更推荐,因为它支持继承
    print(f"\nisinstance(True, int): {isinstance(True, int)}")  # True! bool 是 int 的子类


def main06_constants():
    """
    ============================================================
                        6. 常量(约定)
    ============================================================
    【注意】Python 没有真正的常量!
    只能通过命名约定(全大写)来表示常量
    """
    print("\n" + "=" * 60)
    print("6. 常量(约定)")
    print("=" * 60)

    # 【约定】全大写表示常量
    PI = 3.14159
    MAX_SIZE = 100
    DEFAULT_NAME = "Unknown"

    print(f"PI = {PI}")
    print(f"MAX_SIZE = {MAX_SIZE}")
    print(f"DEFAULT_NAME = {DEFAULT_NAME}")

    # 【警告】Python 不会阻止你修改"常量"
    # PI = 3.0  # 这在语法上是允许的!

    # 【技巧】使用 Enum 创建真正的常量
    from enum import Enum

    class Color(Enum):
        RED = 1
        GREEN = 2
        BLUE = 3

    print(f"\nEnum 常量: {Color.RED}, 值: {Color.RED.value}")

    # 【技巧】使用 typing.Final(Python 3.8+)
    from typing import Final
    MAX_CONNECTIONS: Final = 10
    print(f"Final 类型提示: MAX_CONNECTIONS = {MAX_CONNECTIONS}")
    # 类型检查器会警告对 Final 变量的重新赋值


def main07_id_and_is():
    """
    ============================================================
                    7. 对象标识与相等性
    ============================================================
    - id(): 返回对象的唯一标识(内存地址)
    - is: 判断是否是同一对象
    - ==: 判断值是否相等
    """
    print("\n" + "=" * 60)
    print("7. 对象标识与相等性")
    print("=" * 60)

    # 【is vs ==】
    a = [1, 2, 3]
    b = [1, 2, 3]
    c = a

    print(f"a = {a}, id(a) = {id(a)}")
    print(f"b = {b}, id(b) = {id(b)}")
    print(f"c = a, id(c) = {id(c)}")

    print(f"\na == b: {a == b}")  # True,值相等
    print(f"a is b: {a is b}")   # False,不是同一对象
    print(f"a is c: {a is c}")   # True,是同一对象

    # 【小整数缓存】
    # Python 缓存 -5 到 256 的整数
    print("\n--- 小整数缓存 ---")
    x = 100
    y = 100
    print(f"x = 100, y = 100")
    print(f"x is y: {x is y}")  # True,使用缓存

    x = 1000
    y = 1000
    print(f"\nx = 1000, y = 1000")
    print(f"x is y: {x is y}")  # 可能是 False

    # 【字符串驻留】
    print("\n--- 字符串驻留 ---")
    s1 = "hello"
    s2 = "hello"
    print(f"s1 = 'hello', s2 = 'hello'")
    print(f"s1 is s2: {s1 is s2}")  # True,字符串驻留

    s3 = "hello world"
    s4 = "hello world"
    print(f"\ns3 = 'hello world', s4 = 'hello world'")
    print(f"s3 is s4: {s3 is s4}")  # 可能是 True 或 False


if __name__ == "__main__":
    main01_variables()
    main02_numbers()
    main03_strings()
    main04_bool_none()
    main05_type_conversion()
    main06_constants()
    main07_id_and_is()

💬 讨论

使用 GitHub 账号登录后即可参与讨论

基于 MIT 许可发布