第一章 开始
模块文件
1python 在import 或者from import的时候回执行一次文件。但是只执行一次。不同的文件如果同时引用同一个文件,也只会执行一次。并且获得该文件的顶层的名字
可以使用reload函数在执行一次文件
dir
dir不带任何参数的话返回的是当前交互环境空间内所有定义的名字
自己理解 就是所有可用的名字,因为我from import 里面的名字也在
环境变量
python 模块查函路径 pythonpath 用于import 的时候的查找
python交互式启动文件路径 pythonstartup
比较,相等性和真值
python 的比较’==’ 回自动使用递归判断
is 判断的是同一个对象
赋值生成引用,而不是拷贝
分片只是生成了一个顶层对象的copy。
list2= list1[:]
重复也只是直接赋值引用不是copy
x=y*4 只是引用
元组和列表的赋值是从左到右依次赋值
while else
while 循环 只有在没有break的情况下才会 执行else。
函数
global是把名字映射到包含他的模块的名字空间里面
函数查找的层次 先局部,次之全局,再次之内置
不提供嵌套的作用域
var =1
def f1():
var =2
f2()
def f2():
print var
f1() #输出1
函数的参数匹配是从左到右依次匹配。函数第一个参数必须提供
1可变参数匹配没有被匹配的位置匹配参数(*name)在一个元祖中和关键字参数(**name)在一个字典中
2调用中,关键字参数必须在非关键字参数之后
3定义中位置任意匹配在默认值之后,关键字任意匹配在最后
lambda表达式
lambda 参数1,参数2,。。参数n:使用的表达式
apply
调用任意函数
apply(函数名,参数元祖)
函数的局部变量值是在编译的时候决定的。并不是在运行的时候
x =99
def f():
print x
x =88
f中会在导入文件的时候决定x是局部变量然后真正执行print的时候会因为局部变量x没有复制所以导致出错
嵌套的函数对嵌套他的函数里面的变量没有任何访问权。LGB规则。
解决方法就是把外层函数的变量变成默认函数传入到内层函数里面
默认对象是在定义的时候初始化。并不是每次调用的时候都会初始化
def server(x=[]):
x.append(1)
print x
要避免这种定义的话需要用这种方式
def server(x=None)
if x is None:
x= []
x.append(1)
print x
模块
导入模块之后。生成一个模块对象。所有顶层名字都会成为模块对象的属性。
在模块内部。模块的名称空间是一个__dict__
的字典变量
重载模块reload
模块只在第一次import 的时候回加载。之后只是单纯的复用。如果需要重新加载那么就要用reload
reload执行之后影响所有的import用户 影响所有将来使用from的用户。之前使用from的用户保留原有的旧代码
模块中名字为单下划线或者双下划线大头的名字在from* 中是不会被包含进来的。
在python程序内部可以直接使用sys .path变量改变python查找模块的路径
内置的’import’ 函数以一个字符串作为参数然后加载相应的模块返回一个模块对象
python类的内置的函数操作
__init__
__repr__ 打印转换
__call__
__getattr__ 属性引用
__getitem__索引的
__setitem__
__getslice__分片
__len__ len(x)
__cmp__ x==y x<y
多重继承
python是从左到右的深度优先的搜索一个名字。
如果超类中有多个相同的名字。那么使用遇到的第一个。如果想引用被隐藏的名字。那么要使用超类的名字加点来进行引用
Lgb规则同样适用于类
对于嵌套类来说无法访问外层类的东西
解决方法就是加入一个self变量