关键字是在 Python 中,被赋予了特殊含义的英文单词。使用帮助系统可以查看 Python 中的所有关键字,除 True、False、None 外,其他关键字都是小写。
标识符是标识变量、函数、类型、模块等名称的符号。Python中的标识符有如下规则:
Python命名规范
包、模块、函数、变量:全小写字母,多个单词用下划线分隔;
类名:大驼峰命名;
常量名:全大写,多个单词用下划线分隔。
#
;'''
或者"""
。#!/usr/bin/env python3
告诉Linux操作系统,这是一个Python可执行程序
# -*- coding: utf-8 -*-
告诉Python解释器,按照 utf-8 编码读取源代码
常量
Python 不支持常量,即没有语法规则限制改变一个常量的值。
我们只能约定常量的命名规则,在程序的逻辑上不对常量的值进行修改。
变量
Python中,变量也称为“对象的引用”。因为,变量存储的就是对象的地址。变量通过地址引用了“对象”。
变量位于:栈内存
对象位于:堆内存
1. 变量声明语法
变量的声明和赋值用于将一个变量绑定到一个对象上,语法:变量名 = 表达式
。
变量使用前必须被初始化。
2. 变量赋值方法
简单赋值
常用赋值方法,语法:变量名=值
。
链式赋值
链式赋值用于将同一个对象赋值给多个变量。语法:变量1 = 变量2 = 值
,相当于 变量1 = 值; 变量2 = 值
。
序列解包赋值
系列解包赋值用于将对应个数的值按顺序赋给相同个数的变量。语法:变量1, 变量2, 变量3 = 值1, 值2, 值3
,相当于 变量1 = 值1; 变量2 = 值2; 变量3 = 值3
。
系列解包赋值可用于变量交换。
3. 删除变量
可以使用 del 删除不再使用的变量,语法:del 变量名
。
如果对象没有被任何变量引用,就会被垃圾回收器回收,清空内存空间。
一、数字类型
1.整型(int)
Python 3 中,整型的位数没有限制。
二进制: 0b 或 0B 开头
八进制: 0o 或 0O 开头
十六进制: 0x 或 0X 开头
2.浮点型(float)
浮点数用 a * 10b 形式的科学计数法表示,比如:3.14,表示为 314E-2。浮点数在内存中也是按照科学计数法存储的。
可以使用 round( ) 将浮点数进行四舍五入。不会改变原有值,而是产生新的值。
3.布尔型(bool)
布尔型的 True、False
,本质上就是 1 和 0,他们可以和数字运算。
二、序列类型
字符串(str)
列表(list)
元组(tuple)
字典(dict)
集合(set)
三、类型转换
1. 自动类型转换
整数和浮点型混合运算时,表达式自动转型成浮点型。如:2 + 8.0 = 10.0;
整数和布尔值混合运算时,会自动将布尔值转换为对应的数字,True 转换为 1,False 转换为 0。
2. 强制类型转换
方法 | 作用 | 整型 | 浮点型 | 布尔型 | 字符串 |
---|---|---|---|---|---|
int( ) | 转换为整数 | / | 直接取整数部分 | True 转为 1 False 转为 0 |
纯数字可以转 有字母会报错 |
float( ) | 转换为浮点数 | 转换为 整数.0 |
/ | True 转为 1.0 False 转为 0.0 |
纯数字可以转 有字母会报错 |
bool( ) | 转换为布尔值 | 0 转换为 False 其他转换为 True |
0.0 转换为 False 其他转换为 True |
/ | None、空白字符串转换为 False 其他转换为 True |
str( ) | 转换为字符串 | 转换为字面量字符串 | 转换为字面量字符串 | 转换为字面量字符串 | / |
1. 算术运算符
运算符 | 作用 | 示例 | 结果 |
---|---|---|---|
+ | 加法,可用于 数字、字符串、列表、元组等 | 3 + 2 | 5 |
- | 减法,可用于 数字、字符串、列表、元组等 | 10 - 2 | 8 |
* | 乘法 | 3 * 5 | 15 |
/ | 浮点数除法 | 7 / 4 | 1.75 |
// | 整数除法 | 7 // 4 | 1 |
% | 模(取余) | 7 % 4 | 3 |
** | 幂 | 2 ** 3 | 8 |
使用 divmod(被除数, 除数)
可以同时得到商和余数,返回的是一个元组。
2. 赋值运算符
运算符 | 举例 | 等价于 |
---|---|---|
= | a = 2 | |
+= | a += 2 | a = a + 2 |
-= | a -= 2 | a = a - 2 |
*= | a *= 2 | a = a * 2 |
/= | a /= 2 | a = a / 2 |
//= | a //= 2 | a = a // 2 |
%= | a %= 2 | a = a % 2 |
**= | a **= 2 | a = a ** 2 |
3. 比较运算符
运算符 | 作用 | 示例 | 结果 |
---|---|---|---|
== | 等于 | 15 == 30 | False |
!= | 不等于 | 15 != 30 | True |
> | 大于 | 15 > 30 | False |
< | 小于 | 15 < 30 | True |
>= | 大于等于 | 15 >= 30 | False |
<= | 小于等于 | 15 <= 30 | True |
4. 逻辑运算符
运算符 | 作用 | 格式 | 说明 |
---|---|---|---|
and | 与 | x and y | x 为 true,返回 y 的值 x 为 false,不计算 y 的值,直接返回 false |
or | 或 | x or y | x 为 true,不计算 y 的值,直接返回 true x 为 false,返回 y 的值 |
not | 非 | not x | x 为 true,返回 false x 为 false,返回 true |
5. 位运算符
运算符 | 作用 |
---|---|
& | 按位与 |
| | 按位或 |
~ | 按位非 |
^ | 按位异或 |
<< | 左移,高位溢出,低位补0 |
>> | 右移,符号位不变,低位溢出,高位补符号位 |
Python 中,不支持自增(++)和自减(--)运算符。
6. 同一运算符
同一运算符用于比较两个对象的存储地址是否相同。
运算符 | 作用 |
---|---|
is | 判断两个标识符是否引用同一对象 |
is not | 判断两个标识符是否引用不同对象 |
is 与 == 的区别:
is 用于判断两个变量引用的对象是否为同一个,即比较对象在内存中的存储地址;
== 用于判断两个变量引用的对象的值是否相等,默认调用对象的 __eq__() 方法。
注:变量和 None 比较时,应该使用 is 。
整数缓存问题
交互模式下,Python 对 [ -5, 256 ] 之间的整数进行了缓存,所以在这个范围内的整数使用 is 和 == 判断,结果都为 True。
在PyCharm中,或将语句保存为文件时,Python 缓存的整数范围是 [ -5, 任意正整数 ]。
7. 成员运算符
成员运算符用于判定元素是否在序列中存在。
运算符 | 作用 |
---|---|
in | 判断值是否存在于序列中 |
not in | 判断值是否不存在与序列中 |
8. 运算符优先级
位运算 和 算术运算 > 比较运算符 > 赋值运算符 > 逻辑运算符;
建议使用小括号进行组织,避免运算符优先级导致的问题。
1. 单分支
if 条件表达式:
语句块
num = 10
if num >= 5:
print("greater than 5")
if 条件表达式:
语句块1
else:
语句块2
num = 10
if num >= 5:
print("greater than 5")
else:
print("less than 5")
双分支都有返回值时,可以使用三元运算符代替。
条件为真的值 if 条件表达式 else 条件为假的值
3. 多分支
if 条件表达式1:
语句块1
elif 条件表达式2:
语句块2
elif 条件表达式3:
语句块3
else:
语句块4
条件表达式的值为 False 的情况:
False、0、0.0、空字符串、空值 None、空序列对象(空列表、空元组、空字典、空集合)、空 range 对象、空迭代器对象。
其余情况,均为True。
在 Python 中,条件表达式中不能有赋值运算符 “=”。
while 条件表达式:
循环体语句
循环体中必须有改变循环变量的操作,不然会形成死循环。
2. for 循环
for 变量 in 可迭代对象:
循环体语句
for 循环通常用于可迭代对象的遍历,可迭代对象包括:
# 打印九九乘法表
for x in range(1, 10):
for y in range(x, 10):
separator = '\n' if y == 9 else '\t'
print('{0} × {1} = {2}'.format(x, y, x * y), end=separator)
3. 其他语句
break 语句
break 语句用于 while 和 for 循环,用来结束整个循环。当有嵌套循环时,break 语句只跳出最近一层循环。
continue 语句
continue 语句用于结束本次循环,继续下一次。当有嵌套循环时,continue 也用于最近一层循环。
else 语句
while、for 循环可以带一个可选的 else 语句,如果循环被 break 结束,则不会执行 else 语句,否则会执行
。用于循环正常结束应该执行的动作,循环被 break 打断则不执行的动作。
while 条件表达式:
循环体语句
else:
语句块
-------------------------------
for 变量 in 可迭代对象:
循环体语句
else:
语句块
# 录入5名员工薪资,全部录入完成后,提示“您已全部录入5名员工薪资”,最后打印录入的薪资和平均薪资。
emp_num = 0
sum_salary = 0
salaries = []
for i in range(5):
input_str = input('请录入5名员工薪资(按 Q 中途结束)\n')
if input_str.upper() == 'Q':
break
salary = float(input_str)
if salary < 0:
continue
emp_num += 1
sum_salary += salary
salaries.append(salary)
else:
print('您已全部录入5名员工薪资')
print('录入薪资:', salaries)
print(f'平均薪资:{sum_salary / emp_num}')
4. 循环代码的优化
- 尽量减少循环内不必要的计算;
- 尽量使用局部变量,而不是全局变量;
- 连接多个字符串,使用 join 而不是 +;
- 列表元素的插入和删除,尽量在尾部操作。
# 循环性能测试
import time
start1 = time.time()
for x in range(10000):
result = []
for y in range(10000):
result.append(x * 100 + y * 100)
end1 = time.time()
print(f'耗时: {end1 - start1}')
start2 = time.time()
for i in range(10000):
result = []
num = i * 100
for j in range(10000):
result.append(num + j * 100)
end2 = time.time()
print(f'耗时: {end2 - start2}')
---------------------- 执行结果 --------------------
耗时: 20.11190366744995
耗时: 16.96176505088806
5. zip( ) 并行遍历
可以使用 zip( ) 对多个序列并行遍历,zip( ) 在最短序列用完时停止。
names = ('张三', '李四', '王五', '赵六')
ages = (18, 26, 22, 31)
jobs = ('老师', '程序员', '公务员')
for name, age, job in zip(names, ages, jobs):
print(f'{name}--{age}--{job}')
# 等价于
for i in range(len(jobs)):
print(f'{names[i]}--{ages[i]}--{jobs[i]}')
--------------------- 执行结果 ---------------------
张三--18--老师
李四--26--程序员
王五--22--公务员