Python学习Day06
列表的加法和乘法
>>> #列表的加法
>>> s = [1,2,3]
>>> t = [4,5,6]
>>> s + t
[1, 2, 3, 4, 5, 6]
>>> #列表的乘法
>>> s * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
嵌套列表
二维列表
>>> matrix = [[1,2,3],[4,5,6],[7,8,9]]
>>> matrix = [[1,2,3],
[4,5,6],
[7,8,9]]
>>> matrix
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> #上面描述二维列表的两种写法,第二种写法更加直观
用嵌套循环访问嵌套列表
>>> matrix
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> for i in matrix:
for each in i:
print(each,end = ' ')
print()
1 2 3
4 5 6
7 8 9
>>> #end=' '表示结尾处留个空格,与第一个for循环并列的print()表示换行
用下标索引法访问列表
>>> matrix
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> matrix[0]
[1, 2, 3]
>>> matrix[1]
[4, 5, 6]
>>> matrix[0][1]
2
>>> matrix[2][2]
9
通过循环创建和初始化二维列表
>>> A = [0] * 3
>>> for i in range(3):
A[i] = [0] * 3
>>> A
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
思考:
A和B是用两种方法创建的“相同“的二维列表,但是在给A和B中的某个元素赋值时,结果为什么不一样?
>>> B = [[0] * 3] * 3
>>> B
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> A[1][1] = 1
>>> B[1][1] = 1
>>> A
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]
>>> B
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]
is运算符—统一性运算符
用来检验两个变量是否指向同一个对象
>>> x = "Python"
>>> y = "Python"
>>> x is y
True
>>> x = [1,2,3]
>>> y = [1,2,3]
>>> x is y
False
上述代码说明:Python对于不同对象的存储机制是不一样的,字符串”Python“是不可变的,所有它只要在内存中开辟一个位置来存放就行了,如果有多个变量名指向同一个字符串,布尔值为True;相比起字符串,列表是可变的,尽管两个列表内容是一样的,Python也要为其开辟两个位置来存放
所以,我们可以针对上述A和B的问题,用is运算符给出解释:
>>> A[0] is A[1]
False
>>> A[1] is A[2]
False
>>> B[1] is B[0]
True
>>> B[1] is B[2]
True
>>> #由上可知,A的三行间的关系是不一样的,而B是一样的,所有能做到牵一发而动全身
A和B的关系图如下:
引用
Python并不是一个盒子,在给一个变量赋值时,Python并不是将数据放到变量里边去,而是将变量与数据进行挂钩,这个行为即为引用
将一个变量赋值给另一个变量,实际上就是将一个变量的引用传递给另一个变量
>>> x = [1,2,3]
>>> y = x
>>> x[1] = 1
>>> x
[1, 1, 3]
>>> y
[1, 1, 3]
x、y的关系图:
拷贝
使用拷贝可以得到两个独立的列表
浅拷贝
copy()
copy()函数作用于整个列表对象
>>> x = [1,2,3]
>>> y = x.copy()
>>> x[1] = 1
>>> x
[1, 1, 3]
>>> y
[1, 2, 3]
切片
>>> x = [1,2,3]
>>> y = x[:]
>>> x[1] = 1
>>> x
[1, 1, 3]
>>> y
[1, 2, 3]
深拷贝
浅拷贝只能用于处理简单的一维列表,但是如果涉及到嵌套对象,就要运用深拷贝
>>> x = [[1,2,3],[4,5,6],[7,8,9]]
>>> y = x.copy()
>>> x[1][1] = 0
>>> x
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>> y
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
浅拷贝只是拷贝了外层的对象,如果包含嵌套对象的话,那么拷贝的只是其引用。
copy模块
>>> import copy
>>> x = [[1,2,3],[4,5,6],[7,8,9]]
>>> y = copy.copy(x)
>>> x[1][1] = 0
>>> x
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>> y
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>> #copy模块中的copy只能实现浅拷贝
>>> x = [[1,2,3],[4,5,6],[7,8,9]]
>>> y = copy.deepcopy(x)
>>> x[1][1] = 0
>>> x
[[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>> y
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> #deepcopy函数将原对象拷贝的同时,也将对象中所有引用的子对象一并进行拷贝
列表推导式
引入问题:如何将一个只含数字的列表中的所有元素的值都变成原来的两倍
通常我们是运用下标索引法加循环的方法
>>> s = [1,2,3]
>>> for i in range(len(s)):
s[i] = s[i] * 2
>>> s
[2, 4, 6]
但是如果我们使用列表推导式,程序就会变得精炼,效率会更高
>>> s = [1,2,3]
>>> s = [i * 2 for i in s]
>>> s
[2, 4, 6]
列表推导式的基本语法:
[expression for target in iterable]
解释:
- 列表推导式的结果一定是个列表,所以要加括号
- 列表推导式的结果是使用一组数据来填充这个列表的,所以要用一个for语句来配合
- 在for语句的左侧是一组循环体
>>> x = [i for i in range(10)]
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x = [i+1 for i in range(10)]
>>> x
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> #首先这个for语句通过迭代,依次获得0到9十个整数,每一个迭代就会将数值存放到右边的i变量中,而最终放入列表中的元素是由for循环左侧的字符i来实现的。
>>> y = [c * 2 for c in "Python"]
>>> y
['PP', 'yy', 'tt', 'hh', 'oo', 'nn']
如果要将字符转化成对应的Unicode编码并保存为列表
可调用一个ord的内置函数
>>> code = [ord(c) * 2 for c in "Python"]
>>> code
[160, 242, 232, 208, 222, 220]
对二维列表进行操作
>>> matrix
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> col2 = [row[1] for row in matrix ]
>>> col2
[2, 5, 8]
>>> #获取列表的第二列元素
>>> diag = [matrix[i][i] for i in range(len(matrix))]
>>> diag
[1, 5, 9]
>>> #获取列表中主对角线上的元素
>>> diag = [matrix[i][abs(2-i)] for i in range(len(matrix))]
>>> diag
[3, 5, 7]
>>> #获取另一条对角线上的元素
高阶列表推导式
语法:
[expression for target in iterable if condition]
>>> even = [i for i in range(10) if i % 2 == 0]
>>> even
[0, 2, 4, 6, 8]
>>> even = [i+1 for i in range(10) if i % 2 == 0]
>>> even
[1, 3, 5, 7, 9]
>>> #由上述代码可知,列表推导式是先执行for语句再执行if语句最后执行i+1表达式
>>> #筛选其中以G开头的单词
>>> Gwords = [i for i in words if i[0] == 'G']
>>> Gwords
['Great', 'Good']
列表推导式的嵌套
语法:
[expression for target1 in iterable1
for target2 in iterable2
…
for targetN in iterableN]
>>> #将二维列表降级为一维列表
>>> matrix = [[1,2,3],[4,5,6],[7,8,9]]
>>> flatten = [col for row in matrix for col in row]
>>> flatten
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> #循环的实现
>>> flatten = []
>>> for row in matrix:
for col in row:
flatten.append(col)
>>> flatten
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [x + y for x in "PPAR" for y in "ppar"]
['Pp', 'Pp', 'Pa', 'Pr', 'Pp', 'Pp', 'Pa', 'Pr', 'Ap', 'Ap', 'Aa', 'Ar', 'Rp', 'Rp', 'Ra', 'Rr']
>>> #循环的实现
>>> _= []
>>> for x in "PPAR":
for y in "ppar":
_.append(x + y)
>>> _
['Pp', 'Pp', 'Pa', 'Pr', 'Pp', 'Pp', 'Pa', 'Pr', 'Ap', 'Ap', 'Aa', 'Ar', 'Rp', 'Rp', 'Ra', 'Rr']
KISS原则
全称:Keep It Simple & Stupid
简洁胜于复杂