Python 序列容易忽视的知识点
文章主要记录了条件和循环中的一些自己忽视的知识点,和一些自己在应用过程中出现的错误,系统的对这部分知识进行梳理与补充
一、序列
参考文献
成员有序排列,并且可以通过下标偏移量访问到它的一个或者几个成员。
访问模式:单个元素通过指定偏移量的方式得到,多个元素可以通过切片操作的方式一次得到。
1.序列类型操作符
- 成员关系操作符 in、not in
- 连接操作符+
string1+sring2
list1+list2
tuple1+tuple2
s+=t
```
-
重复操作符*
str*4可以看作str+str+str+str
str='123abc'
str*=3
print str
123abc123abc123abc
*操作符也可以用于嵌套列表
list=[1,2,3]
lista=[list]*3
lista[1][1]=100
'''lista是多少?可能并不是你想的那样'''
print lista
lista[[1,100,3],[1,100,3],[1,100,3]]
```
下面这幅图说明了原因,在处理可变序列时要谨慎:)
- 切片操作符[]、[:]、[::]
[start:end)
包含开始的元素,不包含结束的元素
start和end均是可选的,如果没有提供或者用None作为索引值,切片操作会从序列的最开始到结束
[start:end:step]
start,start+1step.start+istep...
2.内建函数
- 类型转换
list()
str()
tuple()
用于各种序列之间的类型转换,但是没有进行真正的类型转换。这3个函数实际上是工厂函数,将对象作为参数,并将其对象浅拷贝到新生成的对象中。
- 可操作
3.字符串
参考文献
字符串是不可变类型,改变一个字符串中的元素,需要创建一个新的字符串,并对其进行操作
- 序列操作符切片
string='abcedef'
slice1=string[None:]
slice2=string[:None]
slice3=string[:]
>>slice1='abcdef'
>>slice2='abcdef'
>>slice3='abcdef'
删除string后,slice1并没有受到影响:
slice1=string[None:]
slice2=string[0:3]
slice1 is string
>>True
del string
print slice1
>>'abcdef'
print slice2
>>'abc'
直到删除了所有指向’abcdef‘的变量,其占用的内存被释放
slice1=string 没有指向该对象的变量 slice2=string[0:3]-
格式化操作符%
‘ % ’只适用于字符串类型,支持C语言中printf()函数的字符串格式化。
Python支持两种格式的输入参数:
- 元组
'MM/DD/YY=%02d/%02d%03d' % (2,15,67)
- 字典
键是作为格式化字符串出现的。
'there are %(howmany)d %(lang)s Quotation Sysbols' % {'lang':'Python','howmany':3}
格式字符串既可以用作向终端用户输出数据,又可以用来合并字符串形成新字符串,通过使用操作符的辅助命令,可以对需要显示的值的格式进行修改。
格式化操作符辅助命令
下面是一些例子:
浮点型
'%d' % 12.34
>>12
'%.1f' % 12.34
>>12.3
整形和字符串
'MM/DD/YY=%02d/%02d%03d' % (2,15,67)
>>'MM/DD/YY=02/15/067
4.列表
- 序列操作符切片
listA=[1,2,3,4,5]
slice1=listA[:]
slice2=listA
slice3=list(lisAt)
listA
listB=[1,2,3,[4,5]]
slice1=listB[:]
slice2=listB
slice3=list(listB)
由下图可知,改变listB中的1,2,3,只有slice2受到影响。但是改变4,5,slice1、slice2、slice3均会受到印象,因为它们当中均存放着[4,5]的引用,而不是完全拷贝的独立对象。
listB通过上面的分析,我们需要引起注意在使用列表作为函数参数时是很容易忽略这一点的,由于函数对列表不是深拷贝而只是引用了该列表的内存空间,所以一旦后续的操作对作为参数的列表进行修改,那么引用该列表的变量都会发生改变,这是非常糟糕的现象,而且很难被发现。因为虽然该列表可能是函数内的局部变量,可是因为一直有对象引用它,所以它占用的内存空间不会被释放和清理。比如下面的这段程序:
formTitle='a form name'
formPostion=(x,y)
col0=[]
col1=[]
for formx_row in range(row+3,sheet.nrows):
col0.append(sheet.cell_value(formx_row-1,col))
col1.append(Param.float_to_int(sheet.cell_value(formx_rolw-1,col+1)))
excel_ddrport.set_ddrport(formTitle,formPostion,col0,col1)
虽然程序中循环多次,试图把不同内容作为元组填入一个列表中,但是由于col0,col1是列表,所以最后生成的列表中col0,col1的值都是一样的,而且是最后一此退出循环时,col0,col1的值,而formTitle是字符串,每次对它的浅拷贝均会创建一个新的对象,所以formTitle是正确的。
- 序列类型函数
- enumerate()
- zip()
5.元组
- 创建一个只有一个元素的元组
需要在元组分隔符里面加一个逗号(,),防止跟普通的分组操作符混淆
atuple=(1,)
- 元组的可变性
通过list()、tuple()函数,元组与列表间可以相互转换
atuple=(1,2,3)
alist=list(atuple)
print alist
>>[1,2,3]
- 序列操作符切片
同列表