简单来说,变量是用来存储数据的容器。你可以把变量想象成一个贴着标签的盒子,你可以在这个盒子里放入各种各样的东西,比如数字、文字等等。通过盒子上的标签(也就是变量名),你可以随时找到并使用盒子里面的东西。
在 Python 中,当我们第一次给一个变量赋值时,Python 会在计算机的内存中开辟一块空间来存储这个值,并将这个变量名“指向”这块内存空间。
与一些编程语言不同,Python 没有声明变量的命令,首次为其赋值时,才会创建变量。
在 Python 中,创建变量非常简单,你只需要使用赋值运算符 =。它的基本语法是:
变量名 = 值
比如:
age = 30
name = "小明"
height = 1.75
is_student = False
变量名一般要根据语境选择合适的变量名,且要遵循以下的规范:
is_
, has_
, should_
开头:::warning
Python 是 强类型(strongly typed) 但 动态类型(dynamically typed) 的语言
:::
强类型是指语言会严格检查类型,不允许隐式的、可能不安全的类型转换:
# 报错!不能直接拼接字符串和整数(TypeError)
"hello" + 42
和强类型对应的是弱类型,最典型的是 JavaScript:
// 合法!结果为 "hello42"(数字被隐式转为字符串)
"hello" + 42
JavaScript 的弱类型也是 JavaScript 饱受诟病的原因之一,这也是 typescript (在 js 的基础上增加了类型)影响力增强的原因。
动态类型是指变量类型在运行时确定,且可以随时改变:
# x 是整数
x = 42
# x 变成字符串(合法)
x = "hello"
静态类型最典型的语言是 Java:
int x = 42;
// 编译报错!
x = "hello";
上面的例子中,变量是有类型的,Python 自动根据你赋的值的类型,为变量指定了类型,你也可以更显示的指定变量的类型:
from typing import List, Dict, Tuple, Set
age: int = 30
name: str = "Bob"
numbers: List[int] = [1, 2, 3]
person: Dict[str, int] = {"age": 30}
point: Tuple[int, int] = (10, 20)
unique_ids: Set[str] = {"a1", "b2", "c3"}
如果想知道 Python 的变量的类型,可以使用 type
函数:
x = 42
# 输出:
print(type(x))
Python 还支持同时为多个变量赋值:
a, b, c = 1, 2, 3
# 1 2 3
print(a, b, c, sep=" ")
:::warning
猜猜看这行代码是啥作用:x = y = z = “zzzz+++”
:::
类型名称 | 描述 | 示例 | 是否可变 (Mutable) | 是否有序 (Ordered) | 是否允许重复元素 |
---|---|---|---|---|---|
整型 (int) | 整数(正、负或零),没有小数部分 | age: int = 30 |
不可变(改变指针的指向) | 不适用 | 适用 |
浮点型 (float) | 带有小数部分的数字 | price: float = 19.99 |
不可变 | 不适用 | 适用 |
列表 (list) | 有序、可变的元素集合,元素可以是不同类型 | names: list[str] = ["Alice", "Bob", "Charlie"] |
可变 | 有序 | 允许 |
元组 (tuple) | 有序、不可变的元素集合,一旦创建就不能修改 | mixed_data: tuple[str, int, float] = ("hello", 5, 3.14) |
不可变 | 有序 | 允许 |
字符串 (str) | 由字符组成的不可变序列,用于表示文本数据 | name: str = "Alice" address: str = 'address' |
不可变 | 有序 | 允许 |
集合 (set) | 无序、不包含重复元素的集合,可进行添加和删除操作 | unique_numbers: set[int] = {1, 2, 3, 4, 5} |
可变 | 无序 | 不允许 |
字典 (dict) | 无序的键值对集合,每个键是唯一的,用于访问对应的值 | student_info: dict[str, any] = {"name": "Bob", "age": 22} |
可变 | 在 Python 3.7+ 版本中有序 (插入顺序) | 键不允许重复,值可以重复 |
布尔值 (bool) | 只有两个值:True 和 False,通常用于逻辑判断 | is_active: bool = True has_permission: bool = False |
不可变 | 不适用 | 适用 |
可空类型 | 可以是 None,也可以是其他指定的类型,它是比较常用的类型别名 | from typing import Optional name: Optional[str] = "Alice" name = None |
可变 | 不适用 | |
NoneType | 只有一个特殊的值 None | empty_value: None = None |
不可变 | 不适用 | 适用 |
自定义类型 | 类,接口 | my_dog: Dog = Dog("Buddy", "Golden Retriever") |
可变 | 不适用 |
好了,知道了如何定义变量,以及变量都有哪些类型,请你定义以下的几个变量:
常量是在程序运行的整个周期中都不改变的,Python 中没有特定的常量类型,但是人们通常使用全大写的变量来表示常量。
MAX_VALUE = 10000
你可能会好奇,为什么我们需要进行数据类型转换呢?原因有很多,以下是一些常见的场景:
Python 数据类型转换可以分为两种:
在隐式类型转换中,Python 会自动将小范围的数据类型转换为另一种大范围的数据类型(避免数据丢失),不需要我们去干预。
num_0 = 1
num_1 = 1.1
num_2 = num_0 + num_1
print("num_0 数据类型为:",type(num_0))
print("num_1 数据类型为:",type(num_1))
print("num_2 值为:",num_2)
print("num_2 数据类型为:",type(num_2))
隐式类型转换在某些情况下是不能转的,比如:
num_int = 1
num_str = "123"
print("num_int 数据类型为:",type(num_int))
print("num_str 数据类型为:",type(num_str))
print(num_int+num_str)
在这种情况下,Python 不会进行隐式转换,上面的代码会报错:
对于字符串和数字相加的场景,我们需要使用显式类型转换,将字符串转为数字后再相加。
Python 中提供了以下的内置函数用于执行数据类型之间的转换。这些函数输入要转换的值,返回一个新的类型的值:
函数 | 描述 | 示例 | 转换结果 |
---|---|---|---|
int(x) |
将 x 转换为一个整数。如果 x 是浮点数,则会截断小数部分。如果 x 是字符串,则需要是表示整数的有效形式 |
int(3.14) int("123") int("-5") |
3 123 -5 |
float(x) |
将 x 转换为一个浮点数。如果 x 是整数,则会添加 .0 。如果 x 是字符串,则需要是表示浮点数的有效形式 |
float(5) float("3.14159") float("-2.7") |
5.0 3.14159 -2.7 |
str(x) |
将 x 转换为一个字符串。可以转换任何数据类型 |
str(123) str(3.14) str(True) |
"123" "3.14" "True" |
list(s) |
将序列 s 转换为一个列表。如果 s 是字符串,则会转换为包含每个字符的列表 |
list("hello") list((1, 2, 3)) |
['h', 'e', 'l', 'l', 'o'] [1, 2, 3] |
tuple(s) |
将序列 s 转换为一个元组。如果 s 是字符串,则会转换为包含每个字符的元组 |
tuple([4, 5, 6]) tuple("world") |
(4, 5, 6) ('w', 'o', 'r', 'l', 'd') |
set(s) |
将序列 s 转换为一个集合。集合中的元素是唯一的,并且是无序的。如果 s 是字符串,则会转换为包含每个字符的集合 |
set([1, 2, 2, 3]) set("banana") |
{1, 2, 3} {'b', 'a', 'n'} |
dict(iterable) |
将一个可迭代对象转换为字典。可迭代对象的元素必须是键值对(例如,包含两个元素的元组或列表) | dict([('a', 1), ('b', 2)]) dict(zip(['one', 'two'], [1,2])) |
{'a': 1, 'b': 2} {'one': 1, 'two': 2} |
bool(x) |
将 x 转换为一个布尔值。以下值会被转换为 False : None ,数字 0 ,空序列("" , [] , () ),空字典 {} ,空集合 set() 。其他值通常转换为 True |
bool(0) bool(1) bool("hello") bool([]) |
False True True False |
bytes(iterable) |
返回一个新的“bytes”对象,它是一个不可变的字节序列。如果 iterable 是一个整数,则创建一个指定大小的以零填充的 bytes 对象 |
bytes([65, 66, 67]) bytes(5) |
b'ABC' b'\x00\x00\x00\x00\x00' |
bytearray(iterabe) |
返回一个新的“bytearray”对象,它是字节的可变序列 | bytearray([65, 66, 67]) bytearray(5) |
bytearray(b'ABC') bytearray(b'\x00\x00\x00\x00\x00') |
下面是一个强制转换的例子:
# 将浮点数强制转换为整数
float_num = 3.14
int_num = int(float_num)
# 输出: 3
print(int_num)
:::warning
强制类型转换可能会导致数据丢失或引发 ValueError
异常,例如尝试将无法转换为整数的字符串传递给 int()
函数
在进行类型转换时,请确保你了解数据的原始类型和目标类型,以避免意外的结果
:::