- 1. Python基础
1.1. 概述
Python是一个脚本解释器, 可以从命令行运行脚本, 也可以在脚本上双击, 象运行其他应用程序一样。它还是一个交互 shell, 可以执行任意的语句和表达式。
Python 的交互 shell 可以计算任意的 Python 表达式, 包括任何基本的数学表达式。交互 shell 可以执行任意的 Python 语句, 包括 print 语句。也可以给变量赋值, 并且变量值在 shell 打开时一直有效(一旦关毕交互 Sheel , 变量值将丢失)。
表格 1 编程语言数据类型的比较
静态类型定义语言 | 一种在编译期间数据类型固定的语言。大多数静态类型定义语言是通过要求在使用所有变量之前声明它们的数据类型来保证这一点的。 Java 和 C 是静态类型定义语言。 |
动态类型定义语言 | 一种在运行期间才去确定数据类型的语言, 与静态类型定义相反。 VBScript 和 Python 是动态类型定义的, 因为它们确定一个变量的类型是在您第一次给它赋值的时候。 |
强类型定义语言 | 一种总是强制类型定义的语言。 Java 和 Python 是强制类型定义的。您有一个整数, 如果不明确地进行转换 , 不能将把它当成一个字符串。 |
弱类型定义语言 | 一种类型可以被忽略的语言, 与强类型定义相反。 VBScript 是弱类型定义的。在 VBScript 中, 您可以将字符串 ’12′ 和整数 3 进行连接得到字符串’123′, 然后可以把它看成整数 123 , 所有这些都不需要任何的显示转换。 |
1.2. 函数声明
def function_name([arguments]):
‘optional documentation string’
function_suite
a. arguments参数之间用逗号隔开。Python函数定义中不需要提定返回值的数据类型,也不需要指定是否有返回值。每个 Python 函数都返回一个值;如果函数执行过 return 语句, 它将返回指定的值, 否则将返回 None ( Python 的空值) 。Python 中没有子程序,只有函数, 所有的函数都有返回值,并且所有的函数都以 def 开始。
b. 文档化函数:函数声明后第一个没有赋值的字符串,也可使用三引号括起。使用函数的属性__doc__来调用这个字符串。
def buildConnectionString(params):
“””Build a connection string from a dictionary of parameters.
Returns string.“””
c. print语句实用规则是print(value, …, sep=’ ‘, end=’ ’, file=sys.stdout),Python的print语句调用str()函数显示对象,交互式解释器则调用repr()函数来显示对象。
表格 2 对新Python程序员有用的内建函数
函数 | 描述 |
dir([obj]) | 显示对象的属性,如果没有提供参数,这显示全局变量 |
help([obj]) | 以一种整齐美观的形式,显示对象的文档字符串,如果没有提供任何参数,则会进入交互式帮助 |
int(obj) | 将一个对象转换为整型 |
len(obj) | 返回对象的长度 |
open(fn,mode) | 以mode方式打开一个文件名为fn的文件 |
range([[start,]stop[,step]]) | 返回一个整型列表。起始值为start,结束值为stop-1,start默认值为0,step默认值为1 |
raw_input(str) | 等待用户输入一个字符串,可以提供一个可选的参数str用作提示信息。 |
str(obj) | 将一个对象转换为字符串 |
type(obj) | 返回对象的类型(返回值本身是一个type对象) |
1.3. Python常用习惯
a. 反斜杠()继续上一行,Python文件以模块形式组织。下划线(_)返回最后一个表达式的值。
b. 命令行选项:
-d 提供调试输出
-o生成优化字节码(pyo文件)
-s 不导入site模块以启动时查找Python路径
-v 冗余输出(导入语句详细追踪)
-m mod 将一个模块以脚本形式输出
-Q opt 除法选项
-c cmd 运行时以命令行字符串形式提交的Python脚本
file 从给定的文件运行Python脚本
c. raw_input()内建函数:读取标准输入,并将读取到的数据赋值给指定的对象,键入EOF字符则引发EOFError。可以加在脚本最后一行,用来使程序执行时保持窗口开着。Python中函数input和raw_input可以看做是def input(prompt):return eval(raw_input(prompt)) 即调用eval函数来看输入是什么,实际上你甚至可以输入表达式,Python会计算表达式的值来返回。
d. Python 函数没有明显的 begin 和 end, 没有花括号, 用于标函数的开始和结束。 唯一的分隔符是一个冒号 (:), 接着代码本身是缩进的。Python 使用硬回车来分割语句, 冒号和缩进来分割代码块。C++ 和 Java 使用分号来分割语句, 花括号来分割代码块。
e. 可使用help(函数名)来查询相应函数帮主信息。
1.4. 标识符
a. 任何时刻只有一个名字绑定,不支持重载标识符。内建(built-in)是__builtins__模块的成员,由解释器自动导入,可看作是任何一级的Pythong代码的全局变量。
b. 专用下划线标识符:_xxx不用‘form modules import *’导入,_xxx_系统定义的名字,_类中私有变量名。
c. 系统变量__name__决定运行是的模块是被导入还是直接执行:为模块名则导入,为‘__main__’则直接运行。
d. “Pythonic”:以Python的方式去编写代码、组织、逻辑和对象行为。
表格 3 Python关键字
and | as | assert | break |
class | continue | def | del |
elif | else | except | exec |
finally | for | from | global |
if | import | in | is |
lambda | not | or | pass |
raise | return | try | |
while | with | yield | None |
1.5. 变量声明
myParams = <表达式>
a. 命名规则:以字母或下划线开头,其他字符可以是数字、字母或下划线。大小写敏感。Python是动态类型语言,不需要预先声明变量类型,变量值和类型在赋值时被初始化。
b. Python赋值语句不返回值,不支持类似x++或—x这样的单目双重运算符,允许符合赋值(*=)、多重赋值和“多元”赋值
c. 变量的赋值可以是一条被分成了多行的命令, 用反斜线 (“”) 作为续行符,当一条命令用续行符 (“”) 分割成多行时, 后续的行可以以任何方式缩近, 此时 Python 通常的严格的缩近规则无需遵守。
d. Python 有局部变量和全局变量之分, 但没有明显的变量声明。变量通过首次赋值产生, 当超出作用范围时自动消亡。Python 不允许引用一个未被赋值的变量, 试图这样做会引发一个异常。
e. Python的一种编程简写是一次使用序列来给多个变量赋值。Python 中,可以使用内置的 range 函数和多变量赋值的方法来快速进行赋值,与C++中的枚举相似。如:
(MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY) = range(7)
1.6. 注释
a. 使用#符号标示注释;
b. 在模块、类或者函数起始添加一个字符串起文档作用;
c. 使用三引号标示注释。
- 2. 数据类型
2.1. 基本数据类型
有符号整型、长整型(仅受限于用户计算机的虚拟内存总数,可由整型自动转换)、布尔值、浮点值、复数(a+bj或a+bJ)
△ 引入decimal模块使用decimal类型(十进制浮点型)
?二进制表示中有一个无限循环:1.1 → 1.10000……1
a. 复数拥有real、imag、conjugete()属性,coerce()内建函数实现强制类型转换。
b. 除法引入指令from __future__ import division使整型除法保留小数部分,//操作符执行“地板除”。浮点数取余表达式:x-(math.floor(x/y)*y);复数取余表达式:x-(math.floor((x/y).real)*y)
c. 冥运算比其左侧操作数的一元操作符优先级高,比其右侧操作数的一元操作符的优先级低。?4xx-1报错
d. Python支持标准位运算(仅适用于整型):取反(~),按位与(&),或(|)和异或(^)、左移(<<)、右移(>>)
△ 复数当成正数的2进制补码处理;
△ 左移好右移N位等同于无溢出检查2的N次幂运算:2**N;
△ 对长整形,位操作符使用一种未修改的2进制补码形式,使得符号位无限向左扩展。
数字类型相关模块:decimal(十进制浮点运算类Decimal)、array(高级数字数组)、math/cmath(标准C库数学运算函数,复数在cmath中)、operator(数字操作符的函数实现)、random(各种伪随机数生成器)
表格 4 数值工厂函数
类(工厂函数) | 操作 |
boll(obj) | 返回obj对象的布尔值,即obj.__nonzero__方法的返回值 |
int(obj,base=10) | 返回一个字符串或数值对象的整型表示,类似string.atoi() |
long(obj,base=10) | 返回一个字符或数据对象的长整型表示,类似string.atol() |
float(obj) | 返回一个字符串或数据对象的浮点型表示,类似string.atof() |
complex(str) or
complex(real,inag=0.0) |
返回一个字符串的复数标识,或者根据给定的实数(及一个可选的虚数部分)生成一个复数对象 |
表格 5 数值运算内建函数
函数 | 功能 |
abs(num) | 返回num的绝对值 |
coerce(num1,num2) | 将num1和num2转换为同一类型,然后以一个元组的形式返回 |
divmod(num1,num2) | 除法-取余运算的结合。返回一个元组(num1/num2,num1%num2),对浮点数和复数的商进行下舍入 |
pow(num1,num2, mod=1) | 取num1的num2次方,如果提供mod参数,则计算结果再对mod进行取余运算 |
round(flt,ndig=1) | 接受一个浮点型flt并对其四舍五入,保存ndig位小数,不提供ndig则默认为0位 |
表格 6 仅适用于整型的内建函数
函数 | 操作 |
hex(num) | 将数字转换成十六进制数并以字符串形式返回 |
oct(num) | 将数字转换成八进制数并以字符串形式返回 |
chr(num) | 将ASCII值的数字转换成ASCII字符,范围只能是0<=nuum<=255 |
ord(chr) | 接受一个ASCII或Unicode字符,返回相应的ASCII值或Unicode值 |
unichr(num) | 接受Unicode码值,返回其对应的Unicode字符,接受码值返回由Python构建于UCS-2还是UCS-4决定 |
2.2. 映射和集合类型
字典(Dictionary):Python中唯一映射类型,作为可变的哈希表实现。
dictionaryName = {“key1“:”value1“, “key2“:”value2“……}
- Dictionary定义了键和值之间一对一的关系,变量可以任意取名,Python在内部会记录下其数据类型。value可以为任意的数据类型,key的要求较为苛刻一些。
- 重复赋值, 将简单覆盖原有的值。Dictionary 的 key 是大小写敏感的。可以通过key来引用value,不能通过value引用key。
- 字典相关函数:type()、str()、cmp();映射类型相关函数:dict()、len()、hash()。del dictionaryName["key"]删除dictionary中独立元素;dictionaryName.clear() 删除dictionary中所有元素。例7.1、7.2
表格 7 映射类型内建方法
方法名字 | 操作 |
dict.clear() | 删除字典中所有元素 |
dict clear() | 返回字典(浅复制)的一个副本 |
dict.fromkeys(seq,val=None) | 创建并返回一个新字典,以seq中的元素做该字典的键,val做该字典中所有键对应的初始值 |
dict.get(key,default=None) | 对字典dict中的键key,返回它对应的值value,如果字典中不存在此键,则返回default值 |
dict.has_key(key) | 如果键在字典中存在,返回True,否则返回False,由in和not in代替 |
dict.items() | 返回一个包含字典中键、值对元组的列表 |
dict.keys() | 返回一个包含字典中键的列表 |
dict.iter() | 方法iteritems()、iterkeys()、itervaluse()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表 |
dict.pop(key[,default]) | 和方法get()相似,如果字典中key键存在,删除并返回dict[key];如果key键不存在,且没有给出default值,则引发KeyError异常 |
dict.setdefault(key,default = None) | 和方法set()相似,如果字典中不存在key键,由dict[key]=default为它赋值 |
dict.update(dict2) | 将字典dict2的键-值对添加到字典dict |
dict.values() | 返回一个包含字典中所有值的列表 |
- d. 集合对象(Set)是一组无序排列的可哈希的值。集合类型操作符:in,not in,布尔操作符,联合(|)、交集(&)、差补()、相对补集(-)、对称差分(^)(=、&=、-=、^=)
表格 8 集合类型的操作符、函数和方法
函数/方法名 | 等价操作符 | 说明 |
所有集合类型 | ||
len(s) | 集合基数:集合s中元素个数 | |
set([obj]) | 可变集合工厂函数:ojb必须是支持迭代的,由obj中的元素创建集合,否则创建一个空集合 | |
frozenset([obj]) | 不可变集合工厂函数:执行方式好set()方法相同,但它返回的是不可变集合 | |
obj in s | 成员测试 | |
obj not in s | 非成员测试 | |
s == t | 等价测试 | |
s != t | 不等价测试 | |
s < t | (严格意义上)子集测试 | |
s.issubset(t) | s <= t | 子集测试 |
s > t | (严格意义上)超集测试 | |
s.issuperset(t) | s >= t | 超集测试 |
s.union(t) | s | t | 合并操作 |
s.intersec-tion(t) | s & t | 交集操作 |
s.difference(t) | s – t | 差分操作 |
s.symmetric_fifference(t) | s ^ t | 对称差分操作 |
s.copy() | 赋值操作:返回s的(浅复制)副本 | |
仅适用于可变集合 | ||
s.update(t) | s |= t | (Union)修改操作:将t中的成员添加s |
s.intersection_update(t) | s &= t | 交集修改操作:s中仅包括s和t中共有的成员 |
s.difference_update(t) | s -= t | 差修改操作:s中仅包括属于s但不属于t的成员 |
s.symmetric_difference_ update(t) | s ^= t | 对称差分修改操作:s中包括仅属于s或仅属于t的成员 |
s.add(obj) | 加操作:将obj添加到s | |
s.remove(obj) | 删除操作 | |
s.discard(obj) | 丢弃操作:remove()的友好版本,如果s中存在ojb,从s中删除它 | |
s.pop() | Pop操作:移除并返回s中的任意一个值 | |
s.clear() | 清除操作:移除s中的所有元素 |
2.3. 序列
序列类型操作符:成员关系操作符(in、not in)、连接操作符(+)、重复操作符(*)、切片操作符([],[:],[::])、切片索引的更多内容
序列类型函数(有返回值):cmp(), len(), max(), min(), sorted(), reversed(), enumerate(), zip(), reduce(), sum(), list()和tuple()
表格 9 序列类型转换工厂函数
函数 | 含义 |
list(iter) | 把迭代对象转换为列表 |
str(obj) | 把obj对象转换成字符串(对象的字符串表示法) |
unicode(obj) | 把对象转换成Unicode字符串(使用默认编码) |
basestring() | 抽象工厂函数,其作用仅仅是为str和unicode函数提供父类,所以不能被实例化,也不能被调用 |
tuple(iter) | 把一个迭代对象转换为一个元组对象 |
表格 10 序列类型可用的内建函数
函数名 | 功能 |
enumerate(iter) | 接受一个可迭代对象作为参数,返回一个enumerate对象(同时也是一个迭代器),该对象生成由iter每个元素的index值和item值组成的元组 |
len(seq) | 返回seq的长度 |
max(iter,key=None)or max(arg0,arg1…,key=None) | 返回iter或(arg0,arg1,…)中的最大值,如果指定了key,这个key必须是一个可以传给sort()方法的,用于比较的回调函数 |
min(iter,key=None)or min(arg0,arg1…,key=None) | 返回iter或(arg0,arg1,…)里面的最小值,如果指定了key,这个key必须是一个可以传给sort()方法的,用于比较的回调函数 |
reversed(seq) | 接受一个序列作为参数,返回一个可逆序访问的迭代器 |
sorted(iter,func=None, key=None,reverse=False) | 接受一个可迭代对象作为参数,返回一个有序的列表;可选参数func、key和reverse的含义跟list.sort()内建函数的参数定义一样 |
sum(seq,init=0) | 返回seq和可选参数init的总和,其效果等同于reduce(
operator.add,seq,init) |
zip([it0,it1,…itN]) | 返回一个列表,其第一个元素是it0、it1…这些元素的第一个元素组成一个元组,第二个…依此类推 |
2.3.1. 字符串(不可改变,比较操作中按照ASCII值的大小来比较)
a. 把重复操作z作为参数放在循环中进行是非常低效的;
b. Python语法允许在源码中把几个字符串连在一起写,来构建新字符串,使用分号隔开,可加入注释;
c. 如果把一个普通字符串和一个Unicode字符串作连接处理,Python会在连接操作前先将普通字符串转换为Unicode字符串。
d. 字符串模板:原始字符串操作符(r/R)(原始字符串对每个字符都使用原意);Unicode字符串操作符(u/U)。
e. 字符串类型函数(有返回值):raw_input(), str(), unicode(), chr(), unichr(), ord()
f. Python中允许使用三引号使一个字符串跨多行,并且可以包含换行符、制表符和其他特殊符号。
Unicode:P127
字符串内建函数:…………
表格 11 反斜杠开头的转义字符
八进制 | 十进制 | 十六进制 | 字符 | 说明 | |