002-基础语法与代码规范

🟢 难度: 初级 | ⏱️ 预计时间: 3小时 | 📋 前置: 001-Python简介与环境搭建

学习目标

完成本章节后,你将能够:

  • 掌握Python的基础语法规则
  • 理解Python的缩进机制和代码块结构
  • 学会使用注释和文档字符串
  • 遵循PEP 8代码风格规范
  • 理解Python的标识符命名规则
  • 掌握基本的输入输出操作

Python语法基础

语法特点概览

mindmap
  root((Python语法特点))
    缩进敏感
      使用空格或Tab
      表示代码块
      强制规范格式
    大小写敏感
      变量名区分大小写
      关键字固定
      函数名敏感
    动态类型
      运行时确定类型
      无需声明变量类型
      灵活赋值
    交互式
      即时执行
      REPL环境
      快速测试

基本语法规则

语法规则 说明 示例
缩进 使用4个空格表示代码块 if True:
print("Hello")
语句结束 不需要分号,换行即结束 x = 10
y = 20
续行 使用反斜杠或括号 total = a + \
b + c
注释 使用#号开始单行注释 # 这是注释
编码 文件开头声明编码格式 # -*- coding: utf-8 -*-

缩进与代码块

缩进规则

Python使用缩进来表示代码块,这是Python语法的核心特性:

# 正确的缩进示例
if True:
    print("这是if代码块")  # 缩进4个空格
    if True:
        print("这是嵌套的if代码块")  # 缩进8个空格
    print("回到第一层if代码块")
print("这是主程序代码")

# 函数定义中的缩进
def my_function():
    """函数文档字符串"""
    x = 10  # 函数体缩进4个空格
    y = 20
    return x + y

# 类定义中的缩进
class MyClass:
    """类文档字符串"""
    
    def __init__(self):
        self.value = 0  # 方法体缩进8个空格
    
    def method(self):
        return self.value

缩进最佳实践

# ✅ 推荐:使用4个空格
if condition:
    do_something()
    do_another_thing()

# ❌ 不推荐:使用Tab键
if condition:
	do_something()  # Tab缩进

# ❌ 错误:混合使用空格和Tab
if condition:
    do_something()  # 4个空格
	do_another()    # Tab键

# ❌ 错误:缩进不一致
if condition:
    do_something()  # 4个空格
  do_another()      # 2个空格

代码块结构

主程序
if语句
函数定义
类定义
条件代码块
嵌套if
else代码块
函数体
局部变量
返回语句
类体
属性定义
方法定义

标识符与关键字

标识符命名规则

# 标识符命名规则示例

# ✅ 合法的标识符
variable_name = "变量"      # 下划线分隔
functionName = "函数"       # 驼峰命名
_private_var = "私有变量"   # 下划线开头
CLASS_CONSTANT = "常量"     # 全大写
my_list2 = [1, 2, 3]       # 包含数字

# ❌ 非法的标识符
# 2variable = "错误"        # 不能以数字开头
# my-variable = "错误"      # 不能包含连字符
# class = "错误"            # 不能使用关键字
# my variable = "错误"      # 不能包含空格

Python关键字

# 查看Python关键字
import keyword

print("Python关键字列表:")
for i, kw in enumerate(keyword.kwlist, 1):
    print(f"{i:2d}. {kw:<10}", end="")
    if i % 4 == 0:  # 每行显示4个
        print()
print()

print(f"\n总共有 {len(keyword.kwlist)} 个关键字")
print(f"是否为关键字测试: 'if' -> {keyword.iskeyword('if')}")
print(f"是否为关键字测试: 'variable' -> {keyword.iskeyword('variable')}")

命名约定

类型 命名约定 示例
变量 小写字母,下划线分隔 user_name, total_count
函数 小写字母,下划线分隔 get_user_info(), calculate_total()
首字母大写,驼峰命名 UserAccount, DatabaseManager
常量 全大写,下划线分隔 MAX_SIZE, DEFAULT_TIMEOUT
私有属性 单下划线开头 _internal_value
特殊方法 双下划线包围 __init__, __str__
模块 小写字母,下划线分隔 user_utils.py, data_processor.py

注释与文档

单行注释

# 这是单行注释
print("Hello, World!")  # 行尾注释

# 多行注释可以使用多个#号
# 第一行注释
# 第二行注释
# 第三行注释

# TODO: 待实现的功能
# FIXME: 需要修复的问题
# NOTE: 重要说明
# WARNING: 警告信息

多行注释与文档字符串

