为了打好python基础,特地重新看了python核心编程,把一些容易忽略但是比较重要的点做了摘录,放到这里分享
一:python 简介
二:python起步
列表解析
[x ** 2 for x in range(10)]
- 文件内建函数open(),file()
filea = open("a.txt",access_mode='r')
init() 方法
当一个类实例被创建时, init() 方法会自动执行, 在类实例创建完毕后执行, 类
似构建函数。init() 可以被当成构建函数, 不过不象其它语言中的构建函数, 它并不创
建实例--它仅仅是你的对象创建后执行的第一个方法。它的目的是执行一些该对象的必要的初
始化工作。通过创建自己的 init() 方法, 你可以覆盖默认的 init()方法(默认的
方法什么也不做), 从而能够修饰刚刚创建的对
常用函数
dir([obj]) 显示对象的属性,如果没有提供参数, 则显示全局变量的名字
help([obj]) 以一种整齐美观的形式 显示对象的文档字符串, 如果没有提供任何参数, 则会进入交互式帮助。
int(obj) 将一个对象转换为整数
len(obj) 返回对象的长度
open(fn, mode) 以 mode('r' = 读, 'w'= 写)方式打开一个文件名为 fn 的文件
range([[start,]stop[,step]) 返回一个整数列表。起始值为 start, 结束值为 stop - 1; start 默认值为 0, step默认值为1。
raw_input(str) 等待用户输入一个字符串, 可以提供一个可选的参数 str 用作提示信息。
str(obj) 将一个对象转换为字符串
type(obj) 返回对象的类型(返回值本身是一个 type 对象!)
三:pyton基础
模块
每一个 Python 脚本文件都可以被当成是一个模块。模块以磁盘文件的形式存在。模块里
的代码可以是一段直接执行的脚本,也可以是一堆类似库函数的代码,从而可以被别的模块导入(import)调用,如果要让一个文件夹变成模块,就需要添加init.py文件
python赋值
模块里
的代码可以是一段直接执行的脚本,也可以是一堆类似库函数的代码,从而可以被别的模块导
入(import)调用
python下划线标志符
_xxx 不用'from module import *'导入
__xxx__系统定义名字
__xxx 类中的私有变量名
避免用下划线作为变量名的开始
因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避
免用下划线作为变量名的开始。==一般来讲,变量名_xxx 被看作是“私有的”,在模块或类外不
可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名xxx对
Python 来说有特殊含义,对于普通的变量应当避免这种命名风格==。
python name属性
如果模块是被导入, name 的值为模块名字
如果模块是被直接执行, name 的值为 'main'
python ++内存管理++
引用计数
要保持追踪内存中的对象, Python 使用了引用计数这一简单技术。也就是说 Python 内部记录着所有使用中的对象各有多少引用。一个内部跟踪变量,称为一个引用计数器。当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的
引用计数变为 0 时, 它被垃圾回收。(严格来说这不是 100%正确,不过现阶段你可以就这么
认为)
5 垃圾收集
不再被使用的内存会被一种称为垃圾收集的机制释放。象上面说的, ==虽然解释器跟踪对象
的引用计数, 但垃圾收集器负责释放内存==。垃圾收集器是一块独立代码, 它用来寻找引用计
数为 0 的对象。它也负责检查那些虽然引用计数大于 0 但也应该被销毁的对象。 特定情形会导
致循环引用。
一个循环引用发生在当你有至少两个对象互相引用时, 也就是说所有的引用都消失时, 这
些引用仍然存在, 这说明只靠引用计数是不够的。 Python 的垃圾收集器实际上是一个引用计
数器和一个循环垃圾收集器。 ==当一个对象的引用计数变为 0,解释器会暂停,释放掉这个对象==
和仅有这个对象可访问(可到达)的其它对象。作为引用计数的补充, 垃圾收集器也会留心被
分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下
来, 试图清理所有未引用的循环
异常处理最适用的场合,是在没有合适的函数处理异常状况的时候。
这时程序员必须识别这些非正常的错误,并做出相应处理
四:python 对象
python使用对象来存储数据,构造任何类型的值都是一个对象,每个对象都有三个属性:
- id:每个对象的唯一标志符,使用id()得到
- type:该对象保存的值的类型,可以进行的操作
- value:对象表示的数据项
内建对象
- type
所有对象类型的类型都是type,它也是所有python类型对象的根和所有python标准对象的元类
- NULL对象的值为None
所有可用的对象都可以用于布尔测试,同类型可以比较大小,空对象,值为零的任何数字或者Null对象的None的布尔值都是False
-
内部类型
-
代码对象
代码对象是编译过的python源代码,他是可执行对象,通过调用内部exec和eval()内建函数来执行。代码对象本身不包含任何执行环境信息,他是用户自定义函数的核型,在被执行时动态获得上下文(事实上代码对象时函数的一个属性),一个函数除了有代码对象的属性之外,还有一些其他函数必须的属性,包括函数名,文档字符串,默认参数,全局命名空间等。
-
帧对象
帧对象表示 Python 的执行栈帧。帧对象包含 Python 解释器在运行时所需要知道的所有信
息。它的属性包括指向上一帧的链接,正在被执行的代码对象(参见上文),本地及全局名字空
间字典以及当前指令等。每次函数调用产生一个新的帧,每一个帧对象都会相应创建一个 C 栈
帧。用到帧对象的一个地方是跟踪记录对象 -
跟踪记录对象
当你的代码出错时, Python 就会引发一个异常。如果异常未被捕获和处理, 解释器就会
退出脚本运行,当异常发生时,一个包含针对异常的栈跟踪信息的跟踪记录对象被创建。如果一个异常有
自己的处理程序,处理程序就可以访问这个跟踪记录对 切片对象
当使用 Python 扩展的切片语法时,就会创建切片对象。扩展的切片语法允许对不同的索引
切片操作,包括步进切片, 多维切片,及省略切片。多维切片语法是 sequence[start1 : end1,
start2 : end2], 或使用省略号, sequence[...,start1 : end1 ]. 切片对象也可以由内建
函数 slice()来生成。步进切片允许利用第三个切片元素进行步进切片,它的语法为
sequence[起始索引 : 结束索引 : 步进值]。- 省略
省略对象用于扩展切片语法中,起记号作用。 这个对象在切片语法中表示省略号。类似
Null 对象 None, 省略对象有一个唯一的名字 Ellipsis, 它的布尔值始终为 True.- xrange
-
每个对象都天生具有一个计数器,记录它自己的引用次数。这个数目表示有多少个变量指
向该对象。这也就是我们在第三章 3.5.5-3.5.7 小节提到的引用计数。
==对象值的比较用标准运算符(>,< == 等),对象身份的比较用is 或者is not ,表示这两个对象内存地址的比较 等价于id(a)==id(b)==
Python 提供了 is 和 is not 运算符来测试两个变量是否指向同一个对象。
整数对象和字符串对象是不可变的对象,所以 Python 会很高效的缓存它们
foo1 = 4.3
foo2 = foo1
这个例子非常类似上一个,一个值为 4.3 的数值对象被创建,然后赋给一个变量, 当执行
foo2 = foo1 时, foo2 被指向 foo1 所指向的同一个对象, 这是因为 Python 通过传递引用来
处理对象。foo2 就成为原始值 4.3 的一个新的引用。 这样 foo1 和 foo2 就都指向了同一个对
象
foo1 = 4.3
foo2 = 1.3 + 3.0
这个例子有所不同。首先一个数字对象被创建,然后赋值给 foo1. 然后第二个数值对象被
创建并赋值给 foo2. 尽管两个对象保存的是同样大小的值,但事实上系统中保存的都是两个独
立的对象,其中 foo1 是第一个对象的引用, foo2 则是第二个对象的引用
==整数对象和
字符串对象是不可变对象,所以 Python 会很高效的缓存它们==
Python 仅缓存简单整数,因为它认为在 Python 应用程序中这些小整数会经常被用到。当
我们在写作本书的时候,Python 缓存的整数范围是(-1, 100),不过这个范围是会改变的,所
以请不要在你的应用程序使用这个特性。
Python 2.3 中决定,在预定义缓存字符串表之外的字符串,如果不再有任何引用指向它,
那这个字符串将不会被缓存。也就是说, 被缓存的字符串将不会象以前那样永生不灭,对象回
收器一样可以回收不再被使用的字符串。从 Python 1.5 起提供的用于缓存字符的内建函数
intern() 也已经不再推荐使用, 即将被废弃。
标准内建对象
- type
- cmp()
内建函数 cmp()用于比较两个对象 obj1 和 obj2, 如果 obj1 小于 obj2, 则返回一个负整
数,如果 obj1 大于 obj2 则返回一个正整数, 如果 obj1 等于 obj2, 则返回 0。 - str()和 repr() (及
运算符) 内建函数 str() 和 repr() 或反引号运算符(
) 可以方便的以字符串的方式获取对象的
内容、类型、数值属性等信息。str()函数得到的字符串可读性好, 而 repr()函数得到的字符
串通常可以用来重新获得该对象, 通常情况下 obj == eval(repr(obj)) 这个等式是成立的。
这两个函数接受一个对象做为其参数, 返回适当的字符串 - type() 和 isinstance()
int 现在
既是一个类型又是一个类。我们可以使用 isinstance() 函数来让我们的 if 语句更方便,并具
有更好的可读性
标准类型的分类
如果让我们最啰嗦的描述标准类型,我们也许会称它们是 Python 的“基本内建数据对象原
始类型”。
- “基本”,是指这些类型都是 Python 提供的标准或核心类型。
- “内建”,是由于这些类型是 Python 默认就提供的
- “数据”,因为他们用于一般数据存储
- “对象”,因为对象是数据和功能的默认抽象
- “原始”,因为这些类型提供的是最底层的粒度数据存储
- “类型”,因为他们就是数据类型
不过, 上面这些描述实际上并没有告诉你每个类型如何工作以及它们能发挥什么作用。事
实上, 几个类型共享某一些的特性,比如功能的实现手段, 另一些类型则在访问数据值方面
有一些共同之处。我们感兴趣的还有这些类型的数据如何更新以及它们能提供什么样的存储。
有三种不同的模型可以帮助我们对基本类型进行分类,每种模型都展示给我们这些类型之间的
相互关系。这些模型可以帮助我们更好的理解类型之间的相互关系以及他们的工作原理。
存储模型:
我们对类型进行分类的第一种方式, 就是看看这种类型的对象能保存多少个对象。Python
的类型, 就象绝大多数其它语言一样,能容纳一个或多个值。一个能保存单个字面对象的类型
我们称它为原子或标量存储,那些可容纳多个对象的类型,我们称之为容器存储。
所有的 Python 容器对
象都能够容纳不同类型的对象
以存储模型为标准的类型分类
- 存储模型
- 分类 --------- Python 类型
- 标量/原子类型 数值(所有的数值类型),字符串(全部是文字)
- 容器类型 列表、元组、字典
更新
另一种对标准类型进行分类的方式就是, 针对每一个类型问一个问题:“对象创建成功之
后,它的值可以进行更新吗?
- 可变对象允许他们的值被更新,而不可变对象则不允许他们的值被更改。
更新模型
- 分类 Python 类型
- 可变类型 列表, 字典
- 不可变类型 数字、字符串、元组
访问模型
尽管前面两种模型分类方式在介绍 Python 时都很有用, 它们还不是区分数据类型的首要模
型。对这种目的,我们使用==访问模型==。也就是说==根据访问我们存储的数据的方式对数据类型进
行分类==。在访问模型中共有三种访问方式:直接存取,顺序,和映射
- 对非容器类型可以直接访问。所有的数值类型都归到这一类
- 序列类型是指容器内的元素按从 0 开始的索引顺序访问。一次可以访问一个元素或多个元
素, 也就是大家所了解的切片(slice)。 字符串, 列表和元组都归到这一类。 我们前面提到过,
Python 不支持字符类型,因此,虽然字符串是简单文字类型,因为它有能力按照顺序访问子字
符串,所以也将它归到序列类型 - 映射类型类似序列的索引属性,不过它的索引并不使用顺序的数字偏移量取值, 它的元素
无序存放, 通过一个唯一的 key 来访问, 这就是映射类型, 它容纳的是哈希键-值对的集合