python学习1
- 变量、运算符与数据类型
- 注释
- 运算符
- 变量和赋值
- 数据类型与转换
- 输出
- 条件语句
- 循环
- 异常
变量、运算符与数据类型
注释
# 表示注释,作用于整行
‘’’ ‘’’ 或者 “”" “”" 表示区间注释,在三引号之间的所有内容被注释
运算符
位运算:
按位非:~
- ~ 对补码全部取反(0 变为 1,1 变为 0)包括符号位
按位与:两1为1,else 0
按位或:有1为1,else 0
按位异或:两位不同为1,else 0(异或操作满足交换律和结合律)
按位左移:*2—— n<<m:n*(2^m)
按位右移:/2——n>>m:n/(2^m)
!!!通过^ 可以快速交换两个整数:a ^ = b;b ^ = a;a ^= b
lowbit:快速获取a最后为1的位置:a&(-a)!!!利用位运算实现整数集合
一个数的二进制表示可以看作是一个集合(0 表示不在集合中,1 表示在集合中)。
比如集合 {1, 3, 4, 8},可以表示成 01 00 01 10 10 而对应的位运算也就可以看作是对集合进行的操作。
- a(1<<i) -> 把 i 插入到集合中
- a & ~(1<<i) -> 把 i 从集合中删除
- a & (1<<i) -> 判断 i 是否属于该集合(零不属于,非零属于)
- a 补 -> ~a
- a 交 b -> a & b
- a 并 b -> a | b
- a 差 b -> a & (~b)
特殊三元运算符
small = x if x < y else y
PS:
is, is not 对比的是两个变量的内存地址
==, != 对比的是两个变量的值
比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。
对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的。
如果怕出错可以用括号确定优先级
变量和赋值
变量名规则与C++标识符相同
先赋值再使用
数据类型与转换
都是对象也都有其对应的属性和方法
保留小数点后n位:
- 相关的包:decimal :Decimal对象
- Decimal 对象的默认精度值是 28 位 (prec=28)。
- getcontext().prec可以调整精度
decimal.getcontext().prec = 4
c = Decimal(1) / Decimal(3)
print(c)
# 0.3333
布尔型变量只有两个值:真假,可用于数学运算当作1,0用
除了直接给变量赋值 True 和 False,还可以用 bool(X) 来创建变量,其中 X 可以是
基本类型:整型、浮点型、布尔型
容器类型:字符串、元组、列表、字典和集合确定bool(X) 的值是 True 还是 False,就看 X 是不是空,空的话就是 False,不空的话就是 True。
对于数值变量,0, 0.0 都可认为是空的。
对于容器变量,里面没元素就是空的
类型转换
- 转换为整型 int(x, base=10)
- 转换为字符串 str(object=‘’)
- 转换为浮点型 float(x)
输出
print()
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
sep:间隔符;end:结束符(默认换行);file:定义流输出文件;flush:是否缓存
条件语句
PS:支持if嵌套,且Python 使用缩进而不是大括号来标记代码块边界,因此要特别注意else的悬挂问题
循环
如果布尔表达式不带有<、>、==、!=、in、not in等运算符,仅仅给出数值之类的条件,也是可以的。当while后写入一个非零整数时,视为真值,执行循环体;写入0时,视为假值,不执行循环体。也可以写入str、list或任何序列,长度非零则视为真值,执行循环体;否则视为假值,不执行循环体。
string = 'abcd'
while string:
print(string)
string = string[1:]
# abcd
# bcd
# cd
# d
!这个地方和c不太一样
当while循环正常执行完的情况下,执行else输出,如果while循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容。
for循环是迭代循环,在Python中相当于一个通用的序列迭代器,可以遍历任何有序序列,如str、list、tuple等,也可以遍历任何可迭代对象,如dict。
每次循环,迭代变量被设置为可迭代对象的当前元素,提供给代码块使用。
特别的 :
当for循环正常执行完的情况下,执行else输出,如果for循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容,与while - else语句一样
step=1 表示第三个参数的默认值是1。
range :生成一个从start参数的值开始到stop参数的值结束的数字序列,该序列包含start的值但不包含stop的值
break:跳出当前所在层的循环
continue终止本轮循环并开始下一轮循环
pass:语句的意思是“不做任何事”,如果你在需要有语句的地方不写任何语句,那么解释器会提示出错,而 pass 语句就是用来解决这些问题的:即占位
# 示例:
x = [-4, -2, 0, 2, 4]
y = [a * 2 for a in x]
print(y)
# [-8, -4, 0, 4, 8]
x = [(i, i ** 2) for i in range(6)]
print(x)
# [(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]
x = [i for i in range(100) if (i % 2) != 0 and (i % 3) == 0]
print(x)
# [3, 9, 15, 21, 27, 33, 39, 45, 51, 57, 63, 69, 75, 81, 87, 93, 99]
a = [(i, j) for i in range(0, 3) for j in range(0, 3)]
print(a)
# [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
x = [[i, j] for i in range(0, 3) for j in range(0, 3)]
print(x)
# [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]
x[0][0] = 10
print(x)
# [[10, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]]
a = [(i, j) for i in range(0, 3) if i < 1 for j in range(0, 3) if j > 1]
print(a)
# [(0, 2)]
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)
字典推导式
b = {i: i % 2 == 0 for i in range(10) if i % 3 == 0}
print(b)
# {0: True, 3: False, 6: True, 9: False}
集合推导式
c = {i for i in [1, 2, 3, 4, 5, 5, 6, 4, 3, 2, 1]}
print(c)
# {1, 2, 3, 4, 5, 6}
异常
assert:断言
assert后面条件为false时,程序崩溃并抛出AssertionError异常,用于置入检查点
eg:assert 3 > 7 # AssertionError
异常就是运行期检测到的错误。计算机语言针对可能出现的错误定义了异常类型,某种错误引发对应的异常时,异常处理程序将被启动,从而恢复程序的正常运行。
首先,执行try子句(在关键字try和关键字except之间的语句)
如果没有异常发生,忽略except子句,try子句执行后结束。
如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和except之后的名称相符,那么对应的except子句将被执行。最后执行try - except语句之后的代码。
如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
使用多个except代码块时,必须坚持对其规范排序,要从最具针对性的异常到最通用的异常。
一个 except 子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。
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:
s = 1 + '1'
int("abc")
f = open('test.txt')
print(f.read())
f.close()
except (OSError, TypeError, ValueError) as error:
print('出错了!\n原因是:' + str(error))
# 出错了!
# 原因是:unsupported operand type(s) for +: 'int' and 'str'
try:
raise NameError('HiThere')
except NameError:
print('An exception flew by!')
# An exception flew by!