"""
这是多行注释,使用三重引号
可以跨越多行
通常用于模块、类、函数的文档说明
"""

def calculate_area(length, width):
    """
    计算矩形面积
    
    Args:
        length (float): 矩形长度
        width (float): 矩形宽度
    
    Returns:
        float: 矩形面积
    
    Raises:
        ValueError: 当长度或宽度为负数时
    
    Examples:
        >>> calculate_area(5, 3)
        15.0
        >>> calculate_area(2.5, 4.0)
        10.0
    """
    if length < 0 or width < 0:
        raise ValueError("长度和宽度必须为正数")
    
    return length * width

class Rectangle:
    """
    矩形类
    
    这个类用于表示矩形对象,提供计算面积和周长的方法。
    
    Attributes:
        length (float): 矩形长度
        width (float): 矩形宽度
    """
    
    def __init__(self, length, width):
        """初始化矩形对象"""
        self.length = length
        self.width = width

文档字符串格式

# Google风格文档字符串
def google_style_function(param1, param2):
    """函数简短描述
    
    详细描述函数的功能和用法。
    
    Args:
        param1 (int): 第一个参数的描述
        param2 (str): 第二个参数的描述
    
    Returns:
        bool: 返回值的描述
    
    Raises:
        ValueError: 异常情况的描述
    """
    pass

# NumPy风格文档字符串
def numpy_style_function(param1, param2):
    """函数简短描述
    
    详细描述函数的功能和用法。
    
    Parameters
    ----------
    param1 : int
        第一个参数的描述
    param2 : str
        第二个参数的描述
    
    Returns
    -------
    bool
        返回值的描述
    
    Raises
    ------
    ValueError
        异常情况的描述
    """
    pass

# Sphinx风格文档字符串
def sphinx_style_function(param1, param2):
    """函数简短描述
    
    详细描述函数的功能和用法。
    
    :param param1: 第一个参数的描述
    :type param1: int
    :param param2: 第二个参数的描述
    :type param2: str
    :returns: 返回值的描述
    :rtype: bool
    :raises ValueError: 异常情况的描述
    """
    pass

PEP 8代码风格规范

代码布局

# ✅ 正确的代码布局

# 导入语句
import os
import sys
from collections import defaultdict

# 全局常量
MAX_CONNECTIONS = 100
DEFAULT_TIMEOUT = 30

# 类定义
class DatabaseManager:
    """数据库管理器类"""
    
    def __init__(self, host, port):
        self.host = host
        self.port = port
    
    def connect(self):
        """建立数据库连接"""
        pass

# 函数定义
def process_data(data_list):
    """处理数据列表"""
    result = []
    for item in data_list:
        if item is not None:
            result.append(item.strip())
    return result

# 主程序
if __name__ == "__main__":
    manager = DatabaseManager("localhost", 5432)
    manager.connect()

行长度和换行

# ✅ 推荐:每行不超过79个字符

# 长函数调用的换行
result = some_function_with_long_name(
    argument_one,
    argument_two,
    argument_three,
    argument_four
)

# 长字符串的换行
message = (
    "这是一个很长的字符串,"
    "需要分成多行来提高可读性,"
    "每行不超过79个字符。"
)

# 长列表的换行
long_list = [
    'item_one',
    'item_two',
    'item_three',
    'item_four',
]

# 长字典的换行
config = {
    'database_host': 'localhost',
    'database_port': 5432,
    'database_name': 'myapp',
    'connection_timeout': 30,
}

空行规范

# ✅ 正确的空行使用

import os
import sys
# 导入语句后空两行


class MyClass:
    """类定义前后空两行"""
    
    def __init__(self):
        """方法之间空一行"""
        self.value = 0
    
    def method_one(self):
        """第一个方法"""
        return self.value
    
    def method_two(self):
        """第二个方法"""
        return self.value * 2


def function_one():
    """顶级函数前后空两行"""
    pass


def function_two():
    """函数之间空两行"""
    # 函数内部逻辑分组可以用空行
    data = get_data()
    
    processed_data = process(data)
    
    return processed_data

空格使用规范

# ✅ 正确的空格使用

# 运算符周围的空格
x = 1
y = 2
z = x + y
result = (x + y) * (x - y)

# 函数调用
function_call(arg1, arg2, arg3)

# 列表索引和切片
my_list[0]
my_list[1:5]
my_dict['key']

# 关键字参数
function_call(arg1=value1, arg2=value2)

# 类型注解
def function(param: int) -> str:
    return str(param)

