一、基本运算符
除了Python学习笔记(一)中提到的“+”、“-”、“*”、“/”、“//”、“%”等运算符,还包括以下:
① or、and、not,布尔或、布尔与、布尔非;
② is、is not,同一性判断,判断是否为同一个对象;
③ <、<=、>、>=、!=、==,比较值是否相当,可以连用
④ | 、^、&,按位或、按位异或、按位与
⑤ <<,>> 移位
⑥~ 按位翻转
⑦ +,-,*,/,//,% 加、减、乘、浮点除、整数除、取余
⑧**,幂运算
其中,
异或^指的是,若两数相同为0,不相同为1。
若想打印二进制表示方法,可用bin()。
<<左移1位相当于乘以2,左移2位相当于乘以4。
>>右移1位相当于除以2。
加法操作
(1)数字相加,3+2,5
(2)字符串拼接,“3”+“2”,"32"
(3) 列表、元组等合作,[10,20,30]+[5,10,100],[10,20,30,5,10,100]
乘法操作
(1)数字相乘, 3*2, 6
(2)字符串复制,“sxt” *3, "sxtsxtsxt"
(3)列表、元组等复制,[10,20,30]*3, [10,20,30,10,20,30,10,20,30]
二、复合赋值运算符
复合赋值可以让程序更加精炼,提高效率。
1、 +=,加法赋值/字符串拼接,sum+=n; a +="sxt", sum=sum+n; a = a+"sxt"
2、 -=,减法赋值,num -=n,num = num - n
3、 *=,乘法赋值,a *=b,a = a*b
4、 /=,浮点除赋值,a/=b,a = a/b
5、 //=,整数除赋值,a//=b,a =a//b
6、 %=,取余赋值,a%=b,a = a%b
7、 **=,幂运算赋值,a**=2,a=a**2
8、 <<=,左移赋值,a<<=2, a=a<<2
9、 >>=,右移赋值,a>>=2,a=a>>2
10、 &=,按位与赋值,a&=b,a=a&b
11、|=,按位或赋值,a|=b,a=a|b
12、^=,按位异或赋值,a^=b, a=a^b
注意:与C和Java不一样,Python不支持自增(++)和自减(--)
三、运算符优先级问题
优先级如下,从高到底
1、 **,指数(最高优先级)
2、~,按位翻转
3、* / % // ,乘、除、取模、取整数
4、+ -,加法减法
5、>> <<,右移,左移运算符
6、&,位“and”
7、^ |,位运算符
8、<= < > >=,比较运算符
9、< > == !=,等于运算符
10、= %= /= //= -= += *= **=,赋值运算符
11、is is not,身份运算符
12、in not in,成员运算符
13、not or and,逻辑运算符
实际使用中,记住如下简单的规则即可,复杂的表达式一定要使用小括号组织。
① 乘除优先加减
② 位运算和算术运算>比较运算符>赋值运算符>逻辑运算符
第3章 序列
序列是一种数据存储方式,用来存储一系列的数据。在内存中,序列就是一块用来存放多个值的连续的内存空间。比如一个整数序列[10,20,30,40],可以这样示意表示:
由于python 3中一切皆对象,在内存中实现是按照如下方式存储的:
a=[10,20,30,40]
从图示中,我们可以看出序列中存储的是整数对象的地址,而不是整数对象的值。
python中常用的序列结构:字符串、列表、元组、字典、集合。
一、列表简介
列表:用于存储任意数目、任意类型的数据集合
列表是内置可变序列,是包含多个元素的有序连续的内存空间。列表定义的标准语法格式:
a = [10, 20, 30, 40]
其中,10,20,30,40这些称为:列表a的元素。
列表中的元素可以各不相同,可以是任意类型。比如:
b = [10, 20, 'abc', True]
列表对象的常用方法:
1、 list.append(x),增加元素,将元素x增加到列表list尾部
2、 list.extend(alist),增加元素,将alist所有元素加到列表list尾部
3、 list.insert(index,x),增加元素,在列表指定位置index处插入元素x
4、 list.remove(x),删除元素,在列表list中删除首次出现的指定元素x
5、 list.pop([index]),删除元素,删除并返回列表list指定为止 index处的元素,默认是最后一个元素
6、 list.clear(),删除所有元素,删除列表所有元素,并不是删除列表对象
7、 list.index(x),访问元素,返回第一个x的索引位置,若不存在x元素抛出异常
8、 list.count(x),计数,返回指定元素x在列表list中出现的次数
9、 len(list),列表长度,返回列表中包含元素的个数
10、list.reverse(),翻转列表,所有元素原地翻转
11、list.sort(),排序,所有元素原地排序
12、list.copy(),浅拷贝,返回列表对象的浅拷贝
python的列表大小可变,根据需要随时增加或缩小
字符串和列表都是序列类型,一个字符串是一个字符序列,一个列表是任何元素的序列。
二、列表的创建
1、基本语法[]创建
a=[10,20,'carol','sxt']
a=[] #创建一个空的列表对象
2、list()创建
使用list()可以将任何可迭代的数据转化成列表
a=list() #创建一个空的列表对象
a=list(range(10))
a=[0,1,2,3,4,5,6,7,8,9]
a=list("abc")
a=["a","b","c"]
3、range()创建整数列表
range()可以帮助我们非常方便的创建整数列表,语法格式为
range([start,] end [,step])
start参数:可选,表示起始数字。默认是0。
end参数:必选,表示结尾数字。
step参数:可选,表示步长,默认为1。
python3 中 range()返回的是一个range对象,而不是列表。我们需要通过list()方法将其转换成列表对象。
典型示例如下:
list(range(3,15,2))
[3,5,7,9,11,13]
list(range(15,3,-1))
[15,14,13,12,11,10,9,8,7,6,5,4]
list(range(3,-10,-1))
[3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9]
4、推导式生成列表
a=[x*2 for x in range(5)] #循环创建多个元素
a=[0, 2, 4, 6, 8]
a=[x*2 for x in range(100) if x%9==0]
a=[0, 18, 36, 54, 72, 90, 108, 126, 144, 162, 180, 198]
三、列表元素的增加
当列表增加和删除元素时,列表会自动进行内存管理,大大减少了程序员的负担。但这个特点涉及列表元素的大量移动,效率较低。除非必要,我们一般只在列表尾部添加元素或删除元素,这样会大大提高列表的操作效率。
1、append()方法
原地修改列表对象,是真正的列表尾部添加新的元素,速度最快,推荐使用。
a = [20, 40]
a.append(80)
a = a[20, 40, 80]
2、+运算符操作
并不是真正的尾部添加元素,而是创建新的列表对象;将原列表的元素和新列表的元素依次复制到新的列表对象中。这样,会涉及大量的复制操作,对于操作大量元素不建议使用。
a=[20,40]
id(a) 46016072
a=a+[50]
id(a) 46015432
3、extend()方法
将目标列表的所有元素添加到本列表的尾部,属于原地操作,不创建新的列表对象。
a=[20,40]
id(a) 46016072
a.extend([50, 60])
id(a) 46016072
4、insert()插入元素
使用insert()方法可以将指定元素插入到列表对象的任意指定位置。这样会让插入位置后面所有的元素进行移动,会影响处理速度。涉及大量元素时,尽量避免使用,类似发生这种移动的函数还有:remove()、pop()、del(),它们在删除非尾部元素时也会发生操作位置后面元素的移动。
a=[10, 20, 30]
a.insert(2, 100)
a=[10, 20, 100, 30]
5、乘法扩展
使用乘法扩展列表,生成一个新列表,新列表元素时原列表元素的多次重复。
a=['sxt', 100]
b=a*3
b=['sxt', 100, 'sxt', 100, 'sxt', 100]
适用于乘法操作的,还有:字符串、元组。
四、列表元素的删除
1、del 删除
删除列表指定位置的元素。(实际上是数组元素的拷贝。)
a=[10, 20, 30]
del a[1]
a = [10, 30]
2、pop()方法
pop()删除并返回指定位置元素,如果未指定位置则默认操作列表最后一个元素。(相当于弹出最后一个/指定位置元素。)
a = [10, 20, 30, 40, 50]
a.pop() 50
3、remove()方法
删除首次出现的指定元素,若不存在该元素抛出异常。(这里不是索引,直接操作内容)
a=[10, 20, 30,40, 50, 20,30]
a.remove(20)
a=[10, 30,40, 50, 20,30]
五、列表元素访问和计数
5.1 通过索引直接访问元素
索引的区间在[0,列表长度-1]这个范围。超过这个范围则会抛出异常。
5.2 index()获得指定元素在列表中首次出现的索引
index()可以获取指定元素首次出现的索引位置。语法是:index(value, [start, [end]])。其中,start和end 指定了搜索的范围。
a =[10, 20, 30, 40, 50, 20, 30, 20, 30]
a.index(20)
1
a.index(20, 3) #从索引位置3开始,往后搜索的第一个20
5
a.index(30, 5, 7) #从索引位置5到7这个区间,第一次出现30元素的位置
6
5.3 count()获得指定元素在列表中出现的次数
a = [10, 20, 30, 40, 50, 20, 30, 20, 30]
a.count(20)
3
5.4 len()返回列表长度
len()返回列表长度,即列表中包含元素的个数
a = [20, 30, 30]
len(a) = 3
5.5 成员资格判断
判断列表中是否存在指定的元素,我们可以使用count()方法,返回0则表示不存在,返回大于0则表示存在。但是,一般会使用更加简洁的in关键字来判断,直接返回True或False。
a = [10, 20, 30, 40, 50, 20, 30, 20, 30]
20 in a
True
100 not in a
True
六、切片操作
切片是Python序列及其重要的操作,使用于列表、元组、字符串等。切片的格式如下:
切片slice操作可以让我们快速提取子列表或修改。标准格式为:[起始偏移量 start:终止偏移量 end[:步长 step]]
注意:当步长省略时顺便可以省略第二个冒号
6.1 典型操作(三个量为正数的情况下)如下:
1、[:] ,提取整个列表,[10, 20, 30][:], [10, 20, 30]
2、[start:]从start索引开始到结尾, [10, 20, 30][1:], [20, 30]
3、[:end]从头开始直到end-1, [10, 20, 30][:2], [10, 20]
4、[start:end]从start到end-1, [10, 20, 30, 40][1:3], [20, 30]
5、[start:end:step]从start提取到end-1,步长是step,[10, 20, 30, 40, 50, 60, 70][1:6:2], [20, 40, 60]
6.2 其他操作(三个量为负数)的情况:
1、 [10, 20, 30, 40, 50, 60, 70][-3:], 倒数三个 , [50, 60, 70]
2、[10, 20, 30, 40, 50, 60, 70][-5:-3], 倒数第五个到倒数第三个(包头不包尾), [30, 40]
3、[10, 20, 30, 40, 50, 60, 70][::-1],步长为负,从右到左反向提取,[70, 60, 50, 40, 30, 20, 10]
切片操作时,起始偏移量和终止偏移量不在[0, 字符长度-1]这个范围,也不会报错。起始偏移量小于0则会当做0,终止偏移量大于“长度-1”会被当成“长度-1”。
七、列表的遍历
for obj in listObj:
print(obj)
八、列表排列
8.1 修改原列表,不建新列表的排序
a=[20, 10, 30, 40]
id(a)=46017416
a.sort() #默认是升序排序
a=[10, 20, 30, 40]
a.sort(reverse=True) #降序排列
a=[40, 30, 20, 10]
import random
random.shuffle(a) #打乱顺序
a = [20, 40, 30, 10]
8.2 建新列表的排序
可以通过内置函数sorted()进行排序,这个方法返回新列表,不对原列表做修改。
a=[20, 10, 30, 40]
id(a) = 46016008
a = sorted(a) #默认升序
a = [10, 20, 30, 40]
c = sorted(a, reverse=True) #降序
8.3 reversed()返回迭代器
内置函数reversed()也支持进行逆序排列,与列表对象 reverse()方法不同的是,内置函数reversed()不对原列表做任何修改,只是返回一个逆序排列的迭代器对象。
a = [20, 10, 30, 40]
c = reversed(a)
list(c) = [40, 30, 20, 10 ] #该迭代器只能用一次,第二次返回空列表。
单独打印出c,发现提示是:list_reverseiterator,也就是一个迭代对象。同时,我们使用list(c)进行输出,发现只能使用一次。第一次输出了元素,第二次为空。那是因为迭代对象在第一次时已经遍历结束了,第二次不能再使用。
九、列表相关的其他内置函数汇总
9.1 max和min
用于返回列表中最大和最小值
a = [3, 10, 20, 15, 9]
max(a) = 20
min(a) = 3
9.2 sum
对数值型列表的所有元素进行求和操作,对非数值型列表运算则会报错。
a = [3, 10, 20, 15, 9]
sum(a) = 57
十、多维列表
10.1 二维列表
一维列表可以帮助我们存储一维、线性的数据。
二维列表可以帮助我们存储二维、表格的数据。
a= [["高小一", 18, 30000, "北京"], ["高小二", 19, 20000, "上海"], ["高小三", 20,10000, "深圳"]]
a[0][1]=18
a= [["高小一", 18, 30000, "北京"], ["高小二", 19, 20000, "上海"], ["高小三", 20,10000, "深圳"]]
for m in range(3):
for n in range(4):
print(a[m][n],end="\t") #打印完一行,换行
print()
高小一 18 30000 北京
高小二 19 20000 上海
高小三 20 10000 深圳