2.编程基础概念
编程基础概念
1 Python 程序的构成

- Python 程序由模块组成。一个模块对应一个 Python 源文件,后缀名一般为
.py。 - 模块由语句组成。运行 Python 程序时,会按模块中语句的顺序依次执行。
- 语句是 Python 程序的构造单元,用于创建对象、变量赋值、调用函数、控制流程等。
2 代码的组织和缩进
很多编程语言用字符(如花括号 {})或关键字(如 begin/end)来划分代码块,再配合缩进提升可读性。而「龟叔」设计 Python 时,直接用缩进来组织代码块,并让缩进成为 Python 语法的强制规定。
缩进时用几个空格都可以,但同一份代码中数目必须统一,通常采用四个空格表示一个缩进层次。
同时要避免把 tab 制表符与空格混用。目前常用编辑器一般把 tab 制表符设为 4 个空格。
Python 官方推荐的代码风格是 PEP 8,有兴趣可参考:https://www.python.org/dev/peps/pep-0008/
3 使用注释
为方便阅读,Python 允许在程序中写下说明性文字来提高可读性,这些文字说明就称为注释。
核心作用:
- 解释代码的功能、思路与复杂逻辑
- 临时屏蔽不需要运行的代码(调试用)
- 提升可读性,方便团队协作
- 便于后期维护,快速回忆代码用途
3.1 单行注释(最常用)
-
语法:
# 注释内容 -
作用:注释一行文字,
#后面的所有内容都会被忽略 -
用法:可以写在代码行末尾,也可以单独占一行
# 这是单独一行的单行注释,解释下面代码的作用 print(10) # Python 里的函数,就是底层「打包好、能重复用的代码」:你给它输入,它帮你干活,最后给你结果 -
注释快捷键:
ctrl+/
3.2 多行注释
- 语法:
''' 多行注释内容 '''或""" 多行注释内容 """ - 作用:一次性注释多行文字,适合写长说明、函数功能、文件头部说明
- 开头三引号必须单独占一行,结尾三引号也必须单独占一行
- 单三引号
'''与双三引号"""完全等价,不要混用 - 适合写长注释;较短的单行说明用
#更简洁 - Python 中其实并没有真正的「多行注释」语法,上面这种方式本质是一个字符串字面量。
'''
这是多行注释
可以写很多行文字
用来解释整个文件、函数或复杂逻辑
'''
"""
这也是多行注释
单三引号和双三引号效果完全一样
任选一种,保持统一即可
"""
# 输出内容
print(100) # 输出:100
3.3 文件编码声明注释(特殊的单行注释)
在文件开头加上中文声明注释,用以指定源码文件的编码格式。
- 格式示例:
# coding:utf-8 - 这个注释在 Python 2 时代是必须写的,但在 Python 3 中通常可以省略。
# coding:utf-8
print("你好,Python")
3.4 文档字符串(Docstring)(特殊的多行注释)
这是 Python 的特色注释,专门给函数、类、模块写说明。Docstring 本质虽是字符串,但 Python 给了它「特权」——把它存进对象的 __doc__ 属性。因此它不只写给人看,也写给机器(如 IDE、文档生成工具)看。(可被调用:Python 解释器会将其保存为对象的 __doc__ 属性,可通过代码读取,或用 help() 函数查看。)
- 语法:定义函数/类后,第一行写
""" 文档说明 """ - 作用:标准化地说明函数功能、参数、返回值、异常
def add(x, y):
"""
两个数字相加(文档字符串,必须写在函数第一行)
参数:
x: 第一个数字(int/float)
y: 第二个数字(int/float)
返回:
两个数的和
"""
return x + y
# 查看文档注释(运行代码可输出)
help(add)
4 使用 \ 行连接符
一行程序的长度本身没有限制,但为了可读性更强,通常会把它拆成多行。这时可以用 \(行连接符),把它放在行尾,Python 解释器仍会将其视为同一行。
>>> a = [10,20,30,40,\
50,60,70,\
80,90,100]
>>> a
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
>>> a = 'abcdefghijklmnopqrstuvwxyz'
>>> b = 'abcdefg\
hijklmn\
opqrst\
uvwxyz'
>>> a
'abcdefghijklmnopqrstuvwxyz'
>>> b
'abcdefghijklmnopqrstuvwxyz'
5 Python 中的格式化输出
5.1 格式化输出
目前为止,我们的输出都是直接通过 print(变量名称) 打印的。但实际工作中,往往需要对输出做格式化处理(按指定格式输出)。
5.2 百分号格式化输出
基本语法:
# 伪代码:演示三种调用形态
print(变量名称)
print('字符串%格式' % (变量名称))
print('字符串%格式 %格式 %格式' % (变量名称1, 变量名称2, 变量名称3))
% 格式常见形式如下:
| 格式符号 | 转换 |
|---|---|
%s |
字符串 |
%d |
有符号的十进制整数 |
%f |
浮点数,默认保留小数点后 6 位 |
%c |
字符 |
%u |
无符号十进制整数 |
%o |
八进制整数 |
%x |
十六进制整数(小写,前缀用 0x) |
%X |
十六进制整数(大写,前缀用 0X) |
%e |
科学计数法(小写 e) |
%E |
科学计数法(大写 E) |
%g |
%f 和 %e 的简写 |
%G |
%f 和 %E 的简写 |
案例:定义两个变量 name='小龙女'、age=18,按如下格式输出:我的名字是小龙女,今年 18 岁了。
name = '小龙女'
age = 18
# 格式化输出:我的名字是小龙女,今年18岁了
print('我的名字是%s,今年%d岁了' % (name, age))

案例:定义两个变量 title = '大白菜'、price = 3.5,按如下格式输出:今天蔬菜特价了,大白菜只要 3.5 元/斤。
title = '大白菜'
price = 3.5
# 格式化输出:今天蔬菜特价了,大白菜只要3.5元/斤
# %f 默认输出 6 位小数(已修正原文的「5 位」)
print('今天蔬菜特价了,%s只要 %f 元/斤' % (title, price))
print('今天蔬菜特价了,%s只要 %.1f 元/斤' % (title, price))

其实除了 %f 可以设置小数位数以外,%d 也可以填充序号。
案例:定义两个变量 id = 1、name = '小龙女',按如下格式输出:姓名:小龙女,学号:000001
id = 1
name = '小龙女'
print("姓名:%s,学号:%d" % (name, id))
print("姓名:%s,学号:%06d" % (name, id))

5.3 format 方法格式化输出
基本语法:
print('字符串{}'.format(变量名称1))
# 字符串有几个大括号,format 中就写几个变量,变量按顺序排布
print('{}字符串{}'.format(变量名称1, 变量名称2))
# 设置指定位置
print('{1}字符串{0}'.format(变量名称1, 变量名称2))
案例:定义两个变量 name = '小龙女'、mobile = '18530908789',按以下格式输出:姓名:小龙女,联系方式:18530908789
name = '小龙女'
mobile = '18530908789'
# 姓名小龙女,电话18530908789
print('姓名{},电话{}'.format(name, mobile))
name = '小龙女'
mobile = '18530908789'
# 姓名小龙女,电话18530908789
print('姓名{1},电话{0}'.format(mobile, name))

5.4 format 方法简写形式格式化输出(推荐)
在 Python 3.6 以后版本,为了简化 format 输出操作,引入了一个简写形式:
name = '小龙女'
mobile = '18530908789'
print(f"姓名:{name},联系方式:{mobile}")

5.5 填充与对齐
填充常与对齐配合使用。
^、<、> 分别表示居中、左对齐、右对齐,其后跟宽度。
: 后面可带填充字符,只能是单个字符;不指定时默认用空格填充。
name = '小龙女'
# 左对齐
print('我叫{:<8}。'.format(name))
print(f'我叫{name:!<8}。')
# 居中对齐
print('我叫{:^8}。'.format(name))
print(f"我叫{name:!^8}。")
# 右对齐
print('我叫{:>8}。'.format(name))
print(f"我叫{name:!>8}。")

5.6 数字格式化
浮点数通过 f,整数通过 d 进行需要的格式化。
name = "小龙女"
price = 3888.234342
age = 18
salary = 18.5
print(f"我是{name},我的存款有{price:.2f}元。")
print(f'我是{name}, 年龄是{age}, 工资是{salary:!>8.2f}k。')

其他格式供参考(下表已逐行实跑验证):
| 数字 | 格式 | 输出 | 描述 |
|---|---|---|---|
| 3.1415926 | {:.2f} |
3.14 |
保留小数点后两位 |
| 3.1415926 | {:+.2f} |
+3.14 |
带符号保留小数点后两位 |
| 2.71828 | {:.0f} |
3 |
不带小数 |
| 5 | {:0>2d} |
05 |
数字补零(填充左边,宽度为 2) |
| 5 | {:x<4d} |
5xxx |
数字补 x(填充右边,宽度为 4) |
| 10 | {:x<4d} |
10xx |
数字补 x(填充右边,宽度为 4) |
| 1000000 | {:,} |
1,000,000 |
以逗号分隔的数字格式 |
| 0.25 | {:.2%} |
25.00% |
百分比格式 |
| 1000000000 | {:.2e} |
1.00e+09 |
指数记法 |
| 13 | {:!>5d} |
!!!13 |
右对齐(宽度为 5) |
| 13 | {:!<5d} |
13!!! |
左对齐(宽度为 5) |
| 13 | {:!^5d} |
!13!! |
中间对齐(宽度为 5) |
5.7 格式化输出中的转义符号
可以用 \ + 特殊字符 实现某些难以直接表示的效果,例如换行。
常见转义字符如下:
| 转义字符 | 描述 |
|---|---|
\(在行尾时) |
续行符 |
\\ |
反斜杠符号 |
\' |
单引号 |
\" |
双引号 |
\b |
退格 (Backspace) |
\n |
换行 |
\t |
横向制表符 |
\r |
回车 |
在字符串中,若出现 \t 和 \n,它们分别代表对应的转义字符。
案例:
print('*\t*\t*')
print('hello\nworld')

案例:
# 不带 end 参数默认输出换行
print('*')
print('*')
# 带 end 参数输出 end 参数中的内容
print('*', end='')
print('*', end='我是第二个print的结尾')

6 Python 中的标准输入
6.1 为什么需要输入
到目前为止,我们的程序都只能把数据输出给用户。但实际工作中,经常需要获取用户的输入信息,例如银行系统中的密码输入、淘宝中的用户登录验证。

6.2 input() 输入方法
在 Python 中,若想让 Python 程序接受用户的输入信息,可以使用 input() 方法。
基本语法:
input()
但单独一个 input() 意义不大,通常还要用一个变量临时接收用户输入,以便后续操作。
变量名称 = input('提示信息:')
案例:银行系统中输入密码的过程:
passwd = input("请输入您的银行卡密码:")
print(f'您输入的银行卡密码为:{passwd}')

6.3 input() 方法重要事项
记住:所有由 input() 方法获取的数据都是字符串类型。
name = input('请输入您的姓名:')
age = input('请输入您的年龄:')
print(f"姓名:{name},类型:{type(name)}") # <class 'str'>
print(f"年龄:{age},类型:{type(age)}") # <class 'str'>

7 对象
Python 中,一切皆对象。
每个对象由三部分组成:标识(identity)、类型(type)、值(value)。
- 标识用于唯一标识对象,通常对应对象在计算机内存中的地址。用内置函数
id(obj)可返回对象obj的标识。 - 类型表示对象所存「数据」的类型,它限制了对象的取值范围以及可执行的操作。可用
type(obj)获得对象的类型。 - 值表示对象中所存储的数据信息,用
print(obj)可直接打印出值。
对象本质上是:一个内存块,拥有特定的值,支持特定类型的相关操作。
>>> a = 3
>>> a
3
>>> id(3)
1531372336
>>> type(3)
<class 'int'>
>>> b = "我爱你"
>>> id(a)
1531372336
>>> type(a)
<class 'int'>
>>> print(a)
3
>>> id(b)
46806816
>>> type(b)
<class 'str'>

8 引用
在 Python 中,变量也叫对象的引用——因为变量存储的是对象的地址,通过地址「引用」了对象。
- 变量位于:栈内存(压栈、出栈等细节后续再讲)。
- 对象位于:堆内存。

Python 是动态类型语言
变量不需要显式声明类型。根据变量引用的对象,Python 解释器自动确定数据类型。
Python 是强类型语言
每个对象都有数据类型,只支持该类型支持的操作。
9 变量
9.1 什么是变量
什么是「量」:量是程序中的最小单元。
那什么是变量呢?
变量用来记录程序中的数据。它本质上代表一个「可操作的存储空间」——空间位置是确定的,但里面放什么值并不确定。我们通过变量名访问「对应的存储空间」,从而操纵其中存储的值。
- 变量是存储数据的容器
- 变量是在程序运行过程中可以发生改变的量
- 变量存储的数据是临时的
9.2 标识符
什么是标识符
标识符是程序员编写 Python 代码时自定义的名称,专门用于给变量、函数、类、模块、常量、包等程序元素命名,以唯一标识一个程序对象,方便调用和区分。
简单说:你自己起的所有名字(变量名、函数名、类名等)都是标识符。
标识符:用于变量、函数、类、模块等的名称。
标识符定义规则
标识符有如下特定规则:
- 组成部分:数字、字母、下划线
_ - 不可以:以数字开头;使用 Python 关键字;包含空格
- 见名知意:提升可读性
- 大小写敏感:
a与A不同 - 命名方式:蛇形命名(下划线命名)
- 变量名、函数名、方法名推荐:小写 + 下划线,如
user_name、get_student_info() - 类名推荐:大驼峰(每个单词首字母大写),如
class Student - 常量推荐:全大写 + 下划线,如
MAX_COUNT = 100 - 长度无限制,但不建议太长:名字过长会严重影响代码阅读与维护,行业惯例一般控制在 2~3 个单词、不超过 30 字符。
注意:以双下划线开头和结尾的名称通常有特殊含义,应尽量避免这种写法。例如 __init__ 是类的构造函数。
可以用的标识符(合法):
name
age1
user_name
my_var
Student
_private
MAX_COUNT
不可以用的标识符(非法):
1name # 数字开头
user-name # 有减号
if # 关键字
class # 关键字
user name # 有空格
a@b # 有特殊符号
$money # Python 不允许 $
关键字
关键字:被 Python 语言赋予特殊含义、用于专门用途的单词。
用 Python 帮助系统查看关键字:
help('keywords')

推荐命名规则
这些规则不做语法强制,但推荐在编程中遵守。开发中通常约定俗成地遵循如下规则:
| 类型 | 规则 | 例子 |
|---|---|---|
| 模块和包名 | 全小写字母,尽量简单;多个单词之间用下划线。 | math,os,sys |
| 函数名 | 全小写字母,多个单词之间用下划线隔开。 | phone,my_name |
| 类名 | 首字母大写,采用大驼峰原则;多个单词时,每个单词首字母大写、其余小写。 | MyPhone、MyClass、Phone |
| 常量名 | 全大写字母,多个单词用下划线隔开。 | SPEED、MAX_SPEED |
9.3 变量的定义
变量的声明和赋值,用于将一个变量绑定到一个对象上,格式:变量名 = 表达式。
最简单的表达式就是声明变量,例如 a = 123。运行时,解释器先运行右边的表达式,生成一个代表运算结果的对象,再把这个对象的地址赋值给左边的变量。
变量在使用前必须先初始化(先赋值)
my_name
变量 my_name 使用前未赋值,因此报错:'my_name' is not defined。
9.4 删除变量和垃圾回收机制
可以用 del 关键字删除不再使用的变量。
a = 123
del a
a
若一个对象没有任何变量引用(引用数为 0),就会被垃圾回收器回收,以释放内存空间。
9.5 链式赋值
链式赋值用于把同一个对象赋给多个变量。
x = y = 123
等价于:
x = 123
y = 123
9.6 系列解包赋值
把系列数据赋给数量相同的变量(个数必须一致)。
a, b, c = 4, 5, 6
等价于:
a = 4
b = 5
c = 6
用系列解包赋值实现变量交换:
a, b = 1, 2
a, b = b, a
print(a, b)
9.7 变量的内存示意图
变量 vs 宾馆:


9.8 变量的内存分析
变量由三部分组成:
- 标识:表示对象所存储的内存地址,用内置函数
id(obj)获取 - 类型:表示对象的数据类型,用内置函数
type(obj)获取 - 值:表示对象所存储的具体数据,用
print(obj)打印输出

name = '马丽亚'
print(name)
print('标识,',id(name)) # 变量 name 所指向的对象在内存中的唯一地址编号(内存地址)
print('类型,',type(name))
print('值,',name)
当多次赋值之后,变量名会指向新的空间。

10 常量
10.1 常量
Python 不支持常量,即没有语法规则限制改变常量的值。我们只能约定常量的命名规则,并在逻辑上不对其值作修改。
常量命名规则:全字母大写,多个单词之间用下划线连接。
MAX_SPEED = 120
print(MAX_SPEED)
MAX_SPEED = 140 # 实际是可以改的。只能逻辑上不做修改。
print(MAX_SPEED)
11 术语表(重要英文单词)
11.1 语法与结构
| 术语 | 全拼 / 说明 | 释义 |
|---|---|---|
| module | — | 模块,一个 .py 源文件即一个模块 |
| statement | — | 语句,Python 程序的最小构造单元 |
| indentation | — | 缩进,Python 用它划分代码块,属语法强制 |
| PEP | Python Enhancement Proposal | Python 增强提案;PEP 8 是官方代码风格规范 |
| identifier | — | 标识符,程序员自定义的变量/函数/类/模块等名称 |
| keyword | — | 关键字,被语言赋予特殊含义、不可作标识符的单词 |
| soft keyword | — | 软关键字,仅在特定语法上下文中保留(match/case/type/_) |
| docstring | Document String | 文档字符串,模块/函数/类首行的三引号字符串,存于 __doc__ |
| Snake Case | — | 蛇形命名,小写 + 下划线,如 user_name |
| Camel Case | — | 驼峰命名,类名用大驼峰,如 MyClass |
| escape character | — | 转义字符,以 \ 开头表示特殊字符,如 \n、\t |
11.2 对象与变量
| 术语 | 全拼 / 说明 | 释义 |
|---|---|---|
| identity | — | 标识,对象的唯一身份,用 id(obj) 获取(通常即内存地址) |
| type | — | 类型,决定对象的取值范围与可执行操作,用 type(obj) 获取 |
| value | — | 值,对象中存储的数据 |
| reference | — | 引用,Python 变量本质是对象的引用(存地址) |
| stack / heap | — | 栈 / 堆;简化模型中变量在栈、对象在堆 |
| dynamic typing | — | 动态类型,变量类型由运行时绑定的对象决定 |
| strong typing | — | 强类型,类型间不随意隐式转换 |
| garbage collection | — | 垃圾回收,引用计数归零后自动回收对象内存 |
| chained assignment | — | 链式赋值,x = y = 123 |
| unpacking | — | 解包赋值,a, b, c = 4, 5, 6 |
| NameError | — | 使用未定义名字时抛出的异常 |
11.3 格式化
| 术语 | 全拼 / 说明 | 释义 |
|---|---|---|
| f-string | Formatted String Literal | 格式化字符串字面量,Python 3.6+,前缀 f,首选格式化方式 |
| format spec | Format Specification | 格式规范迷你语言,如 :.2f、:>8、:,,在 {} 内用 : 引出 |
%-formatting |
— | 百分号格式化,最老的格式化方式 |
| stdin / stdout | Standard Input / Output | 标准输入 / 输出;input() 读 stdin,print() 写 stdout |
12 系列导航
13 参考链接
- Python 3 官方文档(中文)
- PEP 8 — Python 代码风格指南
- PEP 3120 — 默认源码编码改为 UTF-8
- Python 输入与输出 — 官方教程
- 格式化字符串语法 — 官方库参考
- f-string 详解(PEP 498)
keyword模块 — 官方文档
分类:Python

浙公网安备 33010602011771号