pthon核心编程-读书笔记:知识点摘录与总结(方便理解和快速记忆)

本文是关于Python核心编程的读书笔记,涵盖了内存管理、解释性和编译性、Python集成开发环境、语言使用细节以及类和面向对象编程等方面。Python的列表、字典等内建数据结构强大且易于使用,简化了开发流程。Python的错误和异常处理机制允许高效调试,类和模块支持灵活的面向对象编程。文章还强调了Python的动态类型、内存管理和错误追踪,以及如何利用注释、帮助函数和文档字符串提高代码可读性。此外,讨论了函数、装饰器、生成器和模块导入等主题,最后提到了Python的下划线用法和类的特殊方法,如`__init__`和`super()`。
摘要由CSDN通过智能技术生成

Python 中的列表(大小可变的数组)和字典(哈希表)就是内建于语言本身的。在核心语言中提供这些重要的构建单元,可以鼓励人们使用它们, 缩短开发时间与代码量,产生出可读性更好的代码。C不提供, c++功能不够简洁。

 

面向对象,

可升级:Python 提倡简洁的代码设计、高级的数据结构和模块化的组件,确保灵活性、

一致性并缩短必要的调试时间

            扩展性:兼容扩展c和java

            易读写,易维护

健壮性:Python 提供了“安全合理”的退出机制, Python由于错误崩溃,解释程序就会转出一个“堆栈跟踪”,那里面有可用到的全部信息,包括你程序崩溃的原因以及是那段代码(文件名、行数、行数调用等等)出错了。这些错误被称为异常。如果在运行时发生这样的错误,Python能够监控这些错误并进行处理。描述错误的类型和位置,还能指出代码所在模块。

快速原型开发工具:Python 标准库是很完备的,如果你在其中找不到所需,那么第三方模块或包就会为你完成工作提供可能。

 

内存管理器

            内存管理是由 Python 解释器负责。C 或者 C++最大的弊病在于内存管理是由开发者负责的,会分散精力

 

解释性和(字节)编译性

类似于Java, Python是字节编译的,可以生成一种近似机器语言的中间形式,提升性能。

 

Python官网:http://python.org

本书网站:http://corepython.com

 

 

编译Python

Unix 中,可执行文件通常会将 Python 安装到/usr/local/bin 子目录下,而库文件则通常安装在/usr/local/lib/python2.x 子目录下

 

运行Python

命令行和脚本模式(解释器执行)

命令行选项:

-d      提供调试输出

-O      生成优化的字节码(生成 .pyo 文件)

-S      不导入 site 模块以在启动时查找 Python 路径

-v      冗余输出(导入语句详细追踪)

-m mod  将一个模块以脚本形式运行

-Q opt  除法选项(参阅文档)

-c cmd  运行以命令行字符串形式提交的 Python脚本

file    从给定的文件运行 Python 脚本(参阅后文)

脚本头部添加“#!/usr/local/bin/python”正确的安装位置,可以找到python,否则给出错误提示。或者借用unix下env环境变量设置

#!/usr/bin/envpython

设置好后,不用显式的调用Python 解释器,直接输入脚本名,脚本首行书写的启动指令会自动执行。

 

Python集成开发环境

      Eclipse,pycharm,idle等等,自己搜下.

 

Python语言使用细节总结
1、下划线(_)在解释器中有特别的含义

表示最后一个表达式的值。 所以上面的代码执行之后,下划线变量会包含字符串:

Python 用下划线作为变量前缀和后缀指定特殊变量

_xxx 保护变量不能用’from module import *’导入

__xxx__ 系统定义名字的专用方法

__xxx 类中的私有变量名

程序员避免用下划线作为变量名的开始。

“单下划线” 开头的成员变量叫做保护变量,是只有类对象和子类对象自己能访问到这些变量。这种变量不能直接访问,需通过类提供的接口进行访问,不能用“from xxx import *”而导入。

只以“双下划线”开头的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

以双下划线开头和结尾的如__foo__,是特殊方法标识,如 __init__()代表类的构造函数。

 

2、print 语句,与字符串格式运算符(  % )结合使用,

可实现字符串替换功能,类似C语言:

>>> print "%s is number %d!" % ("Python",1) 

Python is number 1!

 

3、Print 语句也支持将输出重定向到文件:     

符号 >> 用来重定向输出,将输出重定向到标准错误输出:

import sys

print >> sys.stderr, 'Fatal error: invalid input!'

import sys

print >> sys.stderr, 'Fatal error: invalid input!'    

 

            将输出重定向到日志文件的例子:

logfile =open('/tmp/mylog.txt', 'a')

print>> logfile, 'Fatal error: invalid input!'

logfile.close()

 

4、交互式解释器中获得帮助

            内建函数help()得到一个生疏函数的帮助,用函数名得到相应的帮助信息

>>>help(raw_input)

Help onbuilt-in function raw_input in module __builtin__:

 

raw_input(...)

raw_input([prompt])-> string

5、注释用#

  注意,文档字符串的特别注释,是运行时访问,用来自动生成文档,如def foo():

"This isa doc string."

return True

            函数名下一行,如果内容多,用三个单引号“’”,就可以跨行了

 

