学习内容概括:
1、变量、运算符与数据类型
2、位运算
具体学习内容:
一、 变量、运算符与数据类型
注释
"""
这是多行注释,用三个双引号
这是多行注释,用三个双引号
这是多行注释,用三个双引号
"""
print('hello china')
# hello china
'''
这是多行注释,用三个单引号
这是多行注释,用三个单引号
这是多行注释,用三个单引号
'''
print('hello china')
# hello china
运算符
1、算术运算符
print(2 + 3)
print(2 - 3)
print(2 * 3)
print(2 / 3)
print(2 // 3)
print(3 % 2)
2、比较运算符
print(3 > 2)
print(3 < 4)
print(3 == 3)
print(3 != 4)
print(3 <= 4)
print(3 >= 2)
3、逻辑运算符
print((3>2) and (4>3))
print((4>5) or (6 < 7))
print(not (4>5))
4、位运算符
print(bin(~2))
print(bin(4&5))
print(bin(4 | 5))
print(bin(4 ^ 5))
print(bin(4 >> 1))
print(bin(4 << 1))
5、三元运算符
x,y = input(),input()
max = x if x > y else y
print(max)
6、其它运算符
letters = ['a','b','c']
if 'a' in letters:
print('a' + 'exists')
if 'A' not in letters:
print('A' + ' not exists')
a = ['hello']
b = ['hello']
print(a is b,a == b)
c = 'hello'
d = 'hello'
print(c is d, c == d)
注意:
- is 和 is not 对比的是两个变量的内存地址
- == 和 != 对比的是两个变量的值
即二者比较与内存地址有关
- 如不可变地址(str),二者无差异
- 如是可变类型(list,tupple,set,dict)等,二者不同
7、运算符的优先级
变量和赋值
- 在使用变量之前,需要对其先赋值。
- 变量名可以包括字母、数字、下划线、但变量名不能以数字开头。
- Python变量名是大小写敏感的,foo != Foo。
数据类型与转换
可以使用decimal包中的Decimal控制精确度
decimal.getcontext().prec = 5
c = Decimal(1) / Decimal(3)
print(c)
获取类型信息,比较类型是否相同,有两种方法
- type() 不会认为子类是一种父类类型,不考虑继承关系。
- isinstance() 会认为子类是一种父类类型,考虑继承关系。(推荐)
print函数
主要学习sep参数和end参数
shoplist = ['apple','mango','carrot','banana']
print("This is printed with 'end='&''.")
for item in shoplist:
print(item,end = "&")
shoplist = ['apple','mango','carrot','banana']
print("This is printed with 'sep='&''.")
for item in shoplist:
print(item,"another string",sep = '&')
二、位运算
前面的学习对于我来说,尚算简单,之前学python基础时,有学过,当然本身也不难。
但位运算,就我而言是比较难的,主要是教程比较简单,看得一头雾水,没有方向,抓不住重点,然后百度了一些见解后,才算入门这块知识。
在学习位运算之前,如果了解以下几点,应该就比较容易入门了。
- 按位运算,顾名思义,是按位置计算
- 计算机进制的了解以及相互转换(主要是二进制)
- 进制有三种不同的表达形式:原码、反码、补码
- 位运算都是基于补码操作的
- Python中bin一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号
print(bin(3)) # 0b11
print(bin(-3)) # -0b11
所以,在进行位运算时,先得到的是反码。
1、按位非操作
~
把num
的补码中的 0 和 1 全部取反(0 变为 1,1 变为 0)有符号整数的符号位在 ~
运算中同样会取反。
print(~3) # -4
3的二进制是00000011
(以8位为例,不足用0补齐),因为计算机操作的是反码,所以先要转换,不过正数的反码、补码都是原码,所以我们直接取反即可,得到11111100
,此时注意,得到的仍然是补码,而且符号位是1,是负数了,先转换为反码,即补码-1
,得到11111011
,再转为原码,即取反,符号位不变,得到10000100
,即-4
.
2、按位与操作
即相同位置都是1为1,否则为0
3 & 4 # 0
3的补码是00000011
,4的补码是00000100
,按位置看,无同为1的,所以是00000000
3、按位或操作
相同位置有1个1就为1,否则为0
3 | 4 # 7
3的补码是00000011
,4的补码是00000100
,即00000111
,转为10进制则为7.
4、按位异或操作
相同位置不同则为1,否则为0
异或满足交换律和结合律
m ^ 0 = m
m ^ m = 0
3 ^ 4 # 7
3的补码是00000011
,4的补码是00000100
,即00000111
,转为10进制则为7
5、按位左移
num << i
,num
按位左移i
位,右边补0
7 << 2 # 28
7的补码是00000111
,左移两位,即00011100
,转为十进制,即2**4+2**3+2**2=28
6、按位右移
num >> i
,num
按位右移i
位,左边补0
7 >> 2 # 1
7的补码是00000111
,右移两位,即00000001
6、利用位运算实现整数集合
学会此部分重点是需要理解交集、并集、合集、差集的概念。
实际上插入,可以看成是求并集,删除是求差集。
学习过程遇到的问题和解决方法
主要就是位运算不太理解。
位运算
- Q:不知道二进制与十进制的转换
- A:二进制转十进制,模仿十进制即可;十进制转二进制,利用除2取1
- Q:不知道计算机是对补码进行操作
- A:学会原码、反码与转码即可。
总而言之,遇到问题百度以下,你就知道,多看几个人写的内容,总会遇到解释符合自己理解能力的。
总结
1、三元运算符,可以简化代码
2、is
,is not
是判断内存地址;==
,!=
是判断数值
3、运算符级别较多,习惯用小括号
4、变量名对大小写敏感,命名只支持字母、数字、下划线且不能以数字开头
5、decimal包中的Decimal对象和getcontext()方法可以控制精确度
6、bool
- 对于数值变量, 0 , 0.0 都可认为是空的。
- 对于容器变量,里面没元素就是空的。
7、判断数据类型是否相同,建议用isinstance() > type()
8、计算机内部是用补码表示的,正数和0,原码、反码、补码都是本身。
负数的原码,是其绝对值的原码在其符号位上变为1,反码是符号位不变,其余位取反,补码是反码+1
9、位运算都是基于补码运算,按位非操作,会操作符号位。