[基础部分]
Python 是一种解释型的、面向对象的、带有动态语义的高级程序设计语言。输出方式:print “Hello world”
空值是Python里一个特殊的值,用None表示。
关于除法运算:默认只取整数部分的结果:1/2=0.要得到小数:1.0/2 或者 1.0/2.0
幂(乘方)运算:2 ** 4 = 16 表示 2的4次方。
关于长整型数:普通整数不能大于 2147483647也不能小于 -2147483648 ,否则要加L。虚数:用j或者J表示
变量名可以包括字母、数字、下划线,不能以数字开头(同PHP)。
print 语句 [Python3.0中 print是函数,要写print(42)而不是 print 42 ]:
获取用户输入: input(‘words’);
使用 import 导入模块,用“模块.函数”调用:
使用 “from 模块 import 函数”可以直接使用;也可以 foo=math.sqrt赋值,然后 foo(4)得到平方根。
将Python值 转换为 字符串 的三种方法:str 、 repr 、 反引号(``) 。
在字符串前面加个前缀 r ,表示这是一个 raw 字符串,里面的字符就不需要转义了。如果要表示多行字符串,可以用'''...''’表示。
以Unicode表示的字符串用u'...'表示,比如:print u’中文’,注意: 不加 u ,中文就不能正常显示。
自定义一个求绝对值的函数:def my_abs(x): if x >= 0: return x else: return -x
return None可以简写为return
从模块导入函数,可以使用:① import module ② from module import function ③ from module import *
还可以在语句末尾增加一个as子句: import math as foobar ; foobar.sqrt(4); ===> 结果是 2.0
也可以为函数提供别名: from math import sqrt as foobar ; foobar(4); ===> 结果是 2.0
一次性给多个变量赋值:x,y,z = 1,2,3
链式赋值,将同一个值赋给多个变量: x = y =somefunction()
如果希望执行普通的除法,在程序前面加上: from __future__ import division
使用 import 导入模块,用“模块.函数”调用: import math; math.floor(32.9);
使用 “from 模块 import 函数”可以直接使用:from math import floor; floor(32.9);
[数据类型]
Python中基本的数据结构是“序列”。序列分为6种,最主要的两种类型是“列表”和“元组”,其他的序列:字符串、Unicode字符串、buffer对象、xrange对象。
几乎所有的情况下,列表都可以替代元组;除了 在使用元组作为字典的键,此时因为键不可修改,所以不能使用列表。
对序列的操作:索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)、计算长度、找出最大元素和最小元素、迭代(对序列中的每个元素重复执行某些操作)。
(1)索引:可以通过索引获取元素。-1表示从右边取值。
(2)分片:获取一定范围内的序列(或者字符串),用冒号(:) 分割start和end的范围,例如 tag[1:6]
(3)分片:更大的步长。例如:每隔2取一个数;每隔3取一个数。
(4)序列相加(连接):必须是相同类型的序列才能连接在一起,用 + 符号连接。
(5)序列的乘法,用 * 符号连接:
(6)检查一个值是否在序列中用in ,返回布尔。
(7)序列的:长度 len()、最小值min()、最大值max()。
列表:
list是一种有序的集合,可以随时添加和删除其中的元素。用[]把list的所有元素都括起来,就是一个list对象。
x = ['Adam', 'Lisa', 'Bart’] 正序打印 L[0],倒序打印 L[-1]
列表方法这样调用: 对象.方法(参数)
count()方法 统计某个元素在列表中出现的次数: x.count(y)
index()方法 从列表中找出某个值第一个匹配项的索引位置: x.index('value')
append()方法 把新的元素添加到 list 的尾部 x.append(y)
insert()方法 把新元素添加到 list 的指定位置 x.insert(1,'xyz')
pop()方法 删除最后一个元素 x.pop(),删除指定位置的元素 x.pop(1)
remove()方法 移除列表中某个值的第一个匹配项 x.remove('value')
reverse()方法 将列表中的元素翻转 x.reverse()
sort()方法 对列表排序 x.sort()
高级排序compare(x,y): xy返回正数,x=y返回0。
元组:
tuple是不可变的集合:
t = ('Adam', 'Lisa', 'Bart')
空tuple:t = (),单元素tuple,直接使用t = (1),会输出 1;
Python 规定,单元素 tuple 要多加一个逗号”,":t = (1,)
基本的元组操作:除了创建和访问之外,没有其他太多操作。
字符串:
都是不可变的。字符串格式化的操作符(%)
例如:格式化浮点数,使用如下方式: %.3f
字符串方法:
(1) find方法:在一个较长的字符串中查找子字符串,返回子串所在位置的最左端索引,若没找到则返回-1.
x.find(‘y’, start, end) 表示在start和end之间查找。
(2) join 方法:在队列中添加元素,需要添加的队列元素都必须是字符串。
(3) split方法:分割字符串,和join相反。
(4) lower方法:将字符串转换为小写
(5) replace方法:替换字符串
(6) strip方法:去除两侧的空格。
映射:
通过键引用值的数据结构,字典是Python中唯一内建的映射类型。
个人理解:Python中的“字典”就像是PHP中的“数组”,或者“json”,就是一个一个的键值对。
创建字典
phonebook = {'zhang':'111', 'wang':'222', 'zhao':'333'}
也可以用用dict函数建立字典:
item = [('name','rx'),('age',27)]
d = dict(item)
字典的操作,与“序列”很类似:
(1)字典的键不一定是整数类型,可以是任何不可变的类型(比如:浮点型、字符串、元组)
(2)字典可以自动添加(类似PHP的数组)
(3)表达式 k in d(d为字典)查找的是键 而不是值,表达式 v in l(l为列表) 查找的是值 而不是索引。
字典方法:
(1)clear方法:清除字典中所有的项,无返回值。
(2)copy方法:返回一个具有相同 key-value 的新字典。
(3)fromkeys方法:使用给定的key建立新的字典,每个key默认对应的value为None。
(4)get方法:一般情况下,访问字典中不存在的项时会出错,但使用get就不会:
(5)has_key方法:检查字典中是否包含给出的key,返回布尔。表达式 d.has_key(k) 相当于 k in d.
(6)items 和 iteritems:将所有的字典项以列表方式返回,但返回时没有特殊的顺序。
(7)keys 和 iterkeys:keys方法将字典中的键以列表的形式返回,iteritems方法返回针对键的迭代器。
(8)pop方法:获得对应于给定键的值,然后将这个key-value从字典中移除。
(9)popitem方法:弹出列表中的随机的项。
(10)setdefault方法:类似get方法。能够获得与给定键相关联的值,还能在字典中不含有给定键的情况下设定相应的键值。
(11)update方法:利用一个字典项更新另外一个字典。提供的字典中的项会被添加到旧的字典中,若有相同的键则会进行覆盖。
(12)values 和 itervalues:以列表的形式返回字典中的值(itervalues返回值的迭代器)。与返回键的列表不同的是,返回值的列表中可以包含重复的元素。
[条件判断和循环]
Python中,用冒号(:) 标识语句块的开始,块中的每一个语句都是缩进的,当回退到和已经闭合的块一样的缩进量时,表示当前块结束。
下列值在布尔类型中都表示false:False、None、0、""、()、[]、{} ,其他的则为true。
使用bool函数可以将其他类型转换为布尔:bool('hello') --> True
if ... else ... elif 语句
x is y : 判断x和y是否是同一个对象,注意和 == 对比:
使用 == 判定两个对象是否相等,使用is判定两个对象是否等同(是否是同一个对象)。
in成员资格运算符:
if 'x' in 'xyz':
print True
else:
print False
且/或/非: and/or/not
三元运算符: a if b else c :如果b为真则返回a,否则返回c。
while循环:
判断用户是否输入了名字:
while not name or name.isspace()
for循环
说明:如果能使用for循环,则尽量不要使用while循环。
words = ['a','b','c','d']
for x in words:
print x
range的使用(类似于分片):
range(0.3) --> [0,1,2]
循环遍历字典元素:
d = {'x':1,'y':2,'z':3}
for key in d:
print key,'--->',d[key]
跳出循环:break 和 continue
另外三个语句:pass、 del、 exec
(1)Python中空代码块是非法的,所以需要在语句块中加上pass:
(2)del语句:移除对象。
(3)exec:执行一个字符串。
(4)eval:用于“求值”—— 会计算Python表达式并且返回结果值。
[抽象]
内建的callable函数可以判断函数是否可调用
定义函数:def语句,可以设置默认值,可以没有return:
def test(name='default',age=20):
return 'Hello' + name + age
print test('renxing',29)
函数的参数中定义元组,需要加*号:
def test(title,*params):
print title
print params
test('hello:','a','b','c')
函数的参数中定义字典,加**号:
def test(**params):
print params
test(x=1,y=2,z=3)
结果:{'y': 2, 'x': 1, 'z': 3}
作用域——内建的vars函数
函数内的变量称为局部变量,全局变量用global表示。
函数可以嵌套:
def foo():
def bar():
print “Hello_world”
常用函数整理:
pow(num) 乘方
abs(num) 绝对值
round(num) 四舍五入
help() 提供交互式帮助
input(prompt) 获取用户输入
raw_input(prompt) 获取用户输入,返回的类型是 字符串
repr(object) 返回值的字符串表示形式
str(object) 将值转换为字符串
[类和对象]
面向对象的三大特性:继承、封装、多态。
创建类:
class Person:
def setName(self,name):
self.name = name
def getName(self):
return self.name
调用:
foo = Person()
foo.setName('renxing')
print foo.getName()
Python并不直接支持私有方式,为了让方法或者特性变为私有(从外部无法访问),只要在函数名前面加上双下划线即可:
class Person:
def __getName():
print 'private function'
如果要查看一个类是否是另一个类的子类,使用内建的 issubclass 函数
如果想要知道已知类的基类,可以使用它的特殊特性: __bases__
同样,还能使用 isinstance 方法检查一个对象是否是一个类的实例
如果只想知道一个对象属于哪个类,可以使用 __class__ 特性
__bases__ 复数形式说明了 它的基类可能会多于一个,称为:多重继承。
接口和内省:
让对象符合当前的接口,也就是实现当前的方法
与 getattr 相对应的函数是: setattr,用来设置对象的特性
如果要查看对象内所有存储的值,可以使用 __dict__ 特性。
魔术方法: __future__ 、__init__ 、 __iter__
构造方法: __init__
析构方法: __del__
序列和映射 是对象的集合。如果对象是不可变的,那么需要使用两个魔法方法,如果是可变的则需要使用4个。
__len__(self): 返回集合中所含项目的数量。
__getitem__(self,key): 返回与所给键对应的值。
__setitem__(self,key,value): 按一定的方式存储和key相关的value(只能为可以修改的对象定义这个方法)。
__delitem__(self,key): 此方法在对一部分对象使用del语句时被调用,同时必须删除和元素相关的键。
当子类化一个内建类型(如list)的时候,就会间接地将object子类化,就会自动成为新式类,可以使用像super函数这样的特性了。
访问器方法——能够使用getHeight、setHeight这样的名字重绑定一些特性。
property 函数
静态方法: @staticmethod ;类成员方法: @classmethod
迭代器 __iter__,
具有next方法,不需要任何参数。
(1) 一个实现了 __iter__ 方法饿的对象是可迭代的,一个实现了next方法的对象是迭代器。
(2) 内建函数 iter 可以从可迭代的对象中获得迭代器。
(3) 使用list构造方法可以显式地将迭代器转化为列表
生成器是一种用普通的函数语法定义的迭代器。生成器是一个包含yield关键字的函数。
包 :
基本上就是另外一类模块,而且能包含其他模块。当模块存储在文件中时(扩展名.py),包 就是模块所在的目录。 __init__py文件。
例如有个名为 constants的包,文件 constant/__init__.py包括语句 PI=3.14,那么可以:
import constants;
print constants.PI;
__all__ 变量:
help() 函数:例如 help(copy);
标准库: sys 模块能够访问与Python解释器联系紧密的变量和函数。使用方法:sys.argv;sys.exit;
os模块提供了访问多个操作系统服务的功能。os和它的子模块os.path还包括一些用于检查、构造、删除目录和文件的函数。
fileinput 模块——能够遍历文本文件的所有行。
[集合]
使用set创建集合:
set(range(5)) --> set([0,1,2,3,4])
集合元素是无顺序的:
set(['a','b','c']) --> set(['c','a','b'])
计算两个集合的并集,使用union方法,或者 | 运算符。
[堆]
堆 是“优先队列”的一种,使用优先队列能够以任意顺序增加对象,并且能在任何时间找到最小的元素。
Python中只有一个包含一些堆操作函数 的模块,叫做 heapq,包含6个函数。
(1)heappush 函数 用于增加堆的项,只能用于通过各种堆函数建立的列表中。
(2)heappop 函数 弹出最小的元素。
(3)heapify 函数 使用任意列表作为参数,并且通过尽可能少的移位操作,将其转换为合法的堆。
(4)heapreplace 函数 弹出堆的最小元素,并且将新元素推入,这样比 调用heappop之后再调用heappush更高效。
[双端队列] deque
双端队列——在需要按照元素增加的顺序来移除元素时非常有用。
双端队列通过可迭代对象(比如集合)创建。
[time]
time 模块所包含的函数能够实现以下功能:
获得当前时间、操作时间和日期、从字符串读取时间以及格式化时间为字符串。
time.asctime() 将当前时间格式化为字符串
[random]
random模块包括返回随机数的函数。
[shelve]
shelve是一额简单的数据存储方案,他只有一个函数就是open(),
这个函数接收一个参数就是文件名,然后返回一个shelf对象,
你可以用他来存储东西,就可以简单的把他当作一个字典,
当你存储完毕的时候,就调用close函数来关闭。
【文件和素材】
打开文件用open函数,参数'rb'可以用来读取一个二进制文件。
使用f.write(string) 追加写入,使用 f.read() 读取,使用f.close() 关闭文件。
f.readlines() 读取一个文件的所有行,f.readline() 读取一行。
按行操作——在while循环中使用readline。
用readlines 迭代行:
使用 fileinput 实现懒惰行迭代:
可以对文件迭代器执行和普通迭代器相同的操作。比如将它们转换为字符串列表,使用 list(open(filename)); 这样和使用readlines 效果一样。
【图形用户界面 GUI 】
最成熟的跨平台Python GUI工具包—— wxPython
【安装MySQL-python】
要想使python可以操作mysql 就需要MySQL-python驱动,它是python 操作mysql必不可少的模块。
检查MySQLdb 模块是否可以正常导入:import MySQLdb
python 操作mysql数据库基础:
#coding=utf-8
import MySQLdb
#Connect() 方法用于创建数据库的连接,里面可以指定参数:用户名,密码,主机等信息。
#这只是连接到了数据库,要想操作数据库需要创建游标。
conn= MySQLdb.connect(
host='localhost',
port = 3306,
user='root',
passwd='',
db ='rxpython',
)
#通过获取到的数据库连接conn下的cursor()方法来创建游标。
#通过游标cur 操作execute()方法可以写入纯sql语句。
#通过execute()方法中写如sql语句来对数据进行操作。
cur = conn.cursor()
#创建数据表
cur.execute("create table student(id int ,name varchar(20),class varchar(30),age varchar(10))")
#插入一条数据
cur.execute("insert into student values('2','Tom','3 year 2 class','9')")
#修改查询条件的数据
cur.execute("update student set class='3 year 1 class' where name = 'Tom'")
#删除查询条件的数据
cur.execute("delete from student where age='9'")
#关闭游标
cur.close()
#提交事务
conn.commit()
#关闭数据库连接
conn.close()
一次性向数据表中插入多条值:
executemany() 方法可以一次插入多条值,执行单条sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数。
sqli = "insert into student values(%s,%s,%s,%s)"
cur.executemany(sqli,[
('11','zhang','aaaaa','1001'),
('12','wang','bbbbb','1002'),
('13','li','ccccc','1003'),
('14','zhao','ddddd','1004'),
])
查询语句:
(1)aa=cur.execute("select * from student"); print aa;
----> 获得的只是表中有多少条数据。
(2)fetchone() 方法可以获得表中的数据,可是每执行一次,游标会从表中的第一条数据移动到下一条数据的位置。
scroll(0,'absolute') 方法可以将游标定位到表中的第一条数据。
(3)获得表中的多条数据并打印出来,使用 fetchmany()