Python宏观
一概念梳理:
1.变量:
变化的量.量:衡量,衡量状态的变化 程序执行的目的:替代人类执行重复复杂的运算,那么运行过程中数据是不停的变化的. 任何一个变量都有 id+type+value height=90 id:变量在内存中的地址,但是内存地址不利于记忆,于是有了变量名. 变量名映射变量 type:不同的状态用不同的数据类型去表示. 选择合适的数据类型是为了计算的方便. 例如:体重75KG,可以用str可以用int,但是前提是变化的量,还有可计算 字符串来标记体重的话,是不可以用来计算的! int可以用来计算 因此在写程序之前,你可以预见这个量是用来衡量何种状态(分数,体重,身高)的变化,给他合理的变量类型. 不同的变量类型------数据类型------有不同的方法,即数据的变化方式,例如算数运算,逻辑运算,容器类型元素的CRUD value:变量的值.就是指的字面量.
2.作用域:
是一种规则,不遵守导致程序bug或者无法运行
作用域:变量的生效范围 python只有两层作用域 1.局部作用域,即函数作用域 2.全局作用域 和js中的var一样,没有块级作用域 例如if for while中定义的变量都是全局作用域
3.namespace
确实存在的
交互界面输入 import this最后一行是 Namespaces are one honking great idea -- let's do more of those! namespace分了三层 内置ns 全局ns 前两个都是全局作用域 局部ns,只有调用函数的时候才有,函数结束就消失,是局部作用域 namespace的本质是dict 是许多的字典嵌套在一起 我的理解namespce是用来定位的 python一切皆对象,包是对象,py文件是对象,类是对象,函数是对象, 他们全是变量,而类名,函数名,对象名,包名不过是变量名而已. 通常代码里面找常见的函数,类等直接用变量名即可 但是找包名 模块名,再加上不同的包名下可能有同名py文件,同名的类名 ns是用来区分他们的. 1.内置ns:运行python代码,python解释器先启动,将内置的包 类 函数加载到内存,用包名,类名 函数名来映射它们在内存里面的地址,然后将他们放到内置ns中,即一个字典里面. 2.全局ns:加载你写的py文件,读取里面的变量,将他们装到一个字典里面,即全局ns中. 3.局部ns:运行py代码,遇到函数的时候开局部的ns,将局部的数据放到一个字典里面. 加载顺序是:内置ns--->全局ns----->局部ns 查找顺序是:由当前所处的ns,局部ns---->全局ns---->内置ns,按此顺序依次查找. 坑:享用内置的一个模块,但是你的全局ns中写了一个和内置ns中同名的,那么就不会用内置的而是用的你写的ns中的类.
局部ns相互独立,全局无法访问局部的
局部可以访问和修改全局的,局部用global声明全局变量,然后就可以修改了
但是十分不建议在局部修改全局的值,因为无感知!
nonlocal关键字,指的是找外层的变量,但是摸不到全局,用在函数嵌套里面.
4.魔法方法
python设计者定义的 你无法自定义魔法方法 无需主动调用魔法方法 有许多的"机关"来触发魔法方法 魔法方法是为了让类锦上添花 写出来的代码更加灵活多变! 不好的地方就是,你不熟悉魔法方法,看源码会懵逼 魔法方法+鸭子类型,成就了python isinstance()方法比较的是否属于一个大类, type()只能看对象的真面目 例如假设一个类B实现了__iter__()方法, 那么这个类创建的对象b,type(b)得到的是类 而isinstance(b,Itreable)得到的是true 可以将魔法方法视为java里面的接口,实现了这个接口的所有类就归于于这个接口类型 但是程序员不能自定义这个接口
5.python代码执行顺序
python hello.py 1.python解释器启动,将内置的包和模块进行加载解析.将解析结果放到内置ns中 2.python解释器去找hello.py文件在硬盘的位置,加载到内存当中.然后解析,结果放到全局ns中 3.解释器翻译执行hello.py代码, 解析.py文件,遇到def创建一个function对象,指向函数代码片段,但是不会执行. 只有第三阶段调用函数的时候,才会去执行function里面的代码. 因此解析阶段只会找到语法错误 至于逻辑错误只有运行阶段才会报