python学习笔记

python学习笔记
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'}

相关主题
相关文档
最新文档