判断变量引用对象是否相等
is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
可修改对象和不可修改对象
可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。
可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。
总结
string, int, float
string 是不可变对象,sequence。
int, float 是不可变对象,非sequence。
list
list 是一种有序列表。
list 是可更改对象。
list 可以存储任意类型元素
tuple
tuple 是一种有序列表。
tuple 是不可更改对象。
tuple 可以存储任意类型元素。
set 集合
set 是一种无序列表。
set 是可更改对象。
set 只能存储不可变类型。
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
序列
tuple, string, list是sequence
set, dictionary是非sequence
3.1 list遍历
L = range(1, 101)
L[1:2] # 表示从索引1取到索引2(不包含2
L[2::3] # 表示从索引2开始取,每隔3个取一个
L[2:50:5] # 表示从索引2 开始取到索引50,每隔5个取一个
3.2 dict迭代
dict除了values()方法外,还有一个 itervalues() 方法,用 itervalues() 方法替代 values() 方法,迭代效果完全一样。
那这两个方法有何不同之处呢?
1. values() 方法实际上把一个 dict 转换成了包含 value 的list。
2. 但是 itervalues() 方法不会转换,它会在迭代过程中依次从 dict 中取出 value,所以 itervalues() 方法比 values() 方法节省了生成 list 所需的内存。
在一个 for 循环中,能否同时迭代 key和value?
items() 方法把dict对象转换成了包含tuple的list,我们对这个list进行迭代,可以同时获得key和value:
和 values() 有一个 itervalues() 类似, items() 也有一个对应的 iteritems(),iteritems() 不把dict转换成list,而是在迭代过程中不断给出 tuple,所以, iteritems() 不占用额外的内存。
包的引用方式
使用这种方式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可以是类,函数或者变量的名字。
import sound.effects.wavred
当使用from package import item
这种形式的时候,对应的item既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数,类或者变量。
单下划线、双下划线、头尾双下划线说明:
__foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
装饰器
Python的 decorator
本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。
使用 decorator
用Python提供的 @ 语法,这样可以避免手动编写 f = decorate(f)
这样的代码。
def log(f):
def fn(*args, **kwargs):
print('call', f.__name__, '()...')
return f(*args, **kwargs)
return fn
@log
def cal(x):
return x*x
print(cal(3))