变量

变量就是 存储数据的容器,用一个名字指向一块内存中的值。
在 Python 中,变量本质上是 对象的引用。

变量命名规则:

  • 只能包含 字母、数字、下划线, 不能以数字开头
  • 不能是 关键字
  • 区分大小写

推荐命名规范(PEP8):

  • snake_case(变量名小写,单词之间用下划线隔开) 用于 变量、函数、方法、模块
  • PascalCase 专门用于 类名

示例:

标识符类型示例
变量名user_name, is_valid
函数名calculate_total(), get_user_data()
方法名class_instance.update_status()
模块名my_module.py, data_processor.py
包名package_name
类名HttpRequest, User

常用的内置数据类型

Python 中 常用的内置数据类型:

数据类型中文名示例
int整型10
float浮点型3.14
bool布尔型True
str字符串“hello word”
NoneType空类型None
list列表[1, 2, 3]
tuple元组(1, 2, 3)
set集合{1, 2, 3}
dict字典{“key”: “value”}

Python 是 动态类型语言,不需要显式声明变量类型,解释器会根据赋值自动推断类型。
示例:

a = 1
print(type(a))
# <class 'int'>

a = 1.2 
print(type(a))
# <class 'float'>

a = "hello world"
print(type(a))
# <class 'str'>

a = True
print(type(a))
# <class 'bool'>

a = None
print(type(a))
# <class 'NoneType'>

a = [1, 2, 3, 4, 5]
print(type(a))
# <class 'list'>

a = (1, 2, 3, 4, 5)
print(type(a))
# <class 'tuple'>

a = {"name": "cx", "age": 18}
print(type(a))
# <class 'dict'>

变量赋值:

# 多变量同时赋值
a, b, c = 1, 2, 3
print(a, b, c)  # 1 2 3


# 多个变量指向同一对象
x = y = z = 100
print(x, y, z)  # 100 100 100

数字类型

整数(int)可以表示任意大小的数,精度无限制。
常用操作:

