一、学习知识点概要
Python 是一种通用编程语言,其在科学计算和机器学习领域具有广泛的应用。
本次学习包括以下内容:
变量、运算符与数据类型
位运算
条件语句
循环语句
异常处理
二、学习内容
I.变量、运算符与数据类型
1.注释
在Python中,#表示注释,作用于整行,''' '''或""" """表示区间注释,在三个引号之间的信息为注释,例如:
"""
多行注释
三个双引号
"""
print('Hello World!')
#单行注释
'''
多行注释
三个单引号
'''
2.位运算符
位运算符
运算符 含义 功能
& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1;否则为0
| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^ 按位异或 若参加运算的两个二进制位同号则结果为0(假)异号则结果为1(真)
~ 取反 ~是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,将1变0
>> 左移 左移运算符是用来将一个数的各二进制位全部左移n位,右补0
<< 右移 表示将a的各二进制位右移n位,移到右端的低位被舍弃,对无符号数,高位补0
对位运算符的运用见后文“位运算”部分
3.三目运算符
对分支语句,例如:
a=2
b=5
if a>b:
value=a
else:
value=b
print(value) #输出结果为5
在Python中可以运用更简洁的写法:
a=2
b=5
value=a if a>b else b
print(value)
使用 if else 实现三目运算符(条件运算符)的格式如下:
exp1 if contion else exp2
condition 是判断条件,exp1 和 exp2 是两个表达式。如果 condition 成立(结果为真),就执行 exp1,并把 exp1 的结果作为整个表达式的结果;如果 condition 不成立(结果为假),就执行 exp2,并把 exp2 的结果作为整个表达式的结果。
4.其他运算符
运算符 名称
示例
in 存在 1 in [1,2,3]
not in 不存在 4 not in [1,2,3]
is 是 'hello' is 'hello'
is not 不是 'hello' is not 'Hello'
运算结果为布尔型数据,以上示例结果都为True。
注:
比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。
对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的。
5.基本数据类型与转换
基本数据类型有整形(int)、浮点型(float)、布尔型(boolean),可通过type()方法查看对象的数据类型,还可以用isinstance()方法查看两种数据的类型是否相同。
整形(int)即为内容为整数的数据,如:5,112,-32等;
浮点型(float)为含有小数点的数据,如:1.0,2.3e-07等;
布尔型(boolean)数据只能取两个值,True和False。但布尔型的数据参与数字运算时,用1和0分别代表True和False。
如果我们想保留浮点型的小数点后n位,可以引入decimal包里的Decimal对象和getcontext()方法来实现,Decimal对象的默认精度为28位,例如:
import decimal
from decimal import Decimal
x=Decimal(2)/Decimal(7)
print(x)
#结果为0.2857142857142857142857142857,有28位小数
decimal.getcontext().prec=5
x=Decimal(2)/Decimal(7)
print(x)
#结果为0.28571,有5位小数
创建布尔型变量除了直接给变量赋值和用运算符之外,还可以用bool(x)方法创建。其中x可以是
基本类型:整型、浮点型、布尔型
容器类型:字符串、元组、列表、字典和集合
当x为整形或浮点型时,若x=0或x=0.0,bool(x)就为False,否则为True;
当x为容器类型的数据时,若x为空,bool(x)为False,若x 为非空,bool(x)为True。
类型转换
转换为整型,用int(x)
转换为浮点型,用float(x)
转换为字符串,用str(object=' ')
II.位运算
位运算是直接对整数在二进制中进行操作。我们的电脑电路设计都是基于二进制的,所以在二进制层面效率很高。通常位运算多用在对程序效率要求很高的场景。
1.原码、反码、补码
二进制有三种不同的表示形式:原码、反码和补码,计算机内部用补码表示。
原码:就是对象的二进制表示。原码的首位为符号位,用于表示数据的正负,当对象为非负数时符号位为0,负数时符号位为1。取该整数的绝对值的二进制,再加上符号位。原码只是为了让我们看二进制更直观,直接看出正负数和比较大小。但原码不是计算机保存的二进制,所以不能直接参与计算。例:
整数 绝对值 绝对值的二进制值 原码
5 5 0000101 00000101
-5 5 0000101 10000101
反码:反码主要是针对负数的处理,非负数的反码就是原码。在原码的基础上,符号位不变,其他数值位取反,即把1变成0,把0变成1。反码是为了在计算机中存储二进制,但非真正的二进制值,所以也不直接参与计算。例如:
整数 绝对值 原码 反码
5 5 00000101 00000101
-5 5 10000101 11111010
补码:补码主要也是针对负数。非负数不变,而负数是在反码的基础上加1。
整数 绝对值 反码 补码
5 5 00000101 00000101
-5 5 11111010 11111011
2.按位运算
上文提到的位运算符就是对两个数的补码直接进行操作。主要是在对应的位置上进行逻辑运算。以5和3为例:
运算符 & | ^ ~ >> <<
表达式 5&3 5|3 5^3
~5
5<<2
3>>1
二进制表示
00000101
&
00000011
00000101
|
00000011
00000101
^
00000011
~00000101
00000101<<2
00000011>>1
运算结果
00000001
1
00000111
7
00000110
6
11111010
-6
00010100
20
00000001
1
3.利用位运算实现快速计算
通过 <<,>> 快速计算2的倍数问题:
n << 1 #计算 n*2
n >> 1 #计算 n/2,负奇数的运算不可用
n << m #计算 n*(2^m),即乘以 2 的 m 次方
n >> m #计算 n/(2^m),即除以 2 的 m 次方
1 << n #计算 2^n,即2的n次方
通过 ^ 快速交换两个整数:
a^=b
b^=a
a^=b
通过 a&(-a) 快速获取a的最后为 1 位置的整数
III.条件语句
Python的条件语句为if-elif-else语句,与其他语言的用法相似,此处不多赘述。
assert关键词
这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssetionError的异常。在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。
a=5
b=6
assert a>b
#AssertionError
IV.循环语句
Python中的While循环和For循环与其他语言中的用法相似,此处只写一些不同的地方。
1.while - else循环
while - else循环的结构如下:
while 布尔表达式:
代码块
else:
代码块
当while循环正常执行完的情况下,执行else输出,如果while循环中执行了跳出循环的语句(如break),将不执行else代码块的内容。
2.for - else循环
与while - else循环类似,当for循环正常执行完的情况下,执行else输出,如果在循环途中执行了跳出循环的语句,则不会执行else的内容。例如:
for 循环变量 in 可迭代对象:
代码块
else:
代码块
3.range()方法
range() 返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印(print)的时候不会打印列表。
range(start=0,stop,step=1),range()方法有三个参数:start,stop,step
start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5
step:步长,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
4.enumerate()方法
enumerate(sequence,start=0),参数start可省略,默认为0
sequence:一个序列、迭代器或其他支持迭代对象。
start:下标起始位置。
返回 enumerate(枚举) 对象
enumerate(X)不仅返回了X中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用enumerate(X,j)还可以确定索引起始值为j
enumerate()方法可与for循环配合使用:
seq=['one', 'two', 'three']
for i, element in enumerate(seq):
print(i, element)
'''
0 one
1 two
2 three
'''
5.continue语句
continue语句用于终止本轮循环并开始下一轮循环,如:
for i in range(1,11):
if i != 10:
print('i不是10')
continue
print('i是10')
'''
i不是10
i不是10
i不是10
i不是10
i不是10
i不是10
i不是10
i不是10
i不是10
i是10
'''
6.pass语句
pass语句的意思是“跳过”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,pass语句就是用来解决这个问题的。其作用是为了保持程序结构的完整性。尽管pass语句不做任何操作,但如果暂时不确定要在一个位置放上什么样的代码,可以先放置一个pass语句,让代码可以正常运行。
7.推导式
列表推导式
#推导式结构:[ expr for value in collection [if condition] ]
x = [-4, -2, 0, 2, 4]
y = [a * 2 for a in x]
print(y)
# [-8, -4, 0, 4, 8]
元组推导式
#推导式结构( expr for value in collection [if condition] )
a = (x for x in range(10))
print(a)
# <generator object <genexpr> at 0x0000025BE511CC48>
print(tuple(a))
# (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
字典推导式
#推导式结构{ key_expr: value_expr for value in collection [if condition] }
b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}
print(b)
# {0: True, 3: False, 6: True, 9: False}
集合推导式
#推导式结构{ expr for value in collection [if condition] }
c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]}
print(c)
# {1, 2, 3, 4, 5, 6}
V.异常处理
异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。
1.Python标准异常总结
BaseException:所有异常的 基类
Exception:常规异常的 基类
StandardError:所有的内建标准异常的基类
ArithmeticError:所有数值计算异常的基类
FloatingPointError:浮点计算异常
OverflowError:数值运算超出最大限制
ZeroDivisionError:除数为零
AssertionError:断言语句(assert)失败
AttributeError:尝试访问未知的对象属性
EOFError:没有内建输入,到达EOF标记
EnvironmentError:操作系统异常的基类
IOError:输入/输出操作失败
OSError:操作系统产生的异常(例如打开一个不存在的文件)
WindowsError:系统调用失败
ImportError:导入模块失败的时候
KeyboardInterrupt:用户中断执行
LookupError:无效数据查询的基类
IndexError:索引超出序列的范围
KeyError:字典中查找一个不存在的关键字
MemoryError:内存溢出(可通过删除对象释放内存)
NameError:尝试访问一个不存在的变量
UnboundLocalError:访问未初始化的本地变量
ReferenceError:弱引用试图访问已经垃圾回收了的对象
RuntimeError:一般的运行时异常
NotImplementedError:尚未实现的方法
SyntaxError:语法错误导致的异常
IndentationError:缩进错误导致的异常
TabError:Tab和空格混用
SystemError:一般的解释器系统异常
TypeError:不同类型间的无效操作
ValueError:传入无效的参数
UnicodeError:Unicode相关的异常
UnicodeDecodeError:Unicode解码时的异常
UnicodeEncodeError:Unicode编码错误导致的异常
UnicodeTranslateError:Unicode转换错误导致的异常
2.Python标准警告总结
Warning:警告的基类
DeprecationWarning:关于被弃用的特征的警告
FutureWarning:关于构造将来语义会有改变的警告
UserWarning:用户代码生成的警告
PendingDeprecationWarning:关于特性将会被废弃的警告
RuntimeWarning:可疑的运行时行为(runtime behavior)的警告
SyntaxWarning:可疑语法的警告
ImportWarning:用于在导入模块过程中触发的警告
UnicodeWarning:与Unicode相关的警告
BytesWarning:与字节或字节码相关的警告
ResourceWarning:与资源使用相关的警告
3.try - except语句
'''
try - except语句结构如下:
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
'''
try:
f = open('test.txt')
print(f.read())
f.close()
except OSError:
print('打开文件出错')
# 打开文件出错
首先执行try子句(即“检测范围”那块代码)
若无异常发生,则忽视except语句
若发生异常,那try子句的余下部分会被忽略。同时如果异常的类型和except后的异常类型相同,则会执行except子句
如果一个异常没有与任何的except匹配,这个异常将会被传递到上层的try中
一个try语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
4.try - except - finally语句
无论try子句执行时有没有发生异常,最终都会执行finally子句。如果执行try子句时发生异常,且没有任何except语句把异常拦截的话,会先执行finally子句再抛出异常。结构为:
try:
检测范围
except:
出现异常后的处理代码
finally:
无论结果如何都执行这块代码
5.try - except - else语句
如果在执行try子句时没有发生异常,则执行else子句。结构为:
try:
检测范围
except:
出现异常后的处理代码
else:
如果没有异常执行这块代码
6.raise语句
raise语句用于抛出一个指定的异常。例如:
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')