记录博客 ZH-BLOG

字符串和元组

时间:2018-07-16 17:02:25分类:python

字符串和列表实际上很相似,只要你认为字符串是单个文本字符的列表。对列表的许多操作, 也可以作用于字符串:按下标取值、 切片、 用于 for 循环、 用于 len(), 以及用于 in 和 not in 操作符。

>>> name='markerjson'
>>> name[0]
'm'
>>> name[-1]
'n'
>>> 'json' in name
True
>>> for s in name:
print("***"+s)

***m
***a
***r
***k
***e
***r
***j
***s
***o
***n

可变和不可变数据类型

列表和字符串在一个重要的方面是不同的。列表是“可变的” 数据类型,它的值可以添加、 删除或改变。但是, 字符串是“不可变的”, 它不能被更改。

>>> name[0]='a'
Traceback (most recent call last):
  File "", line 1, in 
	name[0]='a'
TypeError: 'str' object does not support item assignment

'改变' 一个字符串的正确方式, 是使用切片和连接。构造一个“新的” 字符串, 从老的字符串那里复制一些部分。

>>> name='this is a book'
>>> newName=name[:8]+'the'+[9:]
SyntaxError: invalid syntax
>>> newName=name[:8]+'the'+name[9:]
>>> newName
'this is the book'

元组数据类型

除了两个方面,“元组” 数据类型几乎与列表数据类型一样。首先, 元组输入时用圆括号(), 而不是用方括号[]。元组与列表的主要区别还在于,元组像字符串一样, 是不可变的。

>>> eggs=('hello',42,0.5)
>>> eggs
('hello', 42, 0.5)
>>> eggs[0]
'hello'
>>> eggs[0:3]
('hello', 42, 0.5)
>>> len(eggs)
3
>>> eggs[0]=0
Traceback (most recent call last):
  File "", line 1, in 
	eggs[0]=0
TypeError: 'tuple' object does not support item assignment
>>> del eggs[0]
Traceback (most recent call last):
  File "", line 1, in 
	del eggs[0]
TypeError: 'tuple' object doesn't support item deletion
>>> eggs
('hello', 42, 0.5)

如果元组中只有一个值, 你可以在括号内该值的后面跟上一个逗号, 表明这种情况。 否则, python 将认为, 你只是在一个普通括号内输入了一个值。逗号告诉 python, 这是一个元组。

>>> type(('hello'))

>>> type(('hello','hw'))

>>> type(('hello',))


用 list()和 tuple()函数来转换类型

>>> eggs
('hello', 42, 0.5)
>>> list(eggs)
['hello', 42, 0.5]
>>> eggs
('hello', 42, 0.5)
>>> eggs=list(eggs)
>>> eggs
['hello', 42, 0.5]
>>> tuple(eggs)
('hello', 42, 0.5)
>>> eggs
['hello', 42, 0.5]
>>> eggs=tuple(eggs)
>>> eggs
('hello', 42, 0.5)

引用

当你将列表赋给一个变量时,实际上是将列表的“引用”赋给了该变量。变量包含对列表值的引用, 而不是列表值本身。但对于字符串和整数值,变量就包含了字符串或整数值。<span class="cblue">当列表或字典赋值变量时,python 就使用引用。

对于不可变的数据类型的值,例如字符串、整型或元组, python 变量就保存值本身。

传递引用:当函数被调用时, 参数的值被复制给变量。对于列表(以及字典),这意味着变量得到的是引用的拷贝。

def appendColor(ns):
	ns.append('green')
	print(ns)

def ts():
	color=['blue','yellow','red']
	appendColor(color)
	print(color)

ts()

['blue', 'yellow', 'red', 'green']
['blue', 'yellow', 'red', 'green']

copy 模块的 copy()和 deepcopy()函数

copy.copy() 可以用来复制列表或字典这样的可变值,而不只是复制引用。

deepcopy() 函数将同时复制它们内部的列表。

>>> spam=[1,2,3]
>>> name=spam
>>> name.append(4)
>>> spam
[1, 2, 3, 4]
>>> name
[1, 2, 3, 4]
>>> import copy
>>> name=copy.copy(spam)
>>> name
[1, 2, 3, 4]
>>> name[0]=10
>>> name
[10, 2, 3, 4]
>>> spam
[1, 2, 3, 4] ## copy之后spam没有被修改
>>> spam=[[1,2,3],[4,5,6]]
>>> name=spam
>>> name.append([7,8,9])
>>> spam
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> name=copy.copy(spam)
>>> name.append([10,11,12])
>>> name
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
>>> spam
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] ## copy之后第一层数据没有被修改
>>> name[0][0]=10 ## 修改第二层数据
>>> spam
[[10, 2, 3], [4, 5, 6], [7, 8, 9]] ## copy之后第二层数据被修改了
>>> name=copy.deepcopy(spam) ## 深度copy,内部列表将都会以值的形式复制
>>> name
[[10, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> name[0][0]=1 ## 修改第二层数据
>>> name
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> spam ## deepcopy后不再受影响
[[10, 2, 3], [4, 5, 6], [7, 8, 9]]

字符图网格

## 假定有一个列表的列表, 内层列表的每个值都是包含一个字符的字符串, 像这样:
## grid = [['.', '.', '.', '.', '.', '.'],
## ['.', 'O', 'O', '.', '.', '.'],
## ['O', 'O', 'O', 'O', '.', '.'],
## ['O', 'O', 'O', 'O', 'O', '.'],
## ['.', 'O', 'O', 'O', 'O', 'O'],
## ['O', 'O', 'O', 'O', 'O', '.'],
## ['O', 'O', 'O', 'O', '.', '.'],
## ['.', 'O', 'O', '.', '.', '.'],
## ['.', '.', '.', '.', '.', '.']]
## 认为 grid[x][y]是一幅“图” 在 x、 y 坐标处的字符, 该图由文本字符组
## 成。 原点(0, 0)在左上角, 向右 x 坐标增加, 向下 y 坐标增加。
## 复制前面的网格值, 编写代码用它打印出图像。
## ..OO.OO..
## .OOOOOOO.
## .OOOOOOO.
## ..OOOOO..
## ...OOO...
## ....O....

def pgrid():
	grid = [['.', '.', '.', '.', '.', '.'],
		['.', 'O', 'O', '.', '.', '.'],
		['O', 'O', 'O', 'O', '.', '.'],
		['O', 'O', 'O', 'O', 'O', '.'],
		['.', 'O', 'O', 'O', 'O', 'O'],
		['O', 'O', 'O', 'O', 'O', '.'],
		['O', 'O', 'O', 'O', '.', '.'],
		['.', 'O', 'O', '.', '.', '.'],
		['.', '.', '.', '.', '.', '.']]
	r=len(grid)
	c=len(grid[0])
	for m in range(0,c):
		for n in range(0,r):
			print(grid[n][m],end='')
		print()

pgrid()