Python3 基础:变量、数据类型和基本运算
一、变量:Python 中的小盒子
想象一下,变量就像是带标签的盒子,你可以在里面放东西,以后需要时再拿出来用。在 Python 中创建变量非常简单:
# 创建一个名为 name 的变量,里面放入字符串 "小明"
name = "小明"
# 创建一个名为 age 的变量,里面放入数字 18
age = 18
# 使用这些变量
print(f"大家好,我是{name},今年{age}岁")
变量的特点
-
无需声明类型:Python 是动态类型语言,不需要提前声明变量类型
-
可以随时改变内容:就像换盒子里的东西一样简单
x = 10 # x 现在是整数 x = "hello" # x 现在是字符串 x = [1, 2, 3] # x 现在是列表
-
命名规则:
- 只能包含字母、数字和下划线
- 不能以数字开头
- 不能使用 Python 关键字(如
if
,for
,while
等) - 区分大小写(
name
和Name
是不同的变量)
-
Python 命名习惯:多个单词用下划线连接(snake_case)
user_name = "python_lover" first_name = "小" last_name = "明"
二、数据类型:Python 的百宝箱
Python 有几种基本的数据类型,就像不同形状的积木,我们可以用它们构建复杂的结构。
数字类型:计算的基础
1. 整数(int)
整数就是没有小数部分的数字,可以是正数、负数或零。
age = 25
temperature = -5
count = 0
# 大整数也不在话下
big_number = 1234567890123456789
2. 浮点数(float)
浮点数是有小数部分的数字。
height = 1.75
pi = 3.14159
small = 0.000001
# 科学计数法
large = 6.022e23 # 6.022 × 10²³
3. 复数(complex)
是的,Python 内置支持复数!
c = 3 + 4j # 其中 j 表示虚数单位
文本类型:字符串(str)
字符串是用引号(单引号或双引号)括起来的文本。
name = "小明"
message = '你好,世界!'
# 三引号可以创建多行字符串
poem = """
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
"""
字符串的一些有趣操作
# 连接字符串
greeting = "你好" + "," + "世界!"
# 重复字符串
stars = "*" * 10 # **********
# 获取单个字符(索引从0开始)
first_char = name[0] # 小
# 字符串切片
substring = message[0:2] # 你好
# 字符串格式化
info = f"{name}说:{message}"
布尔类型(bool):真与假
布尔值只有两个可能的值:True
和 False
。
is_student = True
has_car = False
# 布尔运算
can_drive = is_student and has_car # False
is_working = not is_student # False
容器类型:收纳多个值
1. 列表(list):有序可变集合
列表用方括号 []
表示,元素之间用逗号分隔。
# 创建列表
fruits = ["苹果", "香蕉", "橙子"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", True, 3.14]
# 访问列表元素
first_fruit = fruits[0] # 苹果
# 修改列表元素
fruits[1] = "草莓" # 现在 fruits 是 ["苹果", "草莓", "橙子"]
# 添加元素
fruits.append("西瓜") # 现在 fruits 是 ["苹果", "草莓", "橙子", "西瓜"]
# 列表长度
fruit_count = len(fruits) # 4
2. 元组(tuple):有序不可变集合
元组用圆括号 ()
表示,创建后不能修改。
# 创建元组
coordinates = (10, 20)
rgb = (255, 0, 0) # 红色
# 访问元组元素
x = coordinates[0] # 10
# 不能修改元组元素
# rgb[0] = 128 # 这会导致错误!
3. 字典(dict):键值对集合
字典用花括号 {}
表示,每个元素是一个键值对。
# 创建字典
person = {
"name": "小明",
"age": 18,
"is_student": True
}
# 访问字典值
person_name = person["name"] # 小明
# 修改字典值
person["age"] = 19
# 添加新的键值对
person["hobby"] = "编程"
4. 集合(set):无序不重复集合
集合也用花括号 {}
表示,但只有值,没有键。
# 创建集合
unique_numbers = {1, 2, 3, 4, 5}
fruits_set = {"苹果", "香蕉", "橙子"}
# 添加元素
fruits_set.add("西瓜")
# 删除元素
fruits_set.remove("香蕉")
# 集合运算
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}
union = A | B # 并集:{1, 2, 3, 4, 5, 6}
intersection = A & B # 交集:{3, 4}
difference = A - B # 差集:{1, 2}
特殊类型
None 类型
None
表示不存在任何值,类似于其他语言中的 null
。
result = None
三、基本运算:Python 的魔法操作
算术运算符
# 加法
sum_result = 5 + 3 # 8
# 减法
difference = 10 - 7 # 3
# 乘法
product = 4 * 6 # 24
# 除法(返回浮点数)
quotient = 10 / 3 # 3.3333...
# 整除(返回整数部分)
integer_quotient = 10 // 3 # 3
# 取余
remainder = 10 % 3 # 1
# 幂运算
power = 2 ** 3 # 8 (2的3次方)
比较运算符
比较运算符返回布尔值 True
或 False
。
# 等于
is_equal = (5 == 5) # True
# 不等于
is_not_equal = (5 != 10) # True
# 大于
is_greater = (10 > 5) # True
# 小于
is_less = (5 < 10) # True
# 大于等于
is_greater_equal = (5 >= 5) # True
# 小于等于
is_less_equal = (5 <= 10) # True
逻辑运算符
# 与运算:两个条件都为真时结果为真
both_true = (True and True) # True
one_false = (True and False) # False
# 或运算:至少一个条件为真时结果为真
at_least_one_true = (True or False) # True
both_false = (False or False) # False
# 非运算:取反
not_true = not True # False
not_false = not False # True
赋值运算符
# 基本赋值
x = 10
# 复合赋值
x += 5 # 等同于 x = x + 5,现在 x 是 15
x -= 3 # 等同于 x = x - 3,现在 x 是 12
x *= 2 # 等同于 x = x * 2,现在 x 是 24
x /= 6 # 等同于 x = x / 6,现在 x 是 4.0
四、类型转换:变形记
有时候需要将一种数据类型转换为另一种:
# 字符串转整数
age_str = "25"
age_int = int(age_str) # 25 (整数)
# 整数转字符串
count = 100
count_str = str(count) # "100" (字符串)
# 浮点数转整数(截断小数部分)
pi = 3.14159
pi_int = int(pi) # 3
# 字符串转浮点数
price_str = "19.99"
price = float(price_str) # 19.99 (浮点数)
# 转换为布尔值
# 0、空字符串、空列表等被视为 False,其他都是 True
bool(0) # False
bool("") # False
bool([]) # False
bool(1) # True
bool("hi") # True
五、实用技巧和有趣示例
1. 同时给多个变量赋值
# 同时给多个变量赋相同的值
x = y = z = 0
# 一次性给多个变量赋不同的值
a, b, c = 1, 2, 3
# 交换两个变量的值(无需临时变量)
x, y = 10, 20
x, y = y, x # 现在 x=20, y=10
2. 使用 f-字符串格式化输出
name = "小明"
age = 18
height = 1.75
# 格式化字符串
intro = f"我叫{name},今年{age}岁,身高{height:.2f}米"
print(intro) # 我叫小明,今年18岁,身高1.75米
3. 链式比较
# 检查一个数是否在一个范围内
age = 25
is_adult = 18 <= age < 65 # True
# 相当于:
# is_adult = (18 <= age) and (age < 65)
4. 三元运算符
# 条件表达式的简写形式
age = 20
status = "成年" if age >= 18 else "未成年"
5. 探索变量类型
x = 42
print(type(x)) # <class 'int'>
y = "Hello"
print(type(y)) # <class 'str'>
z = [1, 2, 3]
print(type(z)) # <class 'list'>
六、动手实践:变量与数据类型的游戏
尝试一下这个简单的个人信息收集程序:
# 收集用户信息
name = input("请输入你的名字:")
age_str = input("请输入你的年龄:")
age = int(age_str)
height_str = input("请输入你的身高(米):")
height = float(height_str)
hobbies_str = input("请输入你的爱好(用逗号分隔):")
hobbies = hobbies_str.split(",")
# 创建用户信息字典
user_info = {
"name": name,
"age": age,
"height": height,
"hobbies": hobbies,
"is_adult": age >= 18
}
# 输出用户信息
print("\n===== 用户信息 =====")
print(f"姓名:{user_info['name']}")
print(f"年龄:{user_info['age']}岁")
print(f"身高:{user_info['height']:.2f}米")
print(f"爱好:{', '.join(user_info['hobbies'])}")
print(f"成年状态:{'已成年' if user_info['is_adult'] else '未成年'}")
小结
在 Python 中,变量是存储数据的容器,而数据类型决定了数据的性质和可执行的操作。Python 的动态类型系统使得编码更加灵活,但同时也要注意数据类型的正确使用。
基本运算符让我们能够对数据进行操作,不同类型的数据可以使用不同的运算符。通过类型转换,我们可以在不同数据类型之间自由切换。
掌握这些基础知识后,你就有了用 Python 进行更复杂编程的坚实基础!
思考题
- 如果
a = 5
和b = 2
,那么a / b
和a // b
的结果各是什么?有什么区别? - 列表和元组有什么主要区别?
- 如何检查一个变量是否是某个特定的数据类型?
问题1: 如果 a = 5 和 b = 2,那么 a / b 和 a // b 的结果各是什么?有什么区别?
a = 5
b = 2
print(a / b) # 输出: 2.5
print(a // b) # 输出: 2
区别:
a / b
是浮点除法,返回一个浮点数结果,即使两个操作数都是整数。a // b
是整数除法(地板除法),返回商的整数部分(向下取整),舍弃小数部分。- 当操作数为负数时,区别更明显:例如
-5 // 2
结果是-3
,而不是-2.5
向下取整到-2
。
问题2: 列表和元组有什么主要区别?
特性 | 列表 (List) | 元组 (Tuple) |
---|---|---|
可变性 | 可变 (mutable) | 不可变 (immutable) |
语法 | 使用方括号 [1, 2, 3] | 使用圆括号 (1, 2, 3) |
方法 | 有多种修改方法如 append() , insert() , remove() | 方法较少,无修改元素的方法 |
性能 | 操作较慢 | 操作较快 |
内存使用 | 较大 | 较小 |
使用场景 | 需要经常修改的数据集合 | 固定数据,如坐标、配置项 |
哈希性 | 不可哈希,不能用作字典键 | 如果元素都是可哈希的,则元组可哈希,可用作字典键 |
问题3: 如何检查一个变量是否是某个特定的数据类型?
在Python中,有几种方法可以检查变量的数据类型:
- 使用
type()
函数
x = 5
if type(x) == int:
print("x 是整数")
- 使用
isinstance()
函数(推荐)
x = 5
if isinstance(x, int):
print("x 是整数")
isinstance()
比 type()
更好,因为它考虑了继承关系:
class MyClass:
pass
class ChildClass(MyClass):
pass
obj = ChildClass()
# 检查是否是特定类的实例
print(isinstance(obj, ChildClass)) # True
print(isinstance(obj, MyClass)) # True - 考虑了继承关系
print(type(obj) == MyClass) # False - 不考虑继承关系
- 检查多种类型
x = 5
if isinstance(x, (int, float)):
print("x 是数字类型")
- 使用类型注解和
typing
模块(Python 3.5+)
from typing import List, Dict, Union
def process_data(data: List[int]) -> None:
if not isinstance(data, list):
raise TypeError("Expected a list")
# 处理数据
isinstance()
通常是检查数据类型的最佳选择,因为它尊重类的继承层次结构,并且可以同时检查多种类型。