一、学习内容概括
首先附上学习地址阿里云天池Python训练营
学习内容如下:
二、具体学习内容
1.注释
为程序添加注释可以提高程序的可读性,Python中注释分为单行注释和多行注释。同时,注释也是调试程序的一种重要方式,某些时候,我们不希望编译、执行程序中的某些代码,这时就可以将这些代码注释掉。
-
单行注释
单行注释用一个井号#表示
# 这是一个注释
print("Hello world")
# Hello world
-
多行注释
多行注释用三个单引号''' '''或者三个双引号""" """表示
'''
这是多行注释,用三个单引号
这是多行注释,用三个单引号
这是多行注释,用三个单引号
'''
print("Hello china")
# Hello china
"""
这是多行注释,用三个双引号
这是多行注释,用三个双引号
这是多行注释,用三个双引号
"""
print("hello china")
# hello china
2.运算符
- 算数运算符
名称 | 操作符 | 示例 |
---|---|---|
加 | + | 1+1 |
减 | - | 2-1 |
乘 | * | 3*4 |
除 | / | 3/4 |
整除 | // | 3//4 |
取余 | % | 3%4 |
幂 | ** | 2**3 |
print(1 + 1) # 2
print(2 - 1) # 1
print(3 * 4) # 12
print(3 / 4) # 0.75
print(3 // 4) # 0
print(3 % 4) # 3
print(2 ** 3) # 8
- 比较运算符
名称 | 操作符 | 示例 |
---|---|---|
大于 | > | 2>1 |
大于等于 | >= | 2>=4 |
小于 | < | 1<2 |
小于等于 | <= | 5<=2 |
等于 | == | 3==4 |
不等于 | !== | 3!=5 |
print(2 > 1) # True
print(2 >= 4) # False
print(1 < 2) # True
print(5 <= 2) # False
print(3 == 4) # False
print(3 != 5) # True
-
逻辑运算符
与and
、或or
、非not
print((3 > 2) and (3 < 5)) # True
print((1 > 3) or (9 < 2)) # False
print(not (2 > 1)) # False
-
位运算符
位运算符可以直接操作数值的原始bit位,通常在图形、图像处理和创建设备驱动等底层开发中使用。Python支持位运算符有一下6个:
名称 | 操作符 | 示例 |
---|---|---|
按位与 | & | 4&5 |
按位或 | 竖 | 4竖5 |
按位取反 | ~ | ~4 |
按位异或 | ^ | 4^5 |
左移 | << | 4<<2 |
右移 | >> | 4>>2 |
print(bin(4)) # 0b100
print(bin(5)) # 0b101
print(bin(~4), ~4) # -0b101 -5
print(bin(4 & 5), 4 & 5) # 0b100 4
print(bin(4 | 5), 4 | 5) # 0b101 5
print(bin(4 ^ 5), 4 ^ 5) # 0b1 1
print(bin(4 << 2), 4 << 2) # 0b10000 16
print(bin(4 >> 2), 4 >> 2) # 0b1 1
- 三元运算符
也叫三目运算符,通过if语句来实现。
语法结构:
True_statements if expression else False_statements
运算规则:
先对逻辑表达式expression进行求职,若为True
,则执行并返回True_statements的值;若为False
,则执行并返回False_statements的值。
值得注意的是:
Python允许三元运算符的True_statements或False_statements中放置多条语句,主要支持两种放置方式。第一种,多条语句用英文逗号隔开,每条语句都会执行,程序返回多条语句的返回值组成的元组;第二种,多条语句用英文分号隔开,每条语句都会执行,程序只返回第一条语句的返回值。
a = 5
b = 3
st = print('5比3大'), 'a大于b' if a > b else 'a不大于b'
print(st)
#5比3大
#(None, 'a大于b')
因为print
函数没有返回值,所以返回一个None
- 其他运算符
主要介绍两组运算符,一组是 is
和 not is
,另一组是 in
和not in
。
in
和 not in
主要比较某个对象在不在某个序列对象中,比如字符串中是否包含了某个字母,列表中是否包含了某个元素等等,比较简单。我们主要看下is
和 not is
。
比较的对象是不可变类型:
a = "hello"
b = "hello"
print(a is b, a == b) # True True
print(a is not b, a != b) # False False
比较的对象是可变类型:
a = ["hello"]
b = ["hello"]
print(a is b, a == b) # False True
print(a is not b, a != b) # True False
注意:
is
,is not
对比的是两个变量的内存地址==
,!=
对比的是两个变量的值比较的两个变量,指向的都是地址不可变的类型(
str
等),那么is,is not
和==
,!=
是完全等价的。对比的两个变量,指向的是地址可变的类型(
list
,dict
,tuple
等),则两者是有区别的。运算符的优先级
一元运算符优于二元运算符。例如
3 ** -2
等价于3 ** (-2)
。先算术运算,后移位运算,最后位运算。例如
1 << 3 + 2 & 7
等价于(1 << (3 + 2)) & 7
。逻辑运算最后结合。例如
3 < 4 and 4 < 5
等价于(3 < 4) and (4 < 5)
。
print(-3 ** 2) # -9
print(3 ** -2) # 0.1111111111111111
print(1 << 3 + 2 & 7) # 0
print(-3 * 2 + 5 / -2 - 4) # -12.5
print(3 < 4 and 4 < 5) # True
三、变量与数据类型
- 变量和赋值、输出函数print()
Python是一门弱类型语言,弱类型语言有两个典型特征:一是变量无需声明即可直接赋值,对一个第一次使用的变量赋值就相当于定义了一个新变量;二是变量的数据类型可以动态改变,取决于被赋值变量所引用的那个对象。
关于print()
函数:
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按
str()
方式进行转换为字符串输出;关键字参数
sep
是实现分隔符,比如多个参数输出时想要输出中间的分隔字符;关键字参数
end
是输出结束时的字符,默认是换行符\n
;关键字参数
file
是定义流输出的文件,可以是标准的系统输出sys.stdout
,也可以重定义为别的文件;关键字参数
flush
是立即把内容输出到流文件,不作缓存。三种简单的数据类型
整型(int
)
a = 1031
print(a, type(a))
# 1031 <class 'int'>
浮点型(float
)
print(1, type(1))
# 1 <class 'int'>
print(1., type(1.))
# 1.0 <class 'float'>
a = 0.00000023
b = 2.3e-7
print(a) # 2.3e-07
print(b) # 2.3e-07
对于浮点型,有时候我们想保留浮点型的小数点后 n
位。可以用decimal
包里的 Decimal
对象和 getcontext()
方法来实现。
import decimal
from decimal import Decimal
a = decimal.getcontext()
print(a)
# Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999,
# capitals=1, clamp=0, flags=[],
# traps=[InvalidOperation, DivisionByZero, Overflow])
getcontext()
显示了 Decimal
对象的默认精度值是 28 位 (prec=28
)
下面通过用 getcontext().prec
来调整精度
b = Decimal(1) / Decimal(3)
print(b)
# 0.3333333333333333333333333333
decimal.getcontext().prec = 4
c = Decimal(1) / Decimal(3)
print(c)
# 0.3333
布尔型(bool
)
print(True + True) # 2
print(True + False) # 1
print(True * False) # 0
- 类型转换
- 转换为整型
int(x, base=10)
- 转换为字符串
str(object='')
- 转换为浮点型
float(x)
四、位运算
- 原码、反码、补码
为了计算的方面(解决减法问题),计算机底层使用补码的形式保存所有整数。参考博客原码,反码,补码的深入理解与原理。整数的原码、反码、补码都一样;负数的反码是将原码的符号位不变,其他位全部取反,补码就是反码+1。(反码的另外一种计算方式,将原码自低位到高位,尾数的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。)
-
按位运算
1.按位非操作 ~~
把num
的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)有符号整数的符号位在~
运算中同样会取反。2.按位与操作 &
只有两个对应位都为 1 时才为 1
- 按位或操作 |
只要两个对应位中有一个 1 时就为 1
4.按位异或操作 ^
只有两个对应位不同时才为 1,异或满足交换律和结合律
5.按位左移操作 <<
num << i
将num
的二进制表示向左移动i
位所得的值。6.按位右移操作 >>
num >> i
将num
的二进制表示向右移动i
位所得的值。
- 位运算实现快速计算
1.计算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.通过 a & (-a)
快速获取a
的最后为 1 位置的整数。
00 00 01 01 -> 5
&
11 11 10 11 -> -5
---
00 00 00 01 -> 1
00 00 11 10 -> 14
&
11 11 00 10 -> -14
---
00 00 00 10 -> 2
- 位运算实现整数集合
一个数的二进制表示可以看作是一个集合(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)
- Python中
bin()
的输出
print(bin(3)) # 0b11
print(bin(-3)) # -0b11
print(bin(-3 & 0xffffffff))
# 0b11111111111111111111111111111101
print(bin(0xfffffffd))
# 0b11111111111111111111111111111101
print(0xfffffffd) # 4294967293
Python中bin
一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号.
Python中的整型是补码形式存储的。
Python中整型是不限制长度的不会超范围溢出。
所以为了获得负数(十进制表示)的补码,需要手动将其和十六进制数0xffffffff
进行按位与操作,再交给bin()
进行输出,得到的才是负数的补码表示。