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

- Python 程序由模块组成。一个模块对应一个 Python 源文件,一般后缀名是:
.py。 - 模块由语句组成。运行 Python 程序时,按照模块中语句的顺序依次执行。
- 语句是 Python 程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等。
2 代码的组织和缩进
很多编程语言通过字符(例如:花括号{})、关键字(例如:begain/end) 来划分代码块。同时,再配合代码的缩进增加可读性。“龟叔”设计 Python 语言时,直接通过缩进来组织代码块。“缩进”成为了 Python 语法强制的规定。
缩进时,几个空格都是允许的,但是数目必须统一。我们通常采用四个空格表示一个缩进。
同时,也要避免将 tab 制表符 与 空格 混合的缩进风格。目前,常用的编辑器一般设置成:tab 制表符就是 4 个空格。
Python 官方推荐的 PEP-8 代码风格详细说明,有兴趣的同学可以参考: https://www.python.org/dev/peps/pep-0008/
3 使用注释
注释是程序中会被 Python 解释器忽略的一段文本。程序员可以通过注释记录任意想写的内容,通常是关于代码的说明。
Python 中的注释一般用单行注释,使用 # 开始直到行结束的部分。
# 注释是个好习惯,方便自己方便他人
a = [10,20,30] # 生成一个列表对象,变量 a 引用了这个变量
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 |
十六进制整数(小写 ox) |
%X |
十六进制整数(大写 OX) |
%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 默认输出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 方法简写形式格式化输出(推荐)
在 Python3.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,其代表的含义就是两个转义字符。
\t :制表符,一个tab键(4个空格)的距离
\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 标识符
标识符命名规则
标识符:用于变量、函数、类、模块等的名称。
标识符有如下特定的规则:
- 区分大小写。如:
sxt和SXT是不同的。 - 第一个字符必须是 字母 或 下划线。其后的字符是:字母、数字、下划线。
- 不能使用关键字。比如:
if、or、while等。
注意:以双下划线开头和结尾的名称通常有特殊含义,尽量避免这种写法。比如:__init__ 是类的构造函数。
使用 Python 帮助系统查看关键字:
>>> help('keywords')
False class from or
None continue global pass
True def if raise
and del import return
as elif in try
assert else is while
async except lambda with
await finally nonlocal yield
break for not

推荐命名规则
不在语法上做强制要求,但推荐在编程中遵守的规则。
开发中,我们通常约定俗称遵守如下规则:
| 类型 | 规则 | 例子 |
|---|---|---|
| 模块和包名 | 全小写字母,尽量简单。若多个单词之间用 下划线。 | math, os, sys |
| 函数名 | 全小写字母,多个单词之间用下划线隔开。 | phone, my_name |
| 类名 | 首字母大写,采用大驼峰原则。多个单词时, 每个单词第一个字母大写,其余部分小写。 | MyPhone、MyClass、Phone |
| 常量名 | 全大写字母,多个单词使用下划线隔开。 | SPEED、MAX_SPEED |
9.3 变量的定义
变量的声明和赋值:用于将一个变量绑定到一个对象上。格式:变量名 = 表达式。
格式如下:
变量名称 = 变量的值
注:等号的两边都要保留一个空格,其实 Python 中建议符号的两边尽量都要保留一个空格
最简单的表达式就是声明变量。比如:a = 123。运行过程中,解释器先运行右边的表达式,生成一个代表表达式运算结果的对象;然后,将这个对象地址赋值给左边的变量。
变量在使用前必须先被初始化(先被赋值)
>>> my_name
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
my_name
NameError: name 'my_name' is not defined
变量 my_name 在被使用前未做赋值,因此报错:’my_name’ is not defined。
9.4 删除变量和垃圾回收机制
可以通过 del 关键字删除不再使用的变量。
>>> a = 123
>>> del a
>>> a
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
a
NameError: name 'a' is not defined
如果对象没有任何变量引用(引用数为 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)
2 1
9.7 常量
Python 不支持常量,即没有语法规则限制改变一个常量的值。我们只能约定常量的命名规则,以及在程序的逻辑上不对常量的值作出修改。
常量命名规则:全字母大写,多个单词之间用下划线连接。
>>> MAX_SPEED = 120
>>> print(MAX_SPEED)
120
>>> MAX_SPEED = 140 #实际是可以改的。只能逻辑上不做修改。
>>> print(MAX_SPEED)
140

浙公网安备 33010602011771号