# ❌ 错误的空格使用
# x=1                    # 赋值运算符周围缺少空格
# function_call( arg1 )  # 括号内多余空格
# my_list [0]            # 索引前多余空格
# function_call(arg1= value1)  # 等号周围空格不一致

输入输出操作

基本输出

# 基本print函数使用
print("Hello, World!")  # 输出字符串
print(42)               # 输出数字
print(True)             # 输出布尔值

# 输出多个值
name = "张三"
age = 25
print("姓名:", name, "年龄:", age)

# 自定义分隔符和结束符
print("A", "B", "C", sep="-")        # 输出: A-B-C
print("Hello", end=" ")              # 不换行
print("World")                       # 输出: Hello World

# 格式化输出
print(f"姓名: {name}, 年龄: {age}")   # f-string格式化
print("姓名: {}, 年龄: {}".format(name, age))  # format方法
print("姓名: %s, 年龄: %d" % (name, age))      # %格式化

基本输入

# 基本input函数使用
name = input("请输入您的姓名: ")
print(f"您好, {name}!")

# 输入数字(需要类型转换)
age_str = input("请输入您的年龄: ")
age = int(age_str)  # 转换为整数
print(f"您的年龄是: {age}")

# 简化写法
age = int(input("请输入您的年龄: "))

# 输入浮点数
height = float(input("请输入您的身高(米): "))
print(f"您的身高是: {height:.2f}米")

# 输入多个值
data = input("请输入三个数字,用空格分隔: ")
numbers = [int(x) for x in data.split()]
print(f"您输入的数字是: {numbers}")

高级输入输出

# 安全的输入处理
def safe_input_int(prompt, min_value=None, max_value=None):
    """安全的整数输入函数"""
    while True:
        try:
            value = int(input(prompt))
            if min_value is not None and value < min_value:
                print(f"输入值不能小于 {min_value}")
                continue
            if max_value is not None and value > max_value:
                print(f"输入值不能大于 {max_value}")
                continue
            return value
        except ValueError:
            print("请输入有效的整数")

# 使用示例
age = safe_input_int("请输入年龄 (0-150): ", 0, 150)
print(f"您的年龄是: {age}")

# 格式化输出表格
def print_table(data):
    """打印格式化表格"""
    headers = ["姓名", "年龄", "城市"]
    
    # 打印表头
    print(f"{headers[0]:<10} {headers[1]:<5} {headers[2]:<10}")
    print("-" * 30)
    
    # 打印数据行
    for row in data:
        print(f"{row[0]:<10} {row[1]:<5} {row[2]:<10}")

# 示例数据
people = [
    ["张三", 25, "北京"],
    ["李四", 30, "上海"],
    ["王五", 28, "广州"]
]

print_table(people)

代码风格检查工具

使用pylint

# 安装pylint
pip install pylint

# 检查单个文件
pylint my_script.py

# 检查整个包
pylint my_package/

# 生成配置文件
pylint --generate-rcfile > .pylintrc

使用black代码格式化

# 安装black
pip install black

# 格式化单个文件
black my_script.py

# 格式化整个目录
black my_project/

# 检查但不修改
black --check my_script.py

# 显示差异
black --diff my_script.py

使用flake8检查

# 安装flake8
pip install flake8

# 检查代码
flake8 my_script.py

# 配置文件 .flake8
[flake8]
max-line-length = 88
ignore = E203, W503
exclude = .git,__pycache__,docs/source/conf.py,old,build,dist

实践练习

练习1:代码风格修正

修正以下代码的风格问题:

# 需要修正的代码
import sys,os
from collections import*

class myclass:
 def __init__( self,name,age ):
  self.Name=name
  self.Age=age
 def getinfo(self):
    return"Name: "+self.Name+", Age: "+str(self.Age)

def calculate(x,y):
 result=x+y
 return result

if __name__=="__main__":
 obj=myclass("张三",25)
 print(obj.getinfo())
 result=calculate(10,20)
 print("Result:",result)

修正后的代码:

# 修正后的代码
import os
import sys
from collections import defaultdict


class MyClass:
    """示例类"""
    
    def __init__(self, name, age):
        """初始化方法"""
        self.name = name
        self.age = age
    
    def get_info(self):
        """获取信息"""
        return f"Name: {self.name}, Age: {self.age}"


def calculate(x, y):
    """计算两数之和"""
    result = x + y
    return result


if __name__ == "__main__":
    obj = MyClass("张三", 25)
    print(obj.get_info())
    
    result = calculate(10, 20)
    print(f"Result: {result}")

练习2:文档字符串编写

为以下函数添加完整的文档字符串:

