002-基础语法与代码规范
完成本章节后,你将能够:基本语法规则语法规则说明示例缩进使用4个空格表示代码块语句结束不需要分号,换行即结束续行使用反斜杠或括号注释使用#号开始单行注释编码文件开头声明编码格式缩进与代码块缩进规则Python使用缩进来表示代码块,这是Python语法的核心特性:缩进最佳实践代码块结构#mermaid-svg-OPcJgzC5UkNLOwM8 {font-family:"trebuchet ms",
·
002-基础语法与代码规范
🟢 难度: 初级 | ⏱️ 预计时间: 3小时 | 📋 前置: 001-Python简介与环境搭建
学习目标
完成本章节后,你将能够:
- 掌握Python的基础语法规则
- 理解Python的缩进机制和代码块结构
- 学会使用注释和文档字符串
- 遵循PEP 8代码风格规范
- 理解Python的标识符命名规则
- 掌握基本的输入输出操作
Python语法基础
语法特点概览
mindmap
root((Python语法特点))
缩进敏感
使用空格或Tab
表示代码块
强制规范格式
大小写敏感
变量名区分大小写
关键字固定
函数名敏感
动态类型
运行时确定类型
无需声明变量类型
灵活赋值
交互式
即时执行
REPL环境
快速测试
基本语法规则
| 语法规则 | 说明 | 示例 |
|---|---|---|
| 缩进 | 使用4个空格表示代码块 | if True: print("Hello") |
| 语句结束 | 不需要分号,换行即结束 | x = 10y = 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个空格
代码块结构
标识符与关键字
标识符命名规则
# 标识符命名规则示例
# ✅ 合法的标识符
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-变量与数据类型
📚 扩展阅读:
更多推荐


所有评论(0)