6、运算符

            +       -      *       /       //     %       **

两种除法运算符,单斜杠用作传统除法,双斜杠用作浮点除法(对结果进行四舍五入)

双星号(**)为乘方运算符,如3 ** 2结果为9

 

7、比较运算(返回布尔值True、False)

<       <=      >      >=      ==      !=     <>

8、逻辑运算符(and、or、not,返回布尔值)
9、变量和赋值

            不许类型关键字,直接复制

>>>miles = 1000.0

>>>name = 'Bob'

>>>counter = counter + 1

支持增量赋值

n = n * 10

n *= 10

不支持自增 1 和自减 1 运算符,--n 解释为-(-n) 从而得到 n , 同样 ++n 的结果也是 n.

 

10、五种基本数字类型

int (有符号整数)        

long (长整数) : 长整数后缀 “L”如 2001L

bool (布尔值)        

float (浮点值)        

complex (复数)    

Python 的长整数所能表达的范围远远超过 C 语言的长整数,事实上,Python 长整数仅受限于用户计算机的虚拟内存总数。如果你熟悉 Java, Python 的长整数类似于 Java 中的 BigInteger 类型。

True 会被当成整数值 1, 而 False则会被当成整数值 0

复数(包括-1 的平方根, 即所谓的虚数)在其它语言中通常不被直接支持(一般通过类来实现)。

decimal用于十进制浮点数。不是内建类型,需要导入decimal 模块,使用如字 1.1 无法用二进制浮点数精确表示

>>>1.1

1.1000000000000001

>>>print decimal.Decimal('1.1')

1.1

11、元组

可以看成是只读的列表。通过切片运算( [ ] 和 [ : ] )可以得到子集,这一点与字符串的使用方法一样。但切片得到的结果也是元组(不能被修改)

>>> aTuple = ('robots', 77, 93, 'try')

>>> aTuple

('robots', 77, 93, 'try')

>>> aTuple[:3]

('robots', 77, 93)

>>> aTuple[1] = 5

Traceback (innermost last):

File "<stdin>", line 1, in ?

TypeError: object doesn't support item assignment

 

12、循环中,for用法特殊

接受可迭代对象(例如序列或迭代器)作为其参数,每次迭代其中一个元素。如

for item in ['e-mail', 'net-surfing', 'homework','chat']:

print item

Python 提供了一个 range()内建函数来生成这种列表,满足for的需要,接受一个数值范围,生成一个列表:

>>>for eachNum in range(3):

print eachNum

            也可以用len()配合for i in range(len(foo))

            同时循环两个,enumerate()同时循环 索引和元素

     for i, ch in enumerate(foo):

print ch, '(%d)' % i

 

13、列表解析

在一行中使用一个 for 循环将所有值放到一个列表当中

>>>squared = [x ** 2 for x in range(4)]

>>>for i in squared:

print i

输出结果:

0

1

4

9

            更复杂如挑选出符合要求的值放入列表

sqdEvens = [x ** 2 for xin range(8) if not x % 2]

for i in sqdEvens:

print i

输出结果

0

4

16

36

14、列表、字符串、字典,自动对齐(统一用空格不容易出错)、if、while、文件的open()和file()功能简单,省略。

注意,file()内建函数,功能等同于 open(),这个名字可以更确切的表明它是一个工厂函数

 

15、属性

可以是简单的数据值,也可以是可执行对象,如函数和方法。

使用“.”访问对象属性,如object.attribute。

代码

filename = raw_input('Enter file name: ')

fobj = open(filename,'r')

for eachLine in fobj:

print eachLine,

fobj.close()

其中,使用逗号来抑制自动生成的换行符号。文件中的每行文本已经自带了换行字符, 如果我们不抑制 print 语句产生的换行符号, 文本在显示时就会有额外的空行产生。

但对于很大的文件来说, 上面的代码会占用太多的内存, 这时你最好一次读一行。

 

16、错误和异常

            遇到错误抛出的信息,迅速定位问题并进行调试

代码添加错误检测及异常处理,封装在 try-except 语句当中。except 之后是处理错误的代码。可以用raise直接抛出一个异常。

try:

filename = raw_input('Enter file name: ')

fobj = open(filename, 'r')

for eachLine in fobj:

print eachLine, fobj.close()

except IOError, e:

print 'fileopen error:', e

 

17、类

            class 关键字定义,提供一个可选的父类或者说基类; 如果没有合适的基类, 

那就使用 object 作为基类。class 行之后是可选的文档字符串, 静态成员定义, 及方法定

义。

classFooClass(object):

"""my very first class: FooClass"""

version = 0.1   # class (data)attribute

def __init__(self, nm='John Doe'):

"""constructor"""

self.name = nm  # class instance(data) attribute

print 'Created a class instance for', nm

defshowname(self):

"""display instance attribute and classname"""

print 'Yourname is', self.name

print 'My name is', self.__class__.__name__

defshowver(self):

"""display class(static) attribute"""

print self.version      #references FooClass.version

defaddMe2Me(self, x):  # does not use 'self'

"""apply + operation to argument"""

return x + x

