Python学校Day06

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

简洁胜于复杂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值