《python学习手册》第四版,了解一下

python学习手册第四版
记录了部分重要的地方
有些在其他的代码中
如有疏漏,还请指正

对象分类

对像根据分类来共享操作
只有可变对象可以在原处修改,数字、字符串、元组都不能在原处修改

bytearray字符串类型是可变的

集合:类似于一个无值的字典的键,不能映射为值,没有顺序,frozenset是集合的一个不可变的版本
如图

list、dict、tuple 可以包含任何种类的对象,可以任意的嵌套
list、dict 可以动态的扩大和缩小

赋值和拷贝

赋值操作是对存储对象的引用,不是拷贝
赋值操作会产生相同对象的多个引用
这些引用共享同一个存储对象

拷贝操作
没有限制的分片表达式 l[:] 能够复制序列
字典拷贝 dict.copy()
内置函数 list() 能够生成拷贝
copy标准库模块能够生成完整拷贝

比较

== 操作符测试值的相等性
is 测试对象的一致性

数字通过比较大小
字符串按照字典顺序
list、tuple 从左到右对每部分的内容进行比较

1 true

如图

内置类型分类

赋值语句

赋值语句建立对象引用值
变量名在首次赋值时会被创建
变量名在引用前必须先赋值
执行隐式赋值的一些操作

元素合并extend 速度最快

命名原则
单下划线开头的变量名,不会被from module import * 语句导入
变量名没有类型,对象有

del 析构函数 不能传参 最后自动执行 ,关闭数据库连接的时候

两个下划线开始的变量 为私有变量

break 跳出最近所在的循环

continue 跳到最近所在循环的开头处,跳过本次循环

pass 占位语句

else 只有当循环正常离开时才会执行

14

python中任何类对象都为是可迭代的,
调用__next()__方法
该方法结束时会有StopIterator异常
readlines 一次把整个文件加载到内存

内置的next函数会调用一个对象的__next__方法

函数

def 是可执行的代码
def是要给可以执行的语句。
函数并不存在,直到python运行了def后才存在

def创建了一个对象并将其赋值给某一变量名

lambda创建一个对象将其作为结果返回
return将一个结果对象发送给调用者

yield 向调用者发回一个结果对象
记住它离开的地方
在生成器函数中可以通过yield语句来返回值
挂起它们的状态以便稍后能够恢复状态

global声明了一个模块级的变量并被赋值

nonlocal 声明一了将要赋值的一个封闭的函数变量

函数是通过赋值(对象引用)传递的

参数,返回值以及变量并不是声明
函数中并没有类型约束

多态

函数中表达式的意义去取决于传入参数的类型
这种依赖类型的行为称为多态
操作的意义取决于被操作对象的类型
python的每个操作都是多态的操作,*

如果传递的对象不支持这种预期的接口,
表达式运行时回检测到错误,
自动抛出一个异常
这也是python和静态类型语言重要的不同之处
可以认为是为对象编写接口,而不是数据类型

作用域

python创建、改变货查找变量名都是在所谓的命名空间中进行的
变量的作用域指的就是命名空间

函数还为程序增加了一个额外的命名空间层
一个函数的所有变量名都是与函数的命名空间相关联的

一个def内定义的变量名都能够被def内的代码使用
不能在函数的外部引用

def内的变量名与def之外的变量名并不冲突

一般情况,
一个变量的作用域总是由在代码中赋值的地方所决定

函数定义了本地作用域
模块定义的是全局作用域
内嵌的模块是全局作用域,每个模块都是一个全局作用域

全局作用域的作用范围仅限于单个文件

赋值的变量名除非声明为全局变量或本地变量,否责均为本地变量

变量名引用氛围三个作用域进行查找
首先是本地
函数内
全局
内置

全局声明和非本地声明将赋值的变量名映射到模块文件内部的作用域

L本地作用域
E上一层的def 或lambda作用域
G全局作用域
B内置作用域

变量名使用前必须先赋值

内置作用域是通过一个名为__buildin__

def 内不增加global 或者nonlocal声明
没有办法在函数中改变函数外部的变量

nonlocal 中列出的名称必须在一个嵌套的def中提前定义过,否则将产生错误
nonlocal意味着它们位于一个嵌套的def中
作用域查找只限定在嵌套的def
nonlocal名称只能出现在嵌套的def中
不能在模块的全局作用域中

nonlocal主要作用是允许嵌套的作用域中的名称被修改,不只是被引用

global使得作用域查找从嵌套的模块的作用域开始
对全局名称的赋值总是在模块的作用域中创建或修改它们

nonlocal限制作用域查找只是嵌套的def
要求名称已经存在
并且允许对它们赋值
作用域查找不会继续到全局或内置作用域

模块导入

import a from a

imp.reload 不中止程序的情况下,一种重新载入模块文件代码的方法

代码重用
系统命名空间的划分
实现共享服务和数据

