python学习笔记
一.python学习之输出重定向
Python 支持输出重定向。其主要的操作主要包括三个部分:
1、导入(sys模块)
2、保存标准输出(是为了在关闭重定向文件后能够直接返回到标准输出)
3、重定向
Import sys
save_out=sys.stdout
sys.stdout=open('testfile','w+')
二.Python下的数据类型
Python把类型本身当成对象,数据本身也当成对象,因此python中的赋值语句都是引用传递的,即:当对象被创建并赋值给变量时,都是将该对象的引用赋值给变量,然后会将该对象的引用计数设置为1.。Py thon中不存在自增自减操作符(++,--)等。
1.数字类型:(有符号整型,浮点型,复数)
2.字符串类型(不存在c语言中的字符类型(char))
3.列表类型(列表元素的个数及元素的值可以改变)
4.元组类型(元素的值是不可以改变的)
5.字典类型(映射数据类型:key值和 value值)
Python按照对象的存储模型将数据类型分为:原子(标量存储)类型和容器存储类型。
Python按照对象的值的可变性将对象数据类型分为:可变数据类型(列表和字典)和不可变数据类型(数字、字符串、元组)。、
Python按照对象的访问方式将对象数据类型分为:直接存取类型(非容器类型(所有数字类型))、顺
Python中的任何对象都包括3个属性:
1.身份(用于唯一标识自己的身份,可通过内建函数id()获得)(只读)
2.类型(数据类型)(只读)
3.值(对象的实际值(数据项))
Python提供is 和 is not 操作符来测试两个变量是否指向同一个对象。
三.Python下range函数、enumerate函数、zip函数
range函数以书中为例:p105,每次把位于字符串最后的一个字符砍掉。
>>> s='abcde'
>>> for i in range(len(s),0,-1):
print(s[:i])
abcde
abcd
abc
ab
a
range函数的原型为:range(start,end,step),默认情况下,start=0,step=1.xrange()函数是r
ange()函数的扩展,它支持比range()范围更大的值。
enumerate函数的用法:
for i,char in enumerate(s):
print(i,char)
0 a
1 b
2 c
3 d
4 e
5 f
zip 函数的用法:zip也和enumerate的用法一致,需要通过循环遍历,才能访问对应的返回值。
>>> a='123'
>>> b='abc'
>>> zip(a,b)
>>> for k,s in zip(a,b):
print(k,s)
1 a
2 b
3 c
四.Python下的浅拷贝
顺序访问类型的浅拷贝是默认类型拷贝。可以通过几种方式实施:
(1)完全的切片操作[:]
(2)利用工厂函数(dict( ). List( )等)
(3)使用copy函数
因此必须区分浅拷贝和直接引用的区别,浅拷贝是在如上三种条件下才会产生:(1)>>> person=['name',['savings',100]]
>>> hus=person
>>> wife=person
>>> id(hus),id(wife),id(person)
16783840,16783840,16783840
此时hus,wife,及person的id是相同的,这说明此时,仅仅是增加了person的引用数,因此,如果此时更改这3个值中的任意一个值,都会导致剩下的两个值改变。充分体现了应用传递的方式。
如:>>> hus[0]='tingfeng'
>>> wife[0]='bozhi'
>>> hus
['bozhi', ['savings', 100]]
>>> wife
['bozhi', ['savings', 100]]
(2)浅拷贝是新创建了一个类型跟原对象一样,该对象的内容是原来对象的引用,因此,在浅拷贝下,新对象的id必然会和原对象不同:
如:>>> person=['name',['savings',100]]
hus=person[:]
>>> wife=list(person)
>>> id(hus),id(wife),id(person)
16856008,16857608,16783840
同时,由于此时的对象是新创建的,对象的值是引用原来的,如果原来的对象元素是可变的,则改可变对象将引用原来对象对应的值,如果原来的对象元素是不可变的,则,在浅拷贝下,不可变对象将被显示拷贝,并新创建一个不可变对象,同时对应新对象的元素只是把它的引用复制一下,实际并不是它的成员。即:下例中,’tingfeng’并不是hus的成员,仅仅是引用。
如:>>> hus[0]='tingfeng'
>>> wife[0]='bozhi'
>>> hus,wife
(['tingfeng', ['savings', 100]], ['bozhi', ['savings', 100]])
>>> hus[1][1]=50
>>> hus,wife
(['t ingfeng', ['savings', 50]], ['bozh i', ['savings', 50]])
根据上例:,
在hus[0]和wife[0]赋值以前,hus和wife对象中各个元素的引用地址是相同的,即:改变前:>>> [id(x) for x in hus]
[11300512, 16858128]
>>> [id(x) for x in wife]
[11300512, 16858128]
当执行完>>> hus[0]='tingfeng',wife[0]='bozhi'操作后,hus和wife这两个列表对象中的元素的引用地址则发生了变化,即:
改变后:>>> [id(x) for x in hus]
[16918656, 16858128]
>>> [id(x) for x in wife]
[16865408, 16858128]
五.深拷贝
示例:>>> hus=person
>>> import copy
>>> wife=copy.deepcopy(person)
在浅拷贝中对可变对象引用相同值,因此,会出现如下情况:
>>> hus[1][1]=50
>>> hus,wife
(['t ingfeng', ['savings', 50]], ['bozh i', ['savings', 50]])
在深拷贝就可以实现:
>>> hus[1][1]=50
>>> hus,wife
(['t ingfeng', ['savings', 50]], ['bozh i', ['savings', 100]])
对于拷贝操作而言,需要注意:
(1)非容器类型没有拷贝一说,同时浅拷贝是用完全切片操作来完成的。
(2)如果元组变量只包含原子类型对象,对它的深拷贝将不会进行。
六.字典
字典的键值必须是可哈希的,因此,诸如:列表和字典这样的可变类型是不能作为键值的,因为它们不可哈希。
七.集合
集合被创建的唯一方法就是调用set()和frozenset()函数。
如:>>> s=set('abcdefg')
>>> s
{'a', 'c', 'b', 'e', 'd', 'g', 'f'}