第2章:变量和简单数据类型(Variables and Simple Data Types)
一、导读
1.1 本章学习目标
第2章介绍Python的变量系统和基本数据类型,这是编写任何Python程序的基础。Python是动态类型语言,变量不需要声明类型,这使得代码更加简洁灵活。本章的核心学习目标包括:
- 掌握变量的命名规则和使用方式:Python的变量命名有什么约定?
- 熟练使用字符串的各种操作:创建、拼接、格式化、查找、替换
- 理解数字类型及其运算:整数、浮点数、复数的运算规则
- 掌握类型转换的方法:int()、float()、str()的使用场景
- 学会使用注释:单行注释和多行注释的规范
- 了解Python之禅和代码风格:PEP 8的核心原则
1.2 为什么本章如此重要
变量和数据类型是编程的基础中的基础。Python的动态类型系统虽然灵活,但也有陷阱——如果不理解类型转换的规则,很容易写出有bug的代码。此外,Python的字符串处理能力非常强大,掌握字符串的各种操作方法是后续学习的基础。
1.3 核心问题引导
Python的"动态类型"到底意味着什么?变量和值是什么关系?
f-string和format()方法有什么区别?为什么f-string更好?
Python的整数为什么不会溢出?这和C/Java有什么不同?
为什么 0.1 + 0.2 != 0.3?浮点数精度问题如何解决?
Python的字符串是不可变的,这意味着什么?
什么是"Pythonic"的代码风格?
二、核心概念详解
2.1 变量
2.1.1 变量的本质
在Python中,变量是对象的引用(标签),而不是存储值的容器。当你写 x = 42 时,Python创建了一个值为42的整数对象,然后将变量x指向这个对象。
x = 42 # x指向整数对象42
y = x # y也指向同一个对象
x = 100 # x现在指向新的对象100,y仍然指向42
print(y) # 422.1.2 命名规则
- 只能包含字母、数字和下划线
- 不能以数字开头
- 不能使用Python关键字(如if、for、class等)
- 推荐使用snake_case命名风格
# 合法的变量名
my_variable = 42
_private = "secret"
camelCase = "valid but not Pythonic"
变量名 = "中文变量名也是合法的"
# 非法的变量名
# 2nd_place = "silver" # 以数字开头
# my-var = "invalid" # 包含连字符
# class = "invalid" # 关键字2.2 字符串
字符串是Python中最常用的数据类型之一。Python的字符串是不可变的Unicode字符序列。
2.2.1 字符串创建
# 单引号和双引号
s1 = 'Hello'
s2 = "World"
# 三引号(多行字符串)
s3 = """This is a
multi-line
string"""
# 原始字符串(不处理转义)
s4 = r"C:\Users\Alice\Documents"
print(s4) # C:\Users\Alice\Documents
# f-string(格式化字符串,Python 3.6+)
name = "Alice"
age = 20
s5 = f"My name is {name} and I am {age} years old."
print(s5)2.2.2 字符串操作
text = "Hello, World!"
# 索引和切片
print(text[0]) # H
print(text[-1]) # !
print(text[0:5]) # Hello
print(text[7:]) # World!
print(text[::-1]) # !dlroW ,olleH(反转)
# 常用方法
print(text.upper()) # HELLO, WORLD!
print(text.lower()) # hello, world!
print(text.strip()) # 去除两端空白
print(text.replace("World", "Python")) # Hello, Python!
print(text.split(", ")) # ['Hello', 'World!']
print(text.find("World")) # 7
print(text.count("l")) # 3
print(text.startswith("Hello")) # True
print(text.endswith("!")) # True
# 字符串拼接
s1 = "Hello"
s2 = "World"
s3 = s1 + " " + s2 # Hello World
s4 = " ".join([s1, s2]) # Hello World(更高效)
# 字符串重复
line = "-" * 30
print(line) # ------------------------------2.2.3 字符串格式化
name = "Alice"
age = 20
score = 95.5
# 方法1:f-string(推荐,Python 3.6+)
print(f"Name: {name}, Age: {age}")
print(f"Score: {score:.1f}") # 95.5
print(f"{'center':^20}") # 居中,宽度20
# 方法2:format()方法
print("Name: {}, Age: {}".format(name, age))
print("Name: {0}, Age: {1}".format(name, age))
print("Score: {:.2f}".format(score))
# 方法3:%格式化(旧式,不推荐)
print("Name: %s, Age: %d" % (name, age))2.3 数字
2.3.1 整数
Python的整数没有大小限制(不像C/Java有溢出问题):
x = 42
y = -100
z = 1_000_000 # 可以使用下划线分隔,提高可读性
# 大数运算
big = 2 ** 100
print(big) # 1267650600228229401496703205376
# 不同进制
binary = 0b1010 # 二进制
octal = 0o12 # 八进制
hexadecimal = 0xFF # 十六进制
print(binary, octal, hexadecimal) # 10 10 2552.3.2 浮点数
pi = 3.14159
e = 2.71828
# 科学计数法
avogadro = 6.022e23
electron_mass = 9.109e-31
# 注意浮点数精度问题
print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False
# 使用decimal模块处理精确计算
from decimal import Decimal
a = Decimal('0.1')
b = Decimal('0.2')
print(a + b) # 0.3
print(a + b == Decimal('0.3')) # True2.3.3 数字运算
a = 10
b = 3
print(a + b) # 13 加法
print(a - b) # 7 减法
print(a * b) # 30 乘法
print(a / b) # 3.333... 除法(总是返回浮点数)
print(a // b) # 3 整除
print(a % b) # 1 取余
print(a ** b) # 1000 幂运算
# 内置数学函数
import math
print(abs(-5)) # 5
print(round(3.7)) # 4
print(max(1, 2, 3)) # 3
print(min(1, 2, 3)) # 1
print(math.sqrt(16)) # 4.0
print(math.floor(3.7)) # 3
print(math.ceil(3.2)) # 42.4 类型转换
# 字符串转数字
num_str = "42"
num_int = int(num_str) # 42
num_float = float(num_str) # 42.0
# 数字转字符串
n = 42
s = str(n) # "42"
# 浮点数转整数
f = 3.7
i = int(f) # 3(截断,不是四舍五入)
# 布尔值
print(bool(0)) # False
print(bool(1)) # True
print(bool("")) # False
print(bool("hello")) # True
print(bool([])) # False
print(bool([1, 2])) # True
print(bool(None)) # False2.5 注释
# 这是单行注释
"""
这是多行注释
(实际上是字符串字面量)
可以跨越多行
"""
x = 42 # 行尾注释
# TODO: 这是一个待办事项
# FIXME: 这里有一个bug
# NOTE: 这是一个重要说明三、实战案例
3.1 个人信息卡
# 收集并格式化个人信息
name = input("Enter your name: ").strip().title()
age = int(input("Enter your age: "))
city = input("Enter your city: ").strip().title()
# 使用f-string格式化输出
print("\n" + "=" * 30)
print(f"{'Personal Information':^30}")
print("=" * 30)
print(f"Name: {name}")
print(f"Age: {age}")
print(f"City: {city}")
print(f"Next year, you'll be {age + 1}!")
print("=" * 30)3.2 简单的文本处理
# 文本统计工具
text = input("Enter a paragraph: ")
# 统计
words = text.split()
char_count = len(text)
word_count = len(words)
sentence_count = text.count('.') + text.count('!') + text.count('?')
print(f"\n--- Text Statistics ---")
print(f"Characters: {char_count}")
print(f"Words: {word_count}")
print(f"Sentences: {sentence_count}")
print(f"Avg word length: {sum(len(w) for w in words) / word_count:.1f}")3.3 温度转换器
def celsius_to_fahrenheit(c):
return c * 9/5 + 32
def fahrenheit_to_celsius(f):
return (f - 32) * 5/9
print("=== Temperature Converter ===")
print("1. Celsius to Fahrenheit")
print("2. Fahrenheit to Celsius")
choice = input("Choose (1/2): ")
temp = float(input("Enter temperature: "))
if choice == '1':
result = celsius_to_fahrenheit(temp)
print(f"{temp}°C = {result:.1f}°F")
elif choice == '2':
result = fahrenheit_to_celsius(temp)
print(f"{temp}°F = {result:.1f}°C")
else:
print("Invalid choice!")四、本章小结
第2章介绍了Python的变量和基本数据类型:
变量:Python的变量是对象的引用,动态类型,不需要声明。
字符串:不可变的Unicode序列,提供了丰富的操作方法。f-string是最佳的格式化方式。
数字:整数无大小限制,浮点数有精度问题(可用Decimal解决)。
类型转换:int()、float()、str()、bool()用于显式类型转换。
注释:使用 # 进行单行注释,使用 """ 进行多行注释。
五、思考与练习
思考题
Python的变量是"标签"还是"盒子"?这和C/Java有什么本质区别?
为什么Python的字符串是不可变的?这种设计有什么好处?
为什么 0.1 + 0.2 != 0.3?这是Python的bug吗?
f-string相比format()和%格式化有什么优势?
int("3.14") 会怎样?为什么?
编程练习
编写程序,让用户输入圆的半径,计算并输出圆的面积和周长。
编写程序,将用户输入的秒数转换为"X天X小时X分钟X秒"的格式。
编写程序,实现简单的文本加密(如凯撒密码)。