def fibonacci(n):
    """计算斐波那契数列的第n项
    
    斐波那契数列是一个数学序列,其中每个数字是前两个数字的和。
    序列开始为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
    
    Args:
        n (int): 要计算的斐波那契数列项数,必须为非负整数
    
    Returns:
        int: 斐波那契数列的第n项
    
    Raises:
        ValueError: 当n为负数时抛出异常
        TypeError: 当n不是整数时抛出异常
    
    Examples:
        >>> fibonacci(0)
        0
        >>> fibonacci(1)
        1
        >>> fibonacci(10)
        55
    
    Note:
        此实现使用递归方法,对于大的n值可能会很慢。
        在生产环境中建议使用迭代或动态规划方法。
    """
    if not isinstance(n, int):
        raise TypeError("n必须是整数")
    
    if n < 0:
        raise ValueError("n必须是非负整数")
    
    if n <= 1:
        return n
    
    return fibonacci(n - 1) + fibonacci(n - 2)

练习3:输入验证程序

def user_registration():
    """用户注册程序,演示输入验证"""
    print("=== 用户注册系统 ===")
    
    # 用户名验证
    while True:
        username = input("请输入用户名 (3-20个字符): ").strip()
        if 3 <= len(username) <= 20 and username.isalnum():
            break
        print("❌ 用户名必须是3-20个字母或数字")
    
    # 年龄验证
    while True:
        try:
            age = int(input("请输入年龄 (18-100): "))
            if 18 <= age <= 100:
                break
            print("❌ 年龄必须在18-100之间")
        except ValueError:
            print("❌ 请输入有效的数字")
    
    # 邮箱验证(简单版本)
    while True:
        email = input("请输入邮箱地址: ").strip()
        if "@" in email and "." in email.split("@")[-1]:
            break
        print("❌ 请输入有效的邮箱地址")
    
    # 显示注册信息
    print("\n✅ 注册成功!")
    print(f"用户名: {username}")
    print(f"年龄: {age}")
    print(f"邮箱: {email}")
    
    return {
        "username": username,
        "age": age,
        "email": email
    }

if __name__ == "__main__":
    user_info = user_registration()
    print(f"\n注册的用户信息: {user_info}")

常见错误与解决方案

缩进错误

# ❌ 常见缩进错误
# IndentationError: expected an indented block
if True:
print("Hello")  # 缺少缩进

# IndentationError: unindent does not match any outer indentation level
if True:
    print("Hello")
  print("World")  # 缩进不一致

# ✅ 正确的缩进
if True:
    print("Hello")
    print("World")

语法错误

# ❌ 常见语法错误
# SyntaxError: invalid syntax
# if True  # 缺少冒号
#     print("Hello")

# SyntaxError: EOL while scanning string literal
# message = "Hello World  # 字符串未闭合

# ✅ 正确的语法
if True:
    print("Hello")

message = "Hello World"

命名错误

# ❌ 不规范的命名
# myVariable = 10      # 驼峰命名不符合Python规范
# my-variable = 10     # 连字符不合法
# 2variable = 10       # 数字开头不合法
# class = 10           # 使用关键字

# ✅ 规范的命名
my_variable = 10       # 下划线分隔
user_count = 100       # 描述性命名
MAX_SIZE = 1000        # 常量全大写

总结

本章节我们学习了:

核心知识点

  • ✅ Python基础语法规则和特点
  • ✅ 缩进机制和代码块结构
  • ✅ 标识符命名规则和约定
  • ✅ 注释和文档字符串的编写
  • ✅ PEP 8代码风格规范
  • ✅ 基本的输入输出操作
  • ✅ 代码质量检查工具的使用

技能掌握

  • 🎯 能够编写符合PEP 8规范的Python代码
  • 🎯 熟练使用缩进表示代码块结构
  • 🎯 掌握标识符的正确命名方法
  • 🎯 能够编写清晰的注释和文档字符串
  • 🎯 具备基本的代码风格检查能力

最佳实践

  • 💡 始终使用4个空格进行缩进
  • 💡 遵循PEP 8代码风格规范
  • 💡 为函数和类编写清晰的文档字符串
  • 💡 使用描述性的变量和函数名
  • 💡 定期使用代码质量检查工具
  • 💡 保持代码简洁和可读性

下一步

掌握了基础语法和代码规范后,我们将在下一章节学习:

  • Python的数据类型系统
  • 变量的定义和使用
  • 类型转换和类型检查
  • 变量作用域和生命周期

继续学习:003-变量与数据类型


📚 扩展阅读:

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