- Python中单下划线和双下划线
>>> class MyClass():
... def __init__(self):
... self.__superprivate = "Hello"
... self._semiprivate = ", world!"
...
>>> mc = MyClass()
>>> print mc.__superprivate
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: myClass instance has no attribute '__superprivate'
>>> print mc._semiprivate
, world!
>>> print mc.__dict__
{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}
__foo__
:一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突。
_foo
:一种约定,用来指定变量私有。
__foo
:这个有真正的意义:解析器用_classname__foo
来代替这个名字,以区别和其他类相同的命名。
- Python自省
自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr(),hasattr(),isinstance().
- 面向过程和面向对象编程的区别
面向对象是将事物高度抽象化。
面向过程是一种自顶而下的编程。
面向对象必须先建立抽象模型,之后直接使用模型就行了。
举例:
面向对象: 狗,吃(屎)
面向过程: 吃,(狗,屎)
总结:
面向对象= 多态 + 继承 = 先抽象,后具体;
面向过程= 分解问题 + 逻辑为先 = 先细节,在整体。
- 切片
>>> shoplist = ['apple', 'mango', 'carrot', 'banana']
>>> shoplist[::1]
['apple', 'mango', 'carrot', 'banana']
>>>shoplist[::2]
['apple', 'carrot']
>>> shoplist[::-1]
['banana', 'carrot', 'mango', 'apple']
>>> shoplist[开始位置:结束位置:步长]
- xrange和range的区别
range:
range(start, stop, step), range会直接生成一个list。
xrange:
用法与range完全相同,不同的是所生成的不是一个数组,而是一个生成器。
>>> a = range(10)
>>> b = xrange(10)
>>> print type(a), type(b)
<type 'list'> <type 'xrange'>
xrange做循环的性能比range好,尤其返回很大的时候
尽量永xrange,除非要返回一个列表。
- Python中浅拷贝和深拷贝的区别
首先,对赋值操作要有如下认识:
- 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址(旧瓶装旧酒)。
- 修改不可变对象(str, tuple)需要开辟新的空间。
- 修改可变对象(list等)不需要开辟新的空间。
浅拷贝仅仅复制了容器中元素的地址
>>> a=['hello',[1,2,3]]
>>> b=a[:]
>>> [id(x) for x in a]
[55792504, 6444104]
>>> [id(x) for x in b]
[55792504, 6444104]
>>> a[0]='world'
>>> a[1].append(4)
>>> print(a)
['world', [1, 2, 3, 4]]
>>> print(b)
['hello', [1, 2, 3, 4]]
浅拷贝是在另一块地址中创建一个新的变量或容器,但是容器内的元素的地址均是源对象的元素的地址的拷贝。也就是说新的容器中指向了旧的元素( 新瓶装旧酒 )。
深拷贝,完全拷贝了一个副本,容器内部元素地址都不一样
>>> from copy import deepcopy
>>> a=['hello',[1,2,3]]
>>> b=deepcopy(a)
>>> [id(x) for x in a]
[55792504, 55645000]
>>> [id(x) for x in b]
[55792504, 58338824]
>>> a[0]='world'
>>> a[1].append(4)
>>>
>>> print(a)
['world', [1, 2, 3, 4]]
>>> print(b)
['hello', [1, 2, 3]]
深拷贝是在另一块地址中创建一个新的变量或容器,同时容器内的元素的地址也是新开辟的,仅仅是值相同而已,是完全的副本。也就是说( 新瓶装新酒 )。