一、安装、编译与运行
Python的安装很容易,直接到官网:http://www.python.org/下载安装就可以了。Ubuntu一般都预安装了。没有的话,就可以#apt-get install python。Windows的话直接下载msi包安装即可。Python 程序是通过解释器执行的,所以安装后,可以看到Python提供了两个解析器,一个是IDLE (Python GUI),一个是Python (command line)。前者是一个带GUI界面的版本,后者实际上和在命令提示符下运行python是一样的。运行解释器后,就会有一个命令提示符>>>,在提示符后键入你的程序语句,键入的语句将会立即执行。就像Matlab一样。
另外,Matlab有.m的脚步文件,python也有.py后缀的脚本文件,这个文件除了可以解释执行外,还可以编译运行,编译后运行速度要比解释运行要快。
例如,我要打印一个helloWorld。
方法1:直接在解释器中,>>> print ‘helloWorld’。
方法2:将这句代码写到一个文件中,例如hello.py。运行这个文件有三种方式:
1)在终端中:python hello.py
2)先编译成.pyc文件:
import py_compile
py_compile.compile("hello.py")
再在终端中:python hello.pyc
3)在终端中:
python -O -m py_compile hello.py
python hello.pyo
编译成.pyc和.pyo文件后,执行的速度会更快。所以一般一些重复性并多次调用的代码会被编译成这两种可执行的方式来待调用。
二、变量、运算与表达式
这里没什么好说的,有其他语言的编程基础的话都没什么问题。和Matlab的相似度比较大。这块差别不是很大。具体如下:
需要注意的一个是:5/2 等于2,5.0/2才等于2.5。
-
-
-
-
-
-
- print 'Please input a number:'
- number = int(raw_input())
- number += 1
- print number**2
- print number and 1
- print number or 1
- print not number
- 5/2
- 5.0/2
三、数据类型
1、数字
通常的int, long,float,long等等都被支持。而且会看你的具体数字来定义变量的类型。如下:
-
-
-
-
-
- num = 1
- num = 1111111111111
- num = 1.0
- num = 12L
- num = 1 + 12j
- num = '1'
2、字符串
单引号,双引号和三引号都可以用来定义字符串。三引号可以定义特别格式的字符串。字符串作为一种序列类型,支持像Matlab一样的索引访问和切片访问。
-
-
- num = "1"
- num = "Let's go"
- num = "He's \"old\""
- mail = "Xiaoyi: \n hello \n I am you!"
- mail =
-
-
-
- string = 'xiaoyi'
- copy = string[0] + string[1] + string[2:6]
- copy = string[:4]
- copy = string[2:]
- copy = string[::1]
- copy = string[::2]
- copy = string[-1]
- copy = string[-4:-2:-1]
- memAddr = id(num)
- type(num)
3、元组
元组tuple用()来定义。相当于一个可以存储不同类型数据的一个数组。可以用索引来访问,但需要注意的一点是,里面的元素不能被修改。
-
-
-
-
-
- firstName = 'Zou'
- lastName = 'Xiaoyi'
- len(string)
- name = firstName + lastName
- firstName * 3
- 'Z' in firstName
- string = '123'
- max(string)
- min(string)
- cmp(firstName, lastName)
-
-
-
- user = ("xiaoyi", 25, "male")
- name = user[0]
- age = user[1]
- gender = user[2]
- t1 = ()
- t2 = (2, )
- user[1] = 26
- name, age, gender = user
- a, b, c = (1, 2, 3)
4、列表
列表list用[]来定义。它和元组的功能一样,不同的一点是,里面的元素可以修改。List是一个类,支持很多该类定义的方法,这些方法可以用来对list进行操作。
-
-
- userList = ["xiaoyi", 25, "male"]
- name = userList[0]
- age = userList[1]
- gender = userList[2]
- userList[3] = 88888
- userList.append(8888)
- "male" in userList
- userList[2] = 'female'
- userList.remove(8888)
- userList.remove(userList[2])
- del(userList[1])
-
-
-
-
-
-
-
-
5、字典
字典dictionary用{}来定义。它的优点是定义像key-value这种键值对的结构,就像struct结构体的功能一样。它也支持字典类支持的方法进行创建和操作。
-
-
-
- item = ['name', 'age', 'gender']
- value = ['xiaoyi', '25', 'male']
- zip(item, value)
-
-
-
-
-
- dic = {'name': 'xiaoyi', 'age': 25, 'gender': 'male'}
- dic = {1: 'zou', 'age':25, 'gender': 'male'}
-
- print dic['name']
- print dic[1]
-
- fdict = dict(['x', 1], ['y', 2])
- ddict = {}.fromkeys(('x', 'y'), -1)
-
- for key in dic
- print key
- print dic[key]
-
-
-
- dic['tel'] = 88888
-
- del dic[1]
- dic.pop('tel')
- dic.clear()
- del dic
- dic.get(1)
- dic.get(1, 'error')
- dic.keys()
- dic.values()
- dic.has_key(key)
-
四、流程控制
在这块,Python与其它大多数语言有个非常不同的地方,Python语言使用缩进块来表示程序逻辑(其它大多数语言使用大括号等)。例如:
if age < 21:
print("你不能买酒。")
print("不过你能买口香糖。")
print("这句话处于if语句块的外面。")
这个代码相当于c语言的:
if (age < 21)
{
print("你不能买酒。")
print("不过你能买口香糖。")
}
print("这句话处于if语句块的外面。")
可以看到,Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字。增加缩进表示语句块的开始(注意前面有个:号),而减少缩进则表示语句块的退出。根据PEP的规定,必须使用4个空格来表示每级缩进(不清楚4个空格的规定如何,在实际编写中可以自定义空格数,但是要满足每级缩进间空格数相等)。使用Tab字符和其它数目的空格虽然都可以编译通过,但不符合编码规范。
为了使我们自己编写的程序能很好的兼容别人的程序,我们最好还是按规范来,用四个空格来缩减(注意,要么都是空格,要是么都制表符,千万别混用)。
1、if-else
If-else用来判断一些条件,以执行满足某种条件的代码。
-
-
-
- if expression:
- statement(s)
-
- if expression:
- statement(s)
-
- if 1<2:
- print 'ok, '
- print 'yeah'
-
- if True:
- print 'true'
-
- def fun():
- return 1
-
- if fun():
- print 'ok'
- else:
- print 'no'
-
- con = int(raw_input('please input a number:'))
- if con < 2:
- print 'small'
- elif con > 3:
- print 'big'
- else:
- print 'middle'
-
- if 1 < 2:
- if 2 < 3:
- print 'yeah'
- else:
- print 'no'
- print 'out'
- else:
- print 'bad'
-
- if 1<2 and 2<3 or 2 < 4 not 0:
- print 'yeah'
2、for
for的作用是循环执行某段代码。还可以用来遍历我们上面所提到的序列类型的变量。
-
-
-
- for iterating_val in sequence:
- statements(s)
-
-
- for i in "abcd":
- print i
-
- for i in [1, 2, 3, 4]:
- print i
-
-
-
- range(5)
- range(1, 5)
- range(1, 10, 2)
- for i in range(1, 100, 1):
- print i
-
-
- fruits = ['apple', 'banana', 'mango']
- for fruit in range(len(fruits)):
- print 'current fruit: ', fruits[fruit]
-
-
- dic = {1: 111, 2: 222, 5: 555}
- for x in dic:
- print x, ': ', dic[x]
-
- dic.items()
- for key,value in dic.items():
- print key, ': ', value
- else:
- print 'ending'
-
-
- import time
-
- for x in range(1, 11):
- print x
- time.sleep(1)
- if x == 3:
- pass
- if x == 2:
- continue
- if x == 6:
- break
- if x == 7:
- exit()
- print '#'*50
3、while
while的用途也是循环。它首先检查在它后边的循环条件,若条件表达式为真,它就执行冒号后面的语句块,然后再次测试循环条件,直至为假。冒号后面的缩近语句块为循环体。
-
-
-
- while expression:
- statement(s)
-
- while True:
- print 'hello'
- x = raw_input('please input something, q for quit:')
- if x == 'q':
- break
- else:
- print 'ending'
4、switch
其实Python并没有提供switch结构,但我们可以通过字典和函数轻松的进行构造。例如:
-
-
-
-
-
-
-
- from __future__ import division
-
-
- def add(x, y):
- return x + y
- def sub(x, y):
- return x - y
- def mul(x, y):
- return x * y
- def div(x, y):
- return x / y
-
- operator = {"+": add, "-": sub, "*": mul, "/": div}
- operator["+"](1, 2)
- operator["%"](1, 2)
- operator.get("+")(1, 2)
-
- def cal(x, o, y):
- print operator.get(o)(x, y)
- cal(2, "+", 3)
-
五、函数
1、自定义函数
在Python中,使用def语句来创建函数:
-
-
- def functionName(parameters):
- bodyOfFunction
-
- def add(a, b):
- return a+b
-
- a = 100
- b = 200
- sum = add(a, b)
-
-
-
-
- def add(a = 1, b = 2):
- return a+b
-
- add()
- add(2)
- add(y = 1)
- add(3, 4)
-
-
-
-
-
-
-
- val = 100
- def fun():
- print val
- print val
-
- def fun():
- a = 100
- print a
- print a
-
- def fun():
- global a = 100
- print a
-
- print a
- fun()
- print a
-
-
-
- def fun(x):
- print x
-
- fun(10)
- fun('hello')
- fun(('x', 2, 3))
- fun([1, 2, 3])
- fun({1: 1, 2: 2})
-
-
- def fun(x, y):
- print "%s : %s" % (x,y)
- fun('Zou', 'xiaoyi')
- tu = ('Zou', 'xiaoyi')
- fun(*tu)
-
-
- def fun(name = "name", age = 0):
- print "name: %s" % name
- print "age: " % age
- dic = {name: "xiaoyi", age: 25}
- fun(**dic)
- fun(age = 25, name = 'xiaoyi')
-
-
-
-
-
- def fun(x, *args):
- print x
- print args
-
- fun(10)
- fun(10, 12, 24)
-
-
- def fun(x, **args):
- print x
- print args
-
- fun(10)
- fun(x = 10, y = 12, z = 15)
-
-
- def fun(x, *args, **kwargs):
- print x
- print args
- print kwargs
- fun(1, 2, 3, 4, y = 10, z = 12)
2、Lambda函数
Lambda函数用来定义一个单行的函数,其便利在于:
-
-
-
- fun = lambda x,y : x*y
- fun(2, 3)
-
- def fun(x, y):
- return x*y
-
-
-
- def recursion(n):
- if n > 0:
- return n * recursion(n-1)
-
- def mul(x, y):
- return x * y
- numList = range(1, 5)
- reduce(mul, numList)
- reduce(lambda x,y : x*y, numList)
-
-
- numList = [1, 2, 6, 7]
- filter(lambda x : x % 2 == 0, numList)
- print [x for x in numList if x % 2 == 0]
- map(lambda x : x * 2 + 10, numList)
- print [x * 2 + 10 for x in numList]
3、Python内置函数
Python内置了很多函数,他们都是一个个的.py文件,在python的安装目录可以找到。弄清它有那些函数,对我们的高效编程非常有用。这样就可以避免重复的劳动了。下面也只是列出一些常用的:
-
-
-
- abs, max, min, len, divmod, pow, round, callable,
- isinstance, cmp, range, xrange, type, id, int()
- list(), tuple(), hex(), oct(), chr(), ord(), long()
-
- callable
-
-
- isinstance
- numList = [1, 2]
- if type(numList) == type([]):
- print "It is a list"
- if isinstance(numList, list):
- print "It is a list"
-
- for i in range(1, 10001)
- for i in xrange(1, 10001)
-
-
- str = 'hello world'
- str.capitalize()
- str.replace("hello", "good")
- ip = "192.168.1.123"
- ip.split('.')
- help(str.split)
-
- import string
- str = 'hello world'
- string.replace(str, "hello", "good")
-
-
- len, max, min
-
- def fun(x):
- if x > 5:
- return True
- numList = [1, 2, 6, 7]
- filter(fun, numList)
- filter(lambda x : x % 2 == 0, numList)
-
- name = ["me", "you"]
- age = [25, 26]
- tel = ["123", "234"]
- zip(name, age, tel)
-
- map(None, name, age, tel)
- test = ["hello1", "hello2", "hello3"]
- zip(name, age, tel, test)
- map(None, name, age, tel, test)
- a = [1, 3, 5]
- b = [2, 4, 6]
- def mul(x, y):
- return x*y
- map(mul, a, b)
-
- reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
六、包与模块
1、模块module
python中每一个.py脚本定义一个模块,所以我们可以在一个.py脚本中定义一个实现某个功能的函数或者脚本,这样其他的.py脚本就可以调用这个模块了。调用的方式有三种,如下:
-
-
-
-
-
-
-
-
- def add(x, y):
- return x + y
- def sub(x, y):
- return x - y
- def mul(x, y):
- return x * y
- def div(x, y):
- return x / y
-
- print "Your answer is: ", add(3, 5)
-
- if __name__ == "__main__"
- r = add(1, 3)
- print r
-
-
- import cal
-
-
-
-
-
- result = cal.add(1, 2)
- print result
-
- import cal as c
- result = c.add(1, 2)
-
- from cal import add
- result = add(1, 2)
2、包package
python 的每个.py文件执行某种功能,那有时候我们需要多个.py完成某个更大的功能,或者我们需要将同类功能的.py文件组织到一个地方,这样就可以很方便我们的使用。模块可以按目录组织为包,创建一个包的步骤:
# 1、建立一个名字为包名字的文件夹
# 2、在该文件夹下创建一个__init__.py空文件
# 3、根据需要在该文件夹下存放.py脚本文件、已编译拓展及子包
# 4、import pack.m1,pack.m2 pack.m3
-
-
-
-
-
-
- mkdir calSet
- cd calSet
- touch __init_.py
- cp cal.py .
-
-
- import calSet.cal
- result = calSet.cal.add(1, 2)
- print result
七、正则表达式
正则表达式,(英语:RegularExpression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。
Python提供了功能强大的正则表达式引擎re,我们可以利用这个模块来利用正则表达式进行字符串操作。我们用import re来导入这个模块。
正则表达式包含了很多规则,如果能灵活的使用,在匹配字符串方面是非常高效率的。更多的规则,我们需要查阅其他的资料。
1、元字符
很多,一些常用的元字符的使用方法如下:
-
-
-
- import re
- rule = r'abc'
- re.findall(rule, "aaaaabcaaaaaabcaa")
-
-
- rule = r"t[io]p"
- re.findall(rule, "tip tep twp top")
-
-
- rule = r"t[^io]p"
- re.findall(rule, "tip tep twp top")
-
-
- rule = r"^hello"
- re.findall(rule, "hello tep twp hello")
- re.findall(rule, "tep twp hello")
-
-
- rule = r"hello$"
- re.findall(rule, "hello tep twp hello")
- re.findall(rule, "hello tep twp")
-
-
- rule = r"x[0123456789]x"
- rule = r"x[0-9]x"
- re.findall(rule, "x1x x4x xxx")
- rule = r"x[a-zA-Z]x"
-
-
- rule = r"\^hello"
- re.findall(rule, "hello twp ^hello")
-
-
-
-
-
-
-
-
-
-
-
-
-
- rule = r"^020-\d\d\d\d\d\d\d\d$"
- rule = r"^020-\d{8}$"
- rule = r"^020-[0-9]{8}$"
- re.findall(rule, "020-23546813")
-
-
- rule = r"ab*"
- re.findall(rule, "a")
- re.findall(rule, "ab")
-
-
- rule = r"ab+"
- re.findall(rule, "a")
- re.findall(rule, "ab")
- re.findall(rule, "abb")
-
-
- rule = r"^020-?\d{8}$"
- re.findall(rule, "02023546813")
- re.findall(rule, "020-23546813")
- re.findall(rule, "020--23546813")
-
-
- rule = r"ab+?"
- re.findall(rule, "abbbbbbb")
-
-
- rule = r"a{1,3}"
- re.findall(rule, "a")
- re.findall(rule, "aa")
- re.findall(rule, "aaa")
- re.findall(rule, "aaaa")
-
-
- rule = r"\d{3,4}-?\d{8}"
- re.findall(rule, "020-23546813")
-
-
- p_tel = re.compile(rule)
- p_tel.findall("020-23546813")
-
-
- name_re = re.compile(r"xiaoyi", re.I)
- name_re.findall("Xiaoyi")
- name_re.findall("XiaoYi")
- name_re.findall("xiAOyi")
2、常用函数
Re模块作为一个对象,它还支持很多的操作,例如:
-
-
- obj = name_re.match('Xiaoyi, Zou')
-
- obj = name_re.search('Zou, Xiaoyi')
-
- if obj:
- pass
-
- name_re.findall("Xiaoyi")
-
-
- name_re.finditer("Xiaoyi")
-
-
- rs = r"z..x"
- re.sub(rs, 'python', 'zoux ni ziox me')
- re.subn(rs, 'python', 'zoux ni ziox me')
-
-
- str = "123+345-32*78"
- re.split(r'[\+\-\*]', str)
-
-
- dir(re)
-
-
-
- str =
-
-
-
-
-
- re.findall(r'xiaoyi', str, re.M)
3、分组
分组有两个作用,它用()来定义一个组,组内的规则只对组内有效。
-
- email = r"\w{3}@\w+(\.com|\.cn|\.org)"
- re.match(email, "zzz@scut.com")
- re.match(email, "zzz@scut.cn")
- re.match(email, "zzz@scut.org")
另外,分组可以优先返回分组内匹配的字符串。
-
- str =
-
-
-
-
- r1 = r"hello name=.+ yes"
- re.findall(r1, str)
- r2 = r"hello name=(.+) yes"
- re.findall(r2, str)
-
-
4、一个小实例-爬虫
这个实例利用上面的正则和分组的优先返回特性来实现一个小爬虫算法。它的功能是到一个给定的网址里面将.jpg后缀的图片全部下载下来。
-
-
-
-
-
- import re
- import urllib
-
-
- def getHtml(url):
- print 'Getting html source code...'
- page = urllib.open(url)
- html = page.read()
- return html
-
-
-
- def getImageAddrList(html):
- print 'Getting all address of images...'
- rule = r"src=\"(.+\.jpg)\" pic_ext"
- imReg = re.compile(rule)
- imList = re.findall(imReg, html)
- return imList
-
- def getImage(imList):
- print 'Downloading...'
- name = 1;
- for imgurl in imList:
- urllib.urlretrieve(imgurl, '%s.jpg' % name)
- name += 1
- print 'Got ', len(imList), ' images!'
-
-
- htmlAddr = "http://tieba.baidu.com/p/2510089409"
- html = getHtml(htmlAddr)
- imList = getImageAddrList(html)
- getImage(imList)
八、深拷贝与浅拷贝
Python中对数据的复制有两个需要注意的差别:
浅拷贝:对引用对象的拷贝(只拷贝父对象),深拷贝:对对象资源的拷贝。具体的差别如下:
-
-
-
-
-
- a = [1, 2, 3]
- b = a
- a.append(4)
-
- import copy
- a = [1, 2, ['a', 'b']]
- c = copy.copy(a)
- a.append('d')
-
-
-
- a[2].append('d')
- a[1] = 3
-
-
- d = copy.deepcopy(a)
-
九、文件与目录
1、文件读写
Python的文件操作和其他的语言没有太大的差别。通过open或者file类来访问。但python支持了很多的方法,以支持文件内容和list等类型的交互。具体如下:
-
-
-
-
-
-
- fin = open('./test.txt')
- fin.read()
- fin.close()
-
-
- fin = file('./test.txt')
- fin.read()
- fin.close()
-
-
- fin = open('./test.txt', 'r+')
- fin.write('hello')
- fin.close()
-
-
-
-
- for i in open('test.txt'):
- print i
-
- str = fin.readline()
- list = fin.readlines()
- fin.next()
-
-
- fin.writelines(list)
-
-
- fin.seek(0, 0)
- fin.seek(0, 1)
- fin.seek(-1, 2)
-
-
- fin.flush()
2、OS模块
os模块提供了很多对系统的操作。例如对目录的操作等。我们需要用import os来插入这个模块以便使用。
-
-
-
- import os
-
- os.mkdir('xiaoyi')
- os.makedirs('a/b/c', mode = 666)
- os.listdir()
- os.chdir()
- os.getcwd()
- os.rmdir()
3、目录遍历
目录遍历的实现可以做很多普遍的功能,例如杀毒软件,垃圾清除软件,文件搜索软件等等。因为他们都涉及到了扫描某目录下所有的包括子目录下的文件。所以需要对目录进行遍历。在这里我们可以使用两种方法对目录进行遍历:
1)递归
-
-
- import os
-
- def dirList(path):
- fileList = os.listdir(path)
- allFile = []
- for fileName in fileList:
-
- filePath = os.path.join(path, fileName)
- if os.path.isdir(filePath):
- dirList(filePath)
- allFile.append(filePath)
- return allFile
2)os.walk函数
-
- gen = os.walk('/')
- for path, dir, filelist in os.walk('/'):
- for filename in filelist:
- os.path.join(path, filename)
十、异常处理
异常意味着错误,未经处理的异常会中止程序运行。而异常抛出机制,为程序开发人员提供一种在运行时发现错误,并进行恢复处理,然后继续执行的能力。
-
-
-
-
-
-
-
- try:
- fin = open("abc.txt")
- print hello
-
- except IOError, msg:
- print "On such file!"
-
- except NameError, msg:
- print msg
-
- finally:
- print 'ok'
-
-
- if filename == "hello":
- raise TypeError("Nothing!!")