作者: Daniel Meng
GitHub: LibertyDream
博客:明月轩
变量即对某种类型数据实体的抽象,或者说给某个类型数据的实体起的名字。基本操作方式是var = xxx
。=
是赋值操作,注意,python里面不需要像Java一样的变量声明
[1,2,3,4,5,6]*3+[1,2,3]+[1,2,3,4,5,6]
A = [1,2,3,4,5,6]
print(A) # 打印A的值
B = [1,2,3]
A * 3 + B + A
0a = 2
a2 = 'f'
_2ab = '1'
b # 没定义过变量b,报错
B
a = '1'
a = 1
a = (1,2,3)
a = {1,2,3}
None = 'None'
int、str、tuple是值类型,是不可变的,每次赋值都会开辟新的空间进行存储。list、set、dict是引用类型,每个变量类似于一个“指针”,指向一个固定位置,修改一个会影响另一个。
a = {1,2,3}
b = a
a = 3
print(b)
print(a)
a = [1,2,3,4,5]
b = a
a[0] = '1'
print(a)
print(b)
进一步说明值类型不可变,测试一下str
我们自行命名的变量都保存在内存当中,函数id()
用于显示某个变量在内存中的地址
a = 'hello'
id(a)
a = a + 'python'
id(a)
'python'[0]
'python'[0] = 'm' # 尝试给字符串赋值
元组不可变,所以没有追加元素等操作。list等可变,所以能添加、删除、修改。
a = (1,2,3,[1,2,4])
a[2]
a[3][2]
a = (1,2,3,[1,2,['a','b','c']])
a[3][2][1]
a[2] = '3'
a[3][2] = '4'
print(a)
'hello' + ' world'
[1,2,3] * 3
3 - 1
3 / 2
3 // 2
5 % 2
2 ** 2
顾名思义,通过一些简单的运算(甚至没有),将数据赋予某个变量,操作的核心一定是落在赋值上
c = 1
c = c + 1
print(c)
c += 1
print(c)
b = 2
a = 3
b += a
print(b)
b -= a
print(b)
b *= a
print(b)
用于确定两个元素大小关系的运算符号。python并不是只有数字类型才能做大小比较,不同类型数据不能直接通过运算符比较大小。
'a' > 36
1 > 1
1 >= 1
a = 1
b = 2
a != b
单个字符比较ASCII码,字符串比较大小是对每一个对位字符进行大小比较。关系运算的重点是运算完成后返回的Boolean值
'a' > 'b'
'abc' < 'abd'
列表间的比较按照下列顺序进行:
[1,2,3] > [1,2]
[1,2,3] > [1,2,3]
[1,2,3] < [1,2,4] # 逐个比较元素,有一个为真即为真
(1,2,3) > (1,1,4)
特点:操作布尔值,返回布尔值。操作只有三种:与、或、非
True and True
True and False
True or False
False or False
not False
对于非布尔类型的判定方法:
1 and 1
'a' and 'b'
'a' or 'b'
not 'a'
not []
not [1,2]
not
操作返回的是显性的True和False。但and
和or
不一定
not []
not [1,2]
[1] or []
1 and 0
and
和or
结果显示遵循“扫描原则”,若当前位已能决定结果则返回当前位,否则继续
0 and 1
1 and 2
2 and 1
0 or 1
1 or 0
1 or 2
包括in
和not in
两个操作,用于判断成员是否属于某一个组
a = 1
a in [1,2,3,4,5]
b = 6
b in [1,2,3,4]
b not in (1,2,3,4,5)
b not in {1,2,3,4,5}
对于字典(dict)类型,in
和not in
操作比对的是key键
b = 'a'
b in {'c':1}
b = 1
b in {'c':1}
b = 'c'
b in {'c':1}
包括is
和not is
。用于判断符号左右两端是否“身份”相同
a = 1
b = 1
a is b
a = 2
a is b
a = 'hello'
b = 'world'
a is b
初看上述这些判别会误以为他和关系运算符(==)相同。但看下例会发现不同
a = 1
b = 1.0
a is b
a == b
身份运算符所谓“身份”,其实核对的是内存地址是否相同,不关心值是否相同,简单粗暴的说就是比对id()
值是否相同
a = 1
b = 1
id(a)
id(b)
a is b
a == b
b = 1.0
id(b)
a is b
a == b
对于set、tuple等也同样可以使用身份运算符
a = {1,2,3}
b = {2,1,3}
a is b
a == b
a = (1,2,3)
b = (2,1,3)
a is b
a == b
因为集合的无序性所以关系比较是相同的,元组无此特性故而关系比较结果为False
。同时因为每一个的内存地址都是特异的,所以他们都是身份独立的,互不相同。
python中一切皆对象
id()
,使用is判定type()
,使用isinstance判定值和身份判断上文已讲,这里说明一下类型判断
a = 'hello'
type(a) == int
type(a) == str
isinstance(a, str)
isinstance(a, int)
isinstance(a, (int, str, float))
isinstance(a, (int,float))
类型判断就是为了判定类型,可以用type(x)==bb
方式,但更推荐isinstance(x,(aa,bb,...))
方法,二者都返回布尔值。但后者可以判断x的子类是否属于某一种类型,而type()
不行
主要以按位与&
和按位或|
为代表,将数字当做二进制然后以每一位为独立单位进行运算(位运算)。
a = 2
b = 3
a & b
a = 2
b = 3
a | b
这里的与和或操作同中学数学,&
操作中当有一个为0时,结果为0。|
操作中当有一个为1时,结果为1
~
(非)按位取反,这一操作涉及到二进制补码。计算机中负数表示方法是符号位+补码
,获取其表示数需要摘出符号位(0为正,1为负),剩余部分取反加一。
>>
和<<
是对每一位进行移位运算,规则是向右移动时,高位补符号位,向左移动时,低位补0
a = 1
~a
a << 1
a = 3
a >> 1