条件和循环
if判断:
if expression1:
…expr1_true_suite
elif expression2:
…expr2_true_suite
elif expression3:
…expr3_true_suite
else:
…None_of_the_above_suite
Python 不支持 switch/case 语句,但完全可以用 if/else 的结构来代替
三元操作符:X if C else Y (如果条件 C 成立,则结果为 X,否则为 Y)
while 语句:
while expression:
…suite_to_repeat
for 语句:
for iter_var in interable:
…suite_to_repeat
pass 语句:Python 中提供 pass 语句,表示不做任何事,NOP(No Operation)
def foo_func(): #空函数
…pass
迭代器和 iter()函数:
迭代器就是有一个 next()方法的对象
对一个对象调用 iter()方法就可以得到它的迭代器
列表解析:
列表解析(list comps)来自函数式编程语言 Haskell。它是一个非常有用、简单而且灵活的工具,可以用来动态地创建列表。
Python 早就支持函数式编程特性,例如 lambda、map()和 filter()等
lambda 允许用户快速地创建只有一行的函数对象.例如:map(lambda x:x ** 2, range(6))
文件的输入和输出
文件内建函数(open()和 file()):
open()语法:file_object = open(file_name, access_mode=‘r’,buffering=-1)
open()和 file()函数具有完全相同的功能,一般来说,建议使用 open()来读文件,在你想说明你是处理文件对象的时候使用 file(),例如 if isinstance(f, file)
文件内建方法:
输入:read(),readlines(),for eachLine in file
输出:write(),writelines() [注:没有 writeline()方法]
文件内移动:seek() 0,1,2 分别代表文件开头,当前位置,文件末尾
保留行分隔符:
使用 read()或者 readlines()从文件中读取行时,Python 并不会删除行结束符,类似的,write()或 writelines()也不会自动的加入行结束符,这得由程序员自己完成。
行分隔符和其他文件系统的差异:
不同的操作系统对行结束符的规定是不同的,但 Python 的 os 模块已经替程序员解决了这个问题,只要导入了 os 模块,其属性会自动校准文件系统,设置为正确值。
命令行参数:
sys.argv 是命令行参数的列表
len(sys.argv)是命令行参数的个数(也就是 argc)
错误和异常
Python 中常见的异常:
NameError : 尝试访问一个未申明的变量
ZeroDivissionError : 除数为零
SyntaxError : Python 解释器语法错误
IndexError : 请求的索引超出序列范围
KeyError : 请求一个不存在的字典关键字
IOError : 输入\输出错误
AttributeError : 尝试访问未知的对象属性
KeyboardInterrupt : 中断异常
BaseException : 所有异常的基类
检测和处理异常:try-except 和 try-finally
处理多个异常的时候可以用多个 except,也可以用一个 except,然后将异常放入一个元组里
不推荐使用空 except 语句
else 子句:try-except-else:在 try 范围内没有异常被检测到时,执行 else 子句
finally 子句:try-except(-else)-finally:无论异常是否发生,是否捕捉,都会执行的一段代码。
raise 语句:触发异常。一般语法:
raise [SomeException [,args [,traceback]]]
第一个参数:SomeException:触发异常的名字
第二个参数:args:可选,作为一个对象或者对象的元组传给异常
第三个参数:traceback:可选,很少用
断言:断言是一句必须等价于布尔真的判定,否则将产生 AssertionError(断言错误)的异常,同时也说明是假。
语法:assert expression[, arguments]
建议跟 try-except 连用,将断言语句放在 try 中
函数和函数式编程
创建函数:
def function_name(arguments):
…“function_documentation_string”
…function_body_suite
前向引用:Python 也不允许在函数未声明之前,对其进行引用或调用。
Python 支持在外部函数的定义体内创建内嵌函数
函数中使用默认参数会使程序的健壮性上升到极高的级别。
Python 不是也不大可能会成为一种函数式编程语言,但是它支持许多有价值的函数式编程语言构建。
函数式编程的内建函数:
Filter(func, seq):
调用一个布尔函数 func 来迭代遍历每个 seq 中的元素;返回一个使 func 返回值为 true 的元素的序列
Map(func, seq1[,sql2…]):
将函数 func 作用于给定的序列 seq 中的每个元素,并用一个列表来提供返回值
Reduce(func, seq):
将一个二元函数作用于 seq 序列的元素,每次携带一对(先前的结果以及下一个序列元素),连续地将现有的结果和下一个值作用,最后减少我们的序列为一个单一的返回值
变量作用域:
全局变量除非被删除,否则它们存活到脚本运行结束,且对所有的函数都是可访问的。
为了明确地引用一个已命名的全局变量,必须使用 global 语句。
模块
模块支持从逻辑上组织 Python 代码。
与其他可以导入类(class)的语言不同,Python 带入的是模块或模块属性。
语法:
import module1[,module2[,…]]
from module import name1*,name2*,…++
from module import name as shortname
from module import *
import 语句的模块顺序:
Python 标准库模块
Python 第三方模块
应用程序自定义模块
导入(import)和加载(load):
一个模块之恩那个被加载一次,无论它被导入多少次。
模块内建函数:
__import()函数:__import(module_name[,globals[,locals[,fromlist]]])
globals()和 locals()分别返回调用者全局和局部名称空间的字典。
reload()重新导入一个已经导入的模块: reload(module) 使用 reload()时候必须是全部导入,而不是使用 from-import。
禁止模块的某个属性导入,可以在该属性名称前加一个下划线:import foo._bar
面向对象编程
在 Python 中,面向对象编程主要有两个主题,就是类和类实例。
利用 class 关键字创建一个类:
class MyNewObjectType(bases):
…#bases 参数用于继承的父类
…‘define MyNewObjectType class’
…Class_suite
object 是“所有类之母”,若未指明父类,则 object 将作为默认的父类。
创建一个实例的语法:(注意:没有使用 new,Python 根本就没有 new 这个关键字)
myFirstObject = MyNewObjectType()
添加类方法:
class MyDataWithMethod(object):
…#定义类
…def printFoo(self):
…#定义方法
–…print ‘You invoked printFoo()’
你可能注意到 self 参数,它在所有的方法声明中都存在。并且必须是第一个参数。这个参数代表实例对象本身,当你调用方法的时候由解释器悄悄地传递给方法,而不需要你自己传递 self。
init()方法:类似于一个构造器,但不能说是一个构造器(因为 Python 没有使用new),它在创建一个新的对象时被调用,完成一个初始化工作。
类、属性和方法的命名方式:
类:通常大写字母打头。这是标准惯例。有助于识别类。
属性:小写字母打头 + 驼峰,使用名词作为名字。
方法:小写字母打头 + 驼峰,使用谓词作为名字。
在 Python 中,声明与定义类是没有什么区别的,因为它们是同时进行的,定义(类体)紧跟在声明(含 class 关键字的头行)和可选(但总是推荐)的文档字符串后面。
Python 不支持纯虚函数(如 C++)或抽象方法(如 Java)。
Python 严格要求,没有实例,方法是不能被调用的。方法必须绑定(到一个实例)才能被直接调用。
dir(class_name): 返回类对象的属性的一个名字列表
class_name.dict : 返回的是一个字典,key 是属性名,value 是数据值
init()方法不应该返回任何对象,即,它应该返回 None,否则将产生 TypeError。
实例属性 VS 类属性:
类属性跟实例无关。这些值像静态成员那样被引用,即使在多次实例化中调用类,类属性的值都不会改变。
子类可以通过继承覆盖父类的方法。类似,如果在子类中覆盖了了__init__()方法,那么基类的__init__()就不会被自动调用了。
同 C++一样,Python 支持多继承。但要处理好两个方面:
要找到合适的属性
重写方法时,如何调用对应父类以“发挥他们的作用”,同时,在子类中处理好自己的义务
vars()内建函数与 dir()相似,知识给定的对象都必须有一个__dict__属性。vars()返回一个字典,包含了对象存储于其__dict__中的属性(键)和值。
执行环境
Python 有三种不同类型的函数对象。分别是:
内建函数(BIF):C/C++写的,编译过后放到 Python 解释器当中的。
用户定义的函数(UDF)
lambda 表达式
compile():
它允许程序员在运行时迅速生成代码对象,然后就可以用 exec 语句或者内建函数eval()来执行这些代码或者对它们进行求值。
compile(string, file, type) 这三个参数都是必须的。
第一个参数:string:要编译的 Python 代码
第二个参数:file:虽然是必须的,但通常被置为空串
第三个参数:type:字符串,用来表明代码的类型。有三个可能值:
‘eval’:可求值的表达式(和 eval()连用)
‘single’:单一可执行语句(和 exec 连用)
‘exec’:可执行语句组(和 exec 连用)
Eg1:
>>>eval_code = compile(‘100+200’, ‘’, ‘eval’)
>>>eval(eval_code)
300
Eg2:
>>>single_code = compile(‘print “hello”’, ‘’, ‘single’)
>>>exec single_code
Hello
用 compile()预编译重复代码有助于改善性能,因为在调用时不必经过字节编译处理。
exec obj :
接受对象(obj)可以是原始的字符串,也可以是有效的 Python 文件。
一旦执行完毕,继续对 exec 的调用就会失败,因为 obj 已经到了 EOF 了,若想继续调用 exec,则必须对 obj 调用 seek(0)到文件开头。
tell()方法:告知当前在文件的何处
os.path.getsize():告知对象文件有多大
结束执行:
sys.exit() and SystemExit
sys.exitfunc()
os._exit(status):跟以上两种不同,它不执行任何清理就直接退出 Python 解释器。
且status 参数是必须的。