Task01的内容分为:
一、变量、运算符与数据类型
二、位运算
三、条件语句
四、循环语句
五、异常处理
在第一节中,与其他编程语言差距的部分是注释,print函数。
python中的注释分为 #单行注释 和 """多行注释 """ '''多行注释 '''单行注释由一个#,而多行注释为三个单引号或双引号包含起来。
print函数的默认状态
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
其中objects为所有对象的父类,关键字sep为分隔符,默认为' ',关键字end为输出结束时的字符,默认为'/n'(换行),file为是定义流输出的文件,可以是标准的系统输出sys.stdout
,也可以重定义为别的文件。关键字参数flush
是立即把内容输出到流文件,不作缓存。
第二节中,位运算是基于二进制的计算方法进行的。
二进制有三种不同的表示形式:原码、反码和补码,计算机内部使用补码来表示。
正数的原码就是二进制本身
负数的原码会将最高位数作为符号位表示为负数
00 00 00 11 -> 3
10 00 00 11 -> -3
正数的反码就是原码
负数的反码是符号位不变,其余位取反(对应正数按位取反)。
00 00 00 11 -> 3
11 11 11 00 -> -3
正数的补码就是原码
负数的补码为反码+1
按位运算分为:或( | ),与(&),非( ! ),异或( ^ ),按位左移(<<)和按位右移(>>)
按位或操作 |
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
只要两个对应位中有一个 1 时就为 1
按位与操作 &
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
只有两个对应位都为 1 时才为 1
按位非操作 ~
~ 1 = 0
~ 0 = 1
~
把num
的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)有符号整数的符号位在 ~
运算中同样会取反。
按位异或操作 ^
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
只有两个对应位不同时才为 1
按位左移操作 <<
num << i
将num
的二进制表示向左移动i
位所得的值。
00 00 10 11 -> 11
11 << 3
---
01 01 10 00 -> 88
按位右移操作 >>
num >> i
将num
的二进制表示向右移动i
位所得的值。
00 00 10 11 -> 11
11 >> 2
---
00 00 00 10 -> 2
第三节中,条件语句的样式也大差不差,其中assert 关键词是我需要重新学习和掌握的。
assert
这个关键词我们称之为“断言”,当这个关键词后边的条件为 False 时,程序自动崩溃并抛出AssertionError
的异常。在进行单元测试时,可以用来在程序中置入检查点,只有条件为 True 才能让程序正常工作。
my_list = ['lsgogroup']
my_list.pop(0)
assert len(my_list) > 0
# AssertionError
在第四节的循环语句中,我重点学习的是range()函数和enumerate()函数
range([start,] stop[, step=1])
start为序列开始的值,stop为序列结束的值,不包括stop的值本身,其中step默认为1(序列间隔)
for i in range(2, 9): # 不包含9
print(i)
# 2
# 3
# 4
# 5
# 6
# 7
# 8
当step序列为2时
for i in range(1, 10, 2):
print(i)
# 1
# 3
# 5
# 7
# 9
enumerate(sequence, [start=0])
sequence:一个序列、迭代器或其他支持迭代对象。
start:下标起始位置。
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
lst = list(enumerate(seasons))
print(lst)
# [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
lst = list(enumerate(seasons, start=1)) # 下标从 1 开始
print(lst)
# [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
第五节的异常处理中总结了标准异常。对于这么多种类的异常,记忆起来十分困难,所以大多数时候都是出现异常的时候再去总结和发现异常出现的原因,来加深印象。对于异常我们要学会怎么抛出异常和处理异常。其中try - except 语句、try - except - finally语句、try - except - else 语句、raise语句是我们要理解和掌握的。
try - except 语句
首先,执行try
子句(在关键字try
和关键字except
之间的语句)
如果没有异常发生,忽略except
子句,try
子句执行后结束。
如果在执行try
子句的过程中发生了异常,那么try
子句余下的部分将被忽略。如果异常的类型和except
之后的名称相符,那么对应的except
子句将被执行。最后执行try - except
语句之后的代码。
try:
f = open('test.txt')
print(f.read())
f.close()
except OSError:
print('打开文件出错')
# 打开文件出错
try:
检测范围
except Exception[as reason]:
出现异常后的处理代码
如果一个异常没有与任何的except
匹配,那么这个异常将会传递给上层的try
中。
try:
f = open('test.txt')
print(f.read())
f.close()
except OSError as error:
print('打开文件出错\n原因是:' + str(error))
# 打开文件出错
# 原因是:[Errno 2] No such file or directory: 'test.txt'
try - except - finally语句
try: 检测范围 except Exception[as reason]: 出现异常后的处理代码 finally: 无论如何都会被执行的代码
def divide(x, y):
try:
result = x / y
print("result is", result)
except ZeroDivisionError:
print("division by zero!")
finally:
print("executing finally clause")
divide(2, 1)
# result is 2.0
# executing finally clause
divide(2, 0)
# division by zero!
# executing finally clause
divide("2", "1")
# executing finally clause
# TypeError: unsupported operand type(s) for /: 'str' and 'str'
如果在try
子句执行时没有发生异常,Python将执行else
语句后的语句。
try:
检测范围
except:
出现异常后的处理代码
else:
如果没有异常执行这块代码
使用except
而不带任何异常类型,这不是一个很好的方式,我们不能通过该程序识别出具体的异常信息,因为它捕获所有的异常。
try: 检测范围 except(Exception1[, Exception2[,...ExceptionN]]]): 发生以上多个异常中的一个,执行这块代码 else: 如果没有异常执行这块代码
【例子】
try:
fh = open("testfile.txt", "w")
fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
print("Error: 没有找到文件或读取文件失败")
else:
print("内容写入文件成功")
fh.close()
# 内容写入文件成功
raise语句
Python 使用raise
语句抛出一个指定的异常。
【例子】
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
# An exception flew by!