第一章:
Python是一种面向对象的脚本语言。Python是用可移植的ANSIC写成的,可以运行在各个平台。
动态类型:使用对象时,不需要复杂的类型和大小的声明。
内置的对象类型:提供常用的数据结构,列表(list),字典(dictionary),字符串(string)既有弹性有益于使用。
内置工具:处理这些对象,python提供功能强大的,标准的操作,包括合并(concatenation),片段(slice),排序(sort),映射(map)等等。
还有库软件,第三方软件,自动内存管理,大型程序的支持。
Python程序可以通过C或C++写成的组件进行扩展,也可以嵌入到C/C++程序中。
Python上有一个可移植的SQL数据库API,可在不同数据库下运行。
dir()函数:不带参数时,返回当前范围内的变量,方法和定义的类型列表;带参数时,返回函数的属性,方法列表。日过参数包含方法
—dir—(),该方法被调用。如果参数不包含—dir—(),该方法将最大限度地收集参数信息。
第二章
1.程序是由模块组成的 2.模块中包含语句 3.语句生成并处理对象
- 内置对象使简单程序写起来更容易
- Python提供对象并支持扩展程序
- 内置对象是扩展程序的组件
- 内置对象总比定制的数据结构类型更加有效
对象类型:Number(数字),String(字符串),List(列表),Dictionary(字典), Tuple(元组),File(文件)
数字:
Python支持常见的数字类型(整数,浮点型),常量和表达式。另外Python提供更高级的数字类型支持,包括复数类型,无限精确整数,大量的数字工具库。
标准的数字类型:正常整数(C的长整数),长整数(无限大小),浮点数(C的双整数),八进制和十六进制常量,复数常量。
字符串:
Python不允许你在 + 和 * 表达式中混合数字和字符串,’abc’+9会出错,而不是自动将9转化为字符串。
如同在C语言中一样,Python的偏移从0开始,以比字符串长度小1的值结尾。
字符串分片(slice) :S[1:]的到第一位外的所有内容。S[:-1]得到除最后一个字符之外的所有内容。S[1:3]从偏移1向上取到第三项,但不包括第三项。[:,0]取所有行的第一个元素
[i:j]复制a[i]:a[j-1]已生成新的list对象。当i缺省默认为0 a=[0;j] 即 a = [;j]从第一个复制。当j缺省默认为len(alist),即a[2:] = a[2:10]。当都缺省时,a[:]完整复制。
[i:j:s]s为步进,缺省为1 因此[i:j:1] = [i:j]。当s<0时,i缺省 默认为-1,j缺省 为 -len(a)-1 因此a[::-1]即为a[-1:-len(a)-1:-1] 相当于倒序
Python提供了处理字符串的工具模块,string模块。包括转换大小写,查找字符串的子串,将字符串转化为数字形式等。
String.upper(字符串)/lower 转换大小写。
String.find(字符串,子串)返回子串的索引
Sring.atoi(“42”)//python3已经删除 代替int(”32”),str("int”)
字符串变量:
‘Guido\’s’ 可以通过使用一个反斜杠是引号定义
事实上可以在字符串中转移任何特殊字符,python还可以合并临近的字符串常量。例如:a = “a”“is”“letter” ----输出:'aisletter’
r’a\b\c’ 仍保持反斜杠
Python 中的三种操作类别:
数字:支持加和乘等操作
序列:支持索引,分片,合并等操作
映射:支持键索引等操作
无论何时你把对象放到一个数据结构或变量名中,python存储的总是一个对象的引用,而不是对象的一份拷贝。
列表常用操作:
字典:
无序的集合,字典中的项是通过键来存取,而不是通过偏移。
字典有时候又称:关联数组,或散列(hash)
列表是对象引用的数组,字典是无序的对象引用表。
table{}
for item in table.keys():
print(item,’/t’,table[item])
元组(tuple):
任意对象的有序集合,通过偏移存取,属于不可变序列类型,固定长度,异常,任意嵌套,对象引用的数组。
文件:
‘r’代表为输入打开文件,用以输入
‘w’代表为输出生成和打开文件
‘a’代表为在文件尾部追加内容而打开文件
- 列表,字典和元组可以包括任何种类的对象
- 列表,字典和元组可以任意嵌套
- 列表,字典可以动态扩大和缩小
共享的引用:任意一个改变共享列表对象也改变另外两个
== 操作符测试值是否相等
Python运行了一个相等测试,递归所有的内嵌对象is 操作符测试对象的一致性
Python测试它们是否真的是同一个对象(同一个地址)也可以< >来判断列表中嵌套的值大小的比较
Python还有特殊的对象:None 唯一特殊的数据结构。它通常起一个空的占位作用,类似于C语言的中的NULL指针。
内置类型的常见问题:
赋值生成引用,而不是拷贝,若想只改变原数据,不改变被引用的数据。通过拷贝 ,例如:L[:]#一份嵌入的L的拷贝
原理:分片的限定默认为0和被分开的片的长度。如果两个都被分开的话,分片在序列展开每一项。这样就生成一个顶部拷贝(一个新的,不共享的对象。)
不可变类型在原位不可以被改变:元组、字符串:解决的方法利用分片,合并生成新的一个新的对象。
第三章:
语句:
赋值:
赋值生成对象索引:python赋值在名字或数据结构中存储对象的引用(reference)。它总是生成对象的引用,而不是对象的拷贝。
名字第一次赋值即已生成:无需事先声明。
名字在引用前必须赋值:用一个没赋值的名字是一个错误。
隐式赋值:import,from,def,class,for,函数参数等等
变量名字规则:
语法:下划线或字母 + 任意数量的字母,数字或下划线,必须是下划线或字母开头。
大小写敏感:SPAM与spam不同。
保留字的限制:不可以与Python中有特殊意义的词相同。
得将名字和对象明确区分开。对象有一个类型(整数,列表),可能是可变的或不可变的。名字则相反,只是对对象的引用,他们没有可变的概念,与他们所绑定的对象类型也没有相关的类型信息。
表达式:
可以用表达式作为语句。为了函数和方法的调用,在交互提示符下打印值。
在python中不允许我们在其他表达式中嵌入赋值语句(=)。理由是避免常见的编码错误。当你想使用== 不会因为错误的输入了=而意外的改变一个变量。
作用就是打印对象。严格说,它把对象的文本表示写到标准的输出流中。打印在python很简单,虽然你可以通过调用sys.stdout文件对象的write方法达到同样的效果,但print语句在处理简单的打印工作是一件简单的工具。
import sys
sys.stdout.write(‘hello world\n’)
条件语句
If开始,然后是else/elif
上面的例子几乎等价于用条件语句。
语句定界符:
如果正在写完一个开放的句法,语句可以跨越多行:语句太长,一行放不下,允许在下一行输入语句。如果正在用()或者[]括起的成分。后续的行可以在任意嵌套层开头。
语句如果以反斜杠开头的话可以跨越多行:初始行加上反斜杠()以指示要在下一行继续。
很长的字符串常量可以任意跨越多行。
真值测试:
真代表着任意非空的数或非空的对象。
假代表着不真:数0,空的对象或者None
比较或判断相等返回1或者0(真或假)
and 和 or 布尔操作返回一个真或假的操作数对象
对于or测试,Python从左到右检测操作都有对象,返回的一个值为真的对象。发现第一个值为真的时候停止停止检测。通常称为短路检测。
While循环
Break,continue,pass,else循环:
Break: 跳出最近的包围它的循环
Continue:跳至最近的包围它的循环顶部(到循环的首行)
Pass:什么都不做,只是一占位的空语句
判断y是否为一个素数:
For循环:
第四章
一般形式:
没有return语句的函数自动返回一个None对象。
函数中的作用域规则:默认时,函数内部赋值的名字与函数的名字空间关联。我们通常说函数定义了一个局部作用域,模块定义了一个全局作用域。
**模块是一个全局作用域:**每一个模块是一个全局作用域 — 一个名字空间,变量名在一个模块文件顶层生成(赋值)。
**对函数的每个调用是一个新的局部作用域:**每次你调用一个函数,生成一个新的局部作用域 – 是在函数的内部生成的名字所在的一个名字空间。
**赋值的名字是局部的,除非声明是全局:**默认情况,在函数中赋值的名字都放到局部作用域中。如果需要一个名字,而该名字又在包括该函数的模块顶层的话,你可以通过一个函数中用一个global语句声明是全局的。
**所有其他的名字都是全局的或内置的:**函数定义中每赋值的名字军被认为是全局的或内置的。
LGB规则:先局部(Local),次之全局(Global),次之内置(Built-in)
当在一个函数中赋值一个名字时,python总是在局部作用域中生成或改变他,除非在该函数已对它进行了全局声明。当在函数外部时,局部作用域与全局作用域一样 –都是一个模块的名字空间。
Return可以返回任何种类的对象,通过在一个元祖中打包他们,它可以返回多个值。
参数匹配:从左到右,通过参数名匹配,可变参数,参数的指定值不被传递。
当关键词参数在调用时,参数列出的顺序无关紧要;
在调用中,关键字参数必须出现在所有非关键字参数后。
在一个函数首部中,*name必须在普通参数和默认值后,**name必须在最后。
Lambda表达式:
Lambda是一个表达式,不是一个语句。它返回一个值,它可以被赋给一个名字。
F = lambda x,y,z: x+y+z F(2,3,4) 9
但一个函数无法准确的返回值是,函数就跳至尾部并退出。严格地说,所有函数都返回一个值,若你不能提供一个返回值,就会返回None。
实际推荐这样做。
不想每次调用都列表增加,解决如下
第五章–模块
import : 允许客户按整体取得一个模块
from: 允许客户从一个模块中取得某些特定的名字
reload: 提供了一种无需停止Python就可以重载模块代码的方法。
模块和类实际上是修饰过的名字空间(namespace)。
生成的模块形式:Python文件,C扩展程序:很多Python的内置工具事实上都是导入的C扩展模块。
Python通过检查所有在PYTHONPATH环境变量中列出的目录,来查找可以导入的模块。
用Python的术语来说,模块就是名字空间———生成名字的地方。存在模块中的名字称为它的属性(attribute)。
为了强迫一个模块代码重新载入,重运行,你需要通过调用reload内置函数明确地告诉Python这样做。
一般形式:
与import和from不同:
reload是Python中的一个内置函数,不是一个语句。
reload的参数是现有的模块对象,不只是一个名字。
(C的扩展模块也可以在运行的时候被动态载入,但它们不能被重载)
reload影响所有用import取得模块的客户。先前用from取得属性的客户不受reload影响。
模块编译模式:
Python系统通常被称作一个解释器。不过实际上介于传统解释器和编译器二者之间。与Java相同,Python程序被编译为一种称之为字节码的中间形式。
他在虚拟机上执行。 Python是解释性的,不过首先它仍将进过一个编译阶段。编译步骤是在Python中是自动的和隐藏的。
Python在模块第一次导入的时候自动把他们编译成字节码。而且,Python试图保存字节码到一个文件中,这样将来如果源文件没有改变的话可以避免重新编译。.pyc文件即是保存生成的模块字节码的。
当一个模块M导入,Python载入一个M.pyc的字节码文件代替相应的M.py源文件。
混合模式:__ name __ 和 __ main __:
既可以允许你导入一个模块,又可作为一个独立程序运行它。每个模块都有一个内置属性叫__ name __ ,Python中设定:
- 如果文件作为程序运行,在启动的时候,__ name 设定为字符串 main __
- 如果文件是被导入的,__ name __被设定为用户已知的模块名。
改变模块查找路径:
**包:**每个作为包使用的目录必须包括一个__init__.py以标识自己。
顶层代码语句的顺序问题:
递归的from导入可能不工作