x = 10
y = 3
print(x + y)   # 13
print(x - y)   # 7
print(x * y)   # 30
print(x / y)   # 3.333...
print(x // y)  # 3 (整除)
print(x % y)   # 1 (取余)
print(x ** y)  # 1000 (幂运算)

浮点数(float)用来表示小数,有精度限制(IEEE 754 标准)。
浮点数精度问题:

print(0.1 + 0.2)  # 0.30000000000000004

解决办法:

from decimal import Decimal
print(Decimal('0.1') + Decimal('0.2'))  # 0.3

布尔类型(bool)

布尔值只有两个:

is_active = True
is_deleted = False

常见用法:

print(10 > 5)   # True
print(bool(0))  # False
print(bool("")) # False

字符串(str)

字符串是 不可变对象(immutable),用引号包裹:

# 单引号
name = 'Python'
# 双引号
msg = "Hello World"

# 三引号 (多行字符串)
str3 = '''This is
a multi-line
string'''

# 转义字符
s = 'I\'m learning Python'

常用操作:

text = "hello python"
print(text.upper())       # HELLO PYTHON
print(len(text))          # 12

# 去掉前后空格或指定字符
a = "  hello  ".strip() 
print(a)  # 'hello'

查找与判断:

# 返回子串索引,不存在返回 -1
a = "python".find("tho") 
print(a)  # 2

# 子串出现次数
a = "banana".count("a") 
print(a) # 3

# 是否以 prefix 开头
a = "python".startswith("py") 
print(a) # True

# 是否以 suffix 结尾
a = "python".endswith("on")
print(a) # True

# 判断字符串是否包含子串
s = "hello world"
print("world" in s)   # True
print("python" not in s)  # True

分割与拼接:

str1 = "Hello"
str2 = "World"
result = str1 + " " + str2
print(result) # Hello World

# 效率比 + 拼接更高
result = f"{str1} {str2}"  # 支持直接在 {} 中写表达式
print(result) # Hello World

# 序列拼接成字符串
a = ",".join(['a','b','c'])
print(a) #  'a,b,c'

# 按 分隔符 拆分成列表
text = "hello python"
print(text.split())  # ['hello', 'python']

替换:

text = "hello python"
print(text.replace("python", "world"))  # hello world

格式化字符串:

name = "Tom"
age = 20
print(f"My name is {name}, I am {age} years old.")

a = 10
b = 20
print(f"a + b = {a + b}")  # a + b = 30

字符串是 有序序列,可以通过 索引和切片 操作访问.
索引:

s = "Python"
#    位置: P  y  t  h  o  n
# 正向索引: 0  1  2  3  4  5
# 反向索引: -6 -5 -4 -3 -2 -1
print(s[0])   # P
print(s[-1])  # n

切片:

# 字符串[start:end:step]
# start 包含, end 不包含

s = "Python"
print(s[0:3])   # Pyt
print(s[:4])    # Pyth
print(s[2:])    # thon
print(s[::2])   # Pto
print(s[::-1])  # nohtyP (反转字符串)

列表(list)

有序、可变、可存放任意类型:

fruits = ["apple", "banana", "cherry"]

常用操作:

fruits.append("orange")  # 添加元素
fruits.remove("banana")  # 删除指定元素
print(fruits[0])         # 访问第一个元素
print(fruits[-1])        # 访问最后一个元素

元组 (tuple)

有序、不可变:

t = (1, 2, 3)
print(t[0])  # 1

集合 (set)

无序、不重复:

s = {1, 2, 3, 3}
print(s)  # {1, 2, 3}

集合运算:

a = {1, 2, 3}
b = {3, 4, 5}
print(a | b)  # 并集 {1,2,3,4,5}
print(a & b)  # 交集 {3}
print(a - b)  # 差集 {1,2}

字典 (dict)

键值对结构,无序:

person = {"name": "Tom", "age": 20}
print(person["name"])  # Tom

常用操作:

person["age"] = 21
person["city"] = "Shanghai"
print(person.get("country", "China"))  # 默认值 China

类型转换

显式转换:

x = "123"
print(int(x))    # 123
print(float(x))  # 123.0
print(str(123))  # '123'

隐式转换:

x = 10
y = 3.5
print(x + y)  # 13.5 (自动转为 float)

变量的作用域

Python 作用域遵循 LEGB 原则:

  • Local: 函数内部变量
  • Enclosing: 外层嵌套函数变量
  • Global: 全局变量
  • Builtin: 内置变量 (如 len, print)

像洋葱一样,从最内层开始,一层层向外寻找:

Local -> Enclosing -> Global -> Built-in

一旦在某一层找到该名称,搜索就会停止。如果搜索完所有四层都没有找到,Python 就会抛出一个 NameError 异常。

示例:

x = 10  # 全局变量

def outer():
    x = 20
    def inner():
        x = 30
        print(x)
    inner()

outer()  # 输出 30

LEGB 原则默认是只读的搜索顺序。
如果你想修改外层作用域的变量,就需要使用特定的关键字。

global 用于声明并修改 全局作用域 的变量:

count = 0  # 全局变量

def increment():
    global count  # 声明我们要修改的是全局的 count
    count += 1    # 如果没有上一行的声明,这里会报错(UnboundLocalError)

increment()
print(count)  # 输出:1

nonlocal 用于声明并修改 嵌套作用域 的变量:

def outer():
    x = "old value"

    def inner():
        nonlocal x  # 声明我们要修改的是外层(Enclosing)的 x,而不是创建一个新的局部 x
        x = "new value"

    inner()
    print(x)  # 输出:new value

outer()

流程控制

Python 通过 缩进 表示代码块,推荐 4 个空格。
以冒号 : 开始一个代码块,例如 if ...:for ...:

条件判断

score = 86
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
else:
    grade = "C"

条件判断中, 以下被视为 False:
0, 0.0, 0j, '' , [], {}, set(), None, False
其余对象一般为 True

标准比较: ==, !=, <, <=, >, >=
链式比较:

x = 5
print(1 < x < 10)   # 相当于 1 < x and x < 10

逻辑运算与短路:

name = ""

# and, or, not 支持短路求值
user = name or "anonymous"   # name 为空串为假, 取右值

if user and user.startswith("a"):   # 左侧为假时 不再调用右侧; 左侧为真时 会调用右侧
    pass

条件表达式 (三元表达式):

status = "adult" if age >= 18 else "minor"

结构化模式匹配 match-case (Python 3.10+):

# 对复杂条件更优雅, 支持常量、序列、映射、类匹配与守卫条件
def http_status(code: int) -> str:
    match code:
        case 200 | 201:  # 匹配 200 或 201
            return "OK"
        case 400:
            return "Bad Request"
        case 404:
            return "Not Found"
        case 5xx if 500 <= code < 600:   # 守卫条件
            return "Server Error"
        case _:   # `_` 是通配符,总会被匹配,必须放在最后
            return "Unknown"

守卫条件:使用 if 进行细化匹配。
即使 模式匹配了,你还可以使用 if 关键字添加一个额外的条件,称为守卫。
只有当模式和守卫条件都满足时,case 才会被执行。

循环

for 循环: 遍历任意可迭代对象

for ch in "python":
    print(ch)

常用工具:

# range(start, stop, step):
for i in range(1, 6):  # 1..5
    print(i)

# enumerate(iterable, start=0):
for idx, line in enumerate(lines, start=1):
    print(idx, line)

# zip(*iterables):
names = ["A", "B"]; scores = [90, 85]
for n, s in zip(names, scores):
    print(n, s)

enumerate() 函数 用于将一个可迭代对象(如列表、元组、字符串)同时列出 元素的下标(索引)和 元素 。
zip() 函数 用于将多个可迭代对象中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代器。

函数中的流程控制:

# return 提前返回
def safe_div(a, b):
    if b == 0:
        return None
    return a / b

# yield 与协程风格
def fib(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

# raise 抛出异常
def read_config(path):
    if not path.endswith(".json"):
        raise ValueError("config must be a .json file")

异常控制流:

try:
    data = load()
except FileNotFoundError as e:
    log(e)
    data = {}
except (ValueError, TypeError):
    recover()
else:
    # try 块未抛异常才会执行
    validate(data)
finally:
    # 无论是否异常都执行
    cleanup()

while 循环: 条件驱动

n = 5
while n > 0:
    print(n)
    n -= 1

# while True + break 形成事件循环
while True:
    line = input().strip()
    if not line:
        break
    process(line)

break: 立即跳出当前循环。
continue: 跳过本次迭代进入下次。
pass: 占位, 不做任何事。

循环的 else 子句:

def contains_prime(nums):
    for n in nums:
        if n > 1 and all(n % d for d in range(2, int(n**0.5)+1)):
            print("found prime:", n)
            break
    else:
        print("no prime found")

列表/集合/字典推导式:

# 列表: 平方且仅保留偶数
squares = [x*x for x in range(10) if x % 2 == 0]

# 集合: 去重后的首字母
first_letters = {w[0].lower() for w in ["Apple", "Banana", "Avocado"]}

# 字典: 键值对转换
mapping = {k: len(k) for k in ["python", "java", "go"]}

使用 any/all 简化嵌套判断:

if all(ch.isdigit() for ch in token) and any(ch != '0' for ch in token):
    ...

函数(Function)

函数(Function) 是一段可以被重复调用的代码块, 用于完成特定的任务, 可以接收输入(参数), 并返回输出(返回值)。

使用 def 关键字定义函数:

def 函数名(参数列表):
    """可选: 文档字符串,用于描述函数"""
    函数体
    return 返回值  # 可选

示例:

def greet():
    print("Hello, Python!")
    
greet()  # 调用函数

函数参数

位置参数 (Positional Arguments): 按照定义顺序传入值。

def greet(name, age):
    print(f"Hi {name}, you are {age} years old.")

greet("Tom", 18)

默认参数 (Default Arguments): 为参数设置默认值, 调用时可以省略。

def greet(name="Guest"):
    print(f"Welcome, {name}!")

greet()        # 默认参数
greet("Alice") # 传入新值

注意: 默认参数 必须 放在普通参数的 后面

关键字参数 (Keyword Arguments): 通过 参数名=值 的方式传递, 不受顺序限制。

def greet(name, age):
    print(f"{name} is {age} years old.")

greet(age=20, name="Bob")

可变参数 *args: 接收任意数量的位置参数

def add(*args):
    print(args)
    return sum(args)

print(add(1, 2, 3, 4))

可变参数 **kwargs: 接收任意数量的关键字参数

def show_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

show_info(name="Alice", age=22, city="Tokyo")

参数定义顺序建议:

位置参数 -> 默认参数 -> *args -> **kwargs

示例:

def func(a, b=2, *args, **kwargs):
    print(a, b, args, kwargs)

func(1, 3, 4, 5, name="Tom", age=18)

函数返回值

使用 return 返回结果, 如果没有写 return, 默认返回 None。

def add(a, b):
    return a + b

result = add(5, 7)
print(result)  # 12

返回多个值(其实是返回一个元组):

def calc(a, b):
    return a+b, a-b, a*b, a/b

print(calc(6, 3))

变量作用域

局部变量 (Local Variable): 定义在函数内部, 只能在函数内部访问。

def test():
    x = 10
    print(x)

test()
# print(x)  # 报错: NameError

全局变量 (Global Variable): 定义在函数外部, 可以在函数内部访问。如果需要在函数内部修改全局变量, 使用 global

x = 100

def test():
    print(x)

test()


def change():
    global x
    x = 200

change()
print(x)  # 200

匿名函数 (lambda)

lambda 用于定义简洁的 匿名函数, 适合简单逻辑。
语法:

lambda 参数: 表达式

示例:

add = lambda x, y: x + y

print(add(3, 5))  # 8

结合 map, filter, sorted 等函数使用:

nums = [1, 2, 3, 4, 5]

squares = list(map(lambda x: x**2, nums))

print(squares)  # [1, 4, 9, 16, 25]

高阶函数

Python 函数是 一等公民, 可以作为参数传递或返回值。

def apply(func, value):
    return func(value)

print(apply(abs, -10))  # 10

函数的进阶用法

嵌套函数:

def outer():
    def inner():
        print("Inner function")
    inner()

outer()

闭包 (Closure): 函数中返回另一个函数, 并捕获外部变量。

def outer(x):
    def inner(y):
        return x + y
    return inner

add5 = outer(5)
print(add5(10))  # 15

装饰器 (Decorator): 用于增强函数功能。

def decorator(func):
    def wrapper():
        print("Before")
        func()
        print("After")
    return wrapper

@decorator
def say_hello():
    print("Hello!")

say_hello()

内置函数

map() 内置函数,用于对可迭代对象(如列表、元组等)中的每个元素应用一个指定的函数,并返回 一个包含所有结果的新迭代器

# map(function, iterable, ...)

numbers = [1, 2, 3, 4, 5]

# 使用 lambda 函数
squared = map(lambda x: x**2, numbers)
print(list(squared))  # 输出: [1, 4, 9, 16, 25]

# 等价于列表推导式
squared = [x**2 for x in numbers]
print(squared)  # 输出: [1, 4, 9, 16, 25]


words = ['hello', 'world', 'python']

upper_words = map(str.upper, words)
print(list(upper_words))  # 输出: ['HELLO', 'WORLD', 'PYTHON']

对多个可迭代对象操作:

list1 = [1, 2, 3]
list2 = [4, 5, 6]

# 两个列表对应元素相加
result = map(lambda x, y: x + y, list1, list2)
print(list(result))  # 输出: [5, 7, 9]

sorted() 内置函数用于 对 可迭代对象进行排序,并 返回一个新的排序后的列表,不会修改原始对象

sorted(iterable, key=None, reverse=False)

iterable: 要排序的可迭代对象(列表、元组、字符串等)
key: 排序的关键字函数(可选)
reverse: 是否反向排序(可选,默认为 False 即升序)
返回值: 一个新的已排序列表

示例:

numbers = [3, 1, 4, 1, 2]
sorted_numbers = sorted(numbers)

print(sorted_numbers)  # 输出: [1, 1, 2, 3, 4]
print(numbers)         # 输出: [3, 1, 4, 1, 2] (原列表未改变)

filter() 内置函数 用于过滤可迭代对象中的元素,只保留那些使指定函数返回 True 的元素,并返回一个包含这些元素的迭代器

filter(function, iterable)

function: 判断函数,返回 True 或 False。如果为 None,则使用身份函数(过滤掉假值)
iterable: 要过滤的可迭代对象(列表、元组、字符串等)
返回值: 一个 filter 对象(迭代器)

示例:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def is_even(n):
    return n % 2 == 0

even_numbers = filter(is_even, numbers)
print(list(even_numbers))  # 输出: [2, 4, 6, 8, 10]

# 使用 lambda 函数筛选奇数
odd_numbers = filter(lambda x: x % 2 != 0, numbers)
print(list(odd_numbers))  # 输出: [1, 3, 5, 7, 9]