其中定义了一个静态变量 version, 它将被所有实例及四个方法共享,__init__(), showname(), showver(), 及熟悉的addMe2Me(). 这些 show*()方法并没有做什么有用的事情,仅仅输出对应的信息。

__init__()方法,名字开始和结束都有两个下划线的方法都是特殊方法。这个方法用于类实例初始化时首先调用,类似构建函数。不过不象其它语言中的构建函数, 它并不创建实例--它仅仅是你的对象创建后执行的第一个方法。它的目的是执行一些该对象的必要的初始化工作。默认的__init__()方法什么都不做,可以覆盖重写。

每个方法都有的一个参数, self. 是类实例自身的引用。类似其他语言使用的this

 

18、模块导入用import
19、“PEP”(网站:http://python.org/dev/peps

PEP就是一个 Python 增强提案(Python Enhancement Proposal), 这也是在新版Python 中增加新特性的方式。不但提供了新特性的完整描述, 还有添加这些新特性的理由,如果需要的话, 还会提供新的语法、 技术实现细节、向后兼容信息等等。

 

20、实用的内建函数

dir([obj])      显示对象的属性,如果没有提供参数, 则显示全局变量的名字

type(obj)       返回对象的类型(返回值本身是一个 type 对象!)

int()

str()

help()

21、继续“\”

代码跨行写用反斜线 ( \ ),继续上一行

而分号 ( ; )将两个语句连接在一行中

22、缩进

使用四个空格宽度,避免使用制表符

23、赋值“=”

赋值并不是直接将一个值赋给一个变量,尽管其它语言编程如此。但Python中,对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用(并不是值)赋值给变量。

c语言中,赋值语句其实是被当成一个表达式(可以返回值),但python中不行,Python 的赋值语句不会返回值,非法语句如

>>> x = 1

>>> y = (x = x + 1)     # assignments not expressions! File"<stdin>", line 1

报错

y = (x = x + 1)

^

SyntaxError: invalid syntax

 

Python 不支持类似 x++ 或 --x 这样的前置/后置自增/自减运算

但支持增量赋值,运算符如下

+=      -=     *=      /=      %=     **=

<<=     >>=     &=     ^=      |= 

 

24、“多元”赋值

多个变量同时赋值,如x, y, z = 1, 2, 'a string'

交换两个变量值想x和y

x, y = 1, 2

x, y = y, x

25、python标示符:

            关键字

专用下划线标识符

_xxx    不用'from module import *'导入

__xxx__系统定义名字

__xxx   类中的私有变量名

避免用下划线作为变量名的开始,下划线对解释器有特殊的意义。

变量名_xxx被看作是“私有的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx__对Python 来说有特殊含义。

 

26、文档

通过obj.__doc__动态获得文档字串。在模块,类声明,或函数声明中第一个没有赋值的字符串可以用属性 obj.__doc__来进行访问,其中 obj是一个模块,类,或函数的名字。

 

27、代码风格

模块结构和布局,推荐的标准风格,如下

使用main()函数,检查__name__ 变量的值

28、__name__ 指示模块应如何被加载

如果模块是被导入, __name__ 的值为模块名字

如果模块是被直接执行, __name__ 的值为 '__main__'

 

29、内存管理

变量无须事先声明

变量无须指定类型

程序员不用关心内存管理

变量名会被“回收”

del 语句能够直接释放资源

            (1)动态类型

Python 语言中,对象的类型和内存占用都是运行时确定的。尽管代码被编译成字节码,Python 仍然是一种解释型语言。在创建事,也就是赋值时,解释器会根据语法和右侧的操作数来决定新对象的类型。

(2)内存分配

Python 解释器承担了内存管理的复杂任务,底层的事情放心交给 Python 解释器

 

30、引用计数

            Python创建对象,是作为引用来使用(赋值的),创建时在申请一个内存空间,同时为这个内存空间生成一个 引用计数器,来记录该对象的引用传递给了多少对象(也是,多少新对象指向它)。所以,x=2,在python中先生成一个值为2的内存空间,并生成对应的引用计数器值为0,再将其的引用传给对象x,内存空间2的引用计数器加1(为1),x=y时,y同样指向内存空间2,其计数器继续加1(为0)。

            书上说:Python 内部记录着所有使用中的对象各有多少引用。一个内部跟踪变量,称为一个引用计数器。当对象被创建时,就创建了一个引用计数,当不再需要时,引用计数变为0时,它被垃圾回收。

            引用计数器增加情况

(1)对象被创建

x = 3.14

(2)或另外的别名被创建

y = x

(3)或被作为参数传递给函数(新的本地引用)

foobar(x)

(4)成为容器对象的一个元素

myList = [123, x, 'xyz']

 

            引用计数器减少情况

(1)一个本地引用离开了其作用范围。如传入函数的fun(x),x在fun()结束后销毁,对应减1

(2)对象的别名被显式的销毁。

del y   # or del x

(3)对象的一个别名被赋值给其它的对象

x = 123

(4)对象被从一个窗口对象中移除

myList.remove(x)

(5)窗口对象本身被销毁

del myList      # or goes out-of-scope

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值