2Python编程:从入门到实践(第3版)

变量和简单数据类型

数据的表示

变量字符串数字注释

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第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指向这个对象。

python
x = 42        # x指向整数对象42
y = x         # y也指向同一个对象
x = 100       # x现在指向新的对象100,y仍然指向42
print(y)      # 42

2.1.2 命名规则

  • 只能包含字母、数字和下划线
  • 不能以数字开头
  • 不能使用Python关键字(如if、for、class等)
  • 推荐使用snake_case命名风格
python
# 合法的变量名
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 字符串创建

python
# 单引号和双引号
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 字符串操作

python
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 字符串格式化

python
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有溢出问题):

python
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 255

2.3.2 浮点数

python
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'))  # True

2.3.3 数字运算

python
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))    # 4

2.4 类型转换

python
# 字符串转数字
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))    # False

2.5 注释

python
# 这是单行注释

"""
这是多行注释
(实际上是字符串字面量)
可以跨越多行
"""

x = 42  # 行尾注释

# TODO: 这是一个待办事项
# FIXME: 这里有一个bug
# NOTE: 这是一个重要说明

三、实战案例

3.1 个人信息卡

python
# 收集并格式化个人信息
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 简单的文本处理

python
# 文本统计工具
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 温度转换器

python
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秒"的格式。

编写程序,实现简单的文本加密(如凯撒密码)。


2/11变量和简
0%