import过程

1、找到模块文件
模块搜素路径
程序的主目录、pythonpath目录、标准链接库目录、存在的.pth文件的内容 =》sys.path
2、编译成位码(看情况)
检查文件的时间戳

3、执行模块的代码来创建其定义的对象

只有在第一次导入时才会进行

模块文件
源代码文件 .py
字节码文件 ,pyc
目录,包导入
编译扩展模块
c编写的编译好的内置模块
zip文件组件
内存内映像,frozen可执行文件
jpython Java类

模块的源代码文件再导入时
自动生成模块对象
模块的源代码会在导入时运行
一次一条语句
这个过程中赋值的所有变量名都会生成模块对象的属性

模块的创建
.py结尾的文件都会被自动认为是python模块

当导入时,会把内部模块名映射到外部文件名
通过把模块搜索路径中的目录路径加在前边
.py添加在后边
\modulename.

import 和from都是隐性的赋值语句

import 将整个模块对象赋值给一个变量名

from将一个或多个变量名赋值给另一个模块中同名的对象
并不会对模块名本身进行赋值

实际修改另一个文件中的全局变量名,必须使用import

文件名生成命名空间

模块语句会在首次导入时执行
顶层的赋值语句会创建模块属性
模块的命名空间能通过属性__dict__ 或dir 获取
模块时一个独立的作用域

内部模块命名空间是作为dict对象进行存储的

reload
模块会动态加载
只能用在python编写的模块中
reload是python 的内置函数,而不是语句
传给reload的是已经存在的模块对象,而不是变量名
使用需要先导入

init.py 文件是用于声明和初始化模块包的
第一次在进程中导入某目录时
自动运行这个文件中的代码
赋值的变量会变成对应于该目录在内存中所创建的模块对象的属性
没有这个文件的话
无法通过包语法导入目录

使用import 语句的as扩展功能,把路径改为较短的别名

读取定义在一个路径的相同变量名时
必须通过import来使用包

from xxx import xxx 是绝对导入

from . import xxx 是相对导入

隐藏模块中的变量 _xxx 在导入的时候不会将这些变量复制出来
all 则是复制出所有的变量名

文件是以顶层程序文件执行,在启动时,name__就会设置为字符串__main

文件被导入 __name__就会改设成为客户端所了解的模块名

可以使用这个进行代码测试

if name ==‘main
test

修改模块搜索路径

sys.path.append

添加到系统路径

import modulename as name
导入之后使用别名 name

模块是对象:元程序

模块通过内置的属性显示了特性
编写程序来管理其他程序
这类管理程序为元程序 metaprogram
也称为内省introspection

程序能看见和处理对象的内部

模块设计理念
总是在python模块内编写代码

模块耦合要降到最低:全局变量
最大化模块的黏合性:统一目标
模块应该少去修改其他模块的变量

python是从头到尾执行的语句的
顶层代码的语句次序不能混乱

from复制变量名,不是链接
from语句其实是在导入者的作用域内对变量名的赋值语句
也就是变量名拷贝运算,不是别名

reload不会影响from导入

用过字符串导入所引用的模块时
创建import语句并通过exec执行
把字符串名传给__import__

修改sys.path只会影响一个正在运行的程序

类通过继承进行定制
超类列在类开头的括号中
类从其超类中继承属性
实例会继承所有可读取类的属性
每个object.attribute 都会开启新的独立的搜索
逻辑的修改是通过创建子类,而不是修改超类

子类覆盖父类的方法,这种取代属性的动作成为重载

内省工具
就是特殊的属性和函数,允许访问对象实现的一些内部机制

instance.class__属性提供了一个从实例到创建它的类的链接
类有一个___name

还有一个__base__序列,提供超类的访问
__dict__可以获取的对象的属性和值 map形式

方法的第一个参数总是接收方法调用的隐性主体,也就是实例对象

类接口技术

super 定一个method函数及在子类种期待一个动作的delegate

inheritor 没有提供任何新的变量名,就获得super中定义的一切内容

replacer 用自己的版本覆盖super 的method

extender 覆盖并回调默认的method 从而定制super 的method

provider 实现super的delegate 方法预期的action方法

变量名的作用域
模块属性
函数内的本地变量
类属性
方法中的本地变量
实例属性

类的三种相关方法
实例方法:实例对象调用的方法

静态方法:静态方法调用时不需要实例参数
处理类本地的数据

类方法:处理对层级中的每个类不同的数据

装饰器 decorator

替函数明确了特定的运算模式
将函数包裹了另一层
在另一函数的逻辑实现
类装饰器直接绑定到类模式
并且它们的用途与元类有所重叠

函数装饰器时写成一行
在def语句之前

由@符号后面跟着所谓的元函数metafunction组成
这个元函数可以时自己定义的

@staticmethod # 静态装饰器

相当于注解的样式

这里写图片描述

这里写图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值