python学习总结
基于python2.7 的一些学习总结
你好,世界!
# coding=utf-8 print "你好,世界"
备注:需要声明编码格式为gbk或者utf-8才可以输出中文
乘方
1 print 2**10
变量
1 var = 1 2 print var 3 4 var = "你好" 5 print var
获取用户输入
1 #获取用户输入 2 x = input("x:") 3 y = input("y:") 4 5 print x*y
注:input接受的是Python代码,输入中可以访问当前执行环境中的变量,如果想获取原始输入需要使用 raw_input。
函数定义
1 def say_b(): 2 print "b"
强类型
Javascript和Php是弱类型的,Python和Ruby是强类型的。弱类型允许不安全的类型转换,强类型则不允许。
1 #1 + “1” 这行代码在Python中会报错。 2 print 1 + int("1") 3 print str(1) + "1"
字符串
1 #字符串 2 print '''' 段 3 光 4 伟''' 5 print r'C:\log.txt' 6 print 'C:\\log.txt'
序列
这里先介绍三种序列:列表、元祖和字符串。
序列通用操作
1 seq = "0123456789" 2 print seq[0] #从0开始编码。 3 print seq[-1] #支持倒着数数,-1代表倒数第一。 4 print seq[1:5] #支持分片操作,seq[start:end],start会包含在结果中,end不会包含在结果中。 5 print seq[7:] #seq[start:end]中的end可以省略。 6 print seq[-3:] #分片也支持负数。 7 print seq[:3] #seq[start:end]中的start也可以省略。 8 print seq[:] #全部省略会复制整个序列。 9 print seq[::2] #支持步长。 10 print seq[::-2] #支持负步长。 11 print seq[9:1:-1] #支持负步长。 12 print [1, 2, 3] + [4, 5, 6] # 序列支持相加,这解释了为啥字符串可以相加。 13 print [1, 2, 3] * 3 #序列支持相乘,这解释了为啥字符串可以相称。 14 print [None] * 10 #生成一个空序列。 15 print 1 in [1, 2, 3] #成员判断。
可变的列表
1 data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 2 3 data[0] = "a" #修改元素。 4 print data 5 data[0] = 0 6 7 del data[10] #删除元素。 8 print data 9 10 del data[8:] #分片删除。 11 print data 12 13 data[8:] = [8, 9, 10] #分片赋值 14 print data
不可变的元祖
print (1, 2) #元祖以小括号形式声明。 print (1,) #一个元素的元祖。
字符串格式化
1 print "% 10s" % "----" 2 3 print ''' 4 %(title)s 5 %(body)s 6 ''' % {"title": "标题", "body": "内容"}
字典
1 print {"title": "title", "body": "body"} 2 print dict(title = "title", body = "body") 3 print dict([("title", "title"), ("body", "body")])
1 dic = {"title": "title", "body": "body"}; 2 print dic["title"] 3 del dic["title"] 4 print dic
print 语句
1 print 'a', 'b' #print可以接受多个参数,参数的输出之间以空格相隔。 2 print 'a', #如果逗号之后没有参数,则不会换行。 3 print 'b'
序列解包
1 x, y, z = 1, 2, 3 2 print x, y, z 3 (x, y, z) = (1, 2, 3) 4 print x, y, z 5 (x, y, z) = [1, 2, 3] 6 print x, y, z
bool值
1 #下面的输入全部返回False。 2 print(bool(None)) 3 print(bool(())) 4 print(bool([])) 5 print(bool({})) 6 print(bool("")) 7 print(bool(0)) 8 9 #虽然这些值在条件运算中会当做False,但是本身不等于False。 10 print(True and "") 11 print(not "") 12 print(False == "") 13 print(False == 0) #0除外,bool类型的内部表示就是int类型。
bool运算
1 print(0 < 1 < 10) 2 print(0 < 1 and 1 < 10) 3 print(not(0 > 1 > 10)) 4 print(not(0 > 1 or 1 > 10))
语句块
1 if(10 > 1): 2 print("10 > 1") 3 else: 4 print("不可能发生")
三元运算符
1 print("10 > 1" if 10 > 1 else "不可能发生")
相等比较
1 #== 和 is的差别,==比较的是内容,is比较的是引用。 2 x = [1, 2, 3] 3 y = x 4 z = [1, 2, 3] 5 print(x == y) 6 print(x == z) 7 print(x is y) 8 print(x is z)
循环
1 #for循环类似C#的foreach,注意for后面是没有括号的,python真是能简洁就尽量简洁。 2 for x in range(1, 10): 3 print(x) 4 5 for key in {"x":"xxx"}: 6 print(key) 7 8 for key, value in {"x":"xxx"}.items(): 9 print(key, value) 10 11 for x, y, z in [["a", 1, "A"],["b", 2, "B"]]: 12 print(x, y, z)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #带索引的遍历 2 for index, value in enumerate(range(0, 10)): 3 print(index, value) 4 5 #好用的zip方法 6 for x, y in zip(range(1, 10), range(1, 10)): 7 print(x, y) 8 9 #循环中的的else子句 10 from math import sqrt 11 for item in range(99, 1, -1): 12 root = sqrt(item) 13 if(root == int(root)): 14 print(item) 15 break 16 else: 17 print("没有执行break语句。")
pass、exec和eval
1 #pass、exec、eval 2 if(1 == 1): 3 pass 4 5 exec('print(x)', {"x": "abc"}) 6 print(eval('x*2', {"x": 5}))
函数部分
形参和实参之间是按值传递的,当然有些类型的值是引用(对象、列表和字典等)。
1 # 基本函数定义。 2 def func(): 3 print("func") 4 5 func() 6 7 # 带返回值的函数。 8 def func_with_return(): 9 return ("func_with_return") 10 11 print(func_with_return()) 12 13 # 带多个返回值的函数。 14 def func_with_muti_return(): 15 return ("func_with_muti_return", "func_with_muti_return") 16 17 print(func_with_muti_return()) 18 19 # 位置参数 20 def func_with_parameters(x, y): 21 print(x, y) 22 23 func_with_parameters(1, 2) 24 25 # 收集多余的位置参数 26 def func_with_collection_rest_parameters(x, y, *rest): 27 print(x, y) 28 print(rest) 29 30 func_with_collection_rest_parameters(1, 2, 3, 4, 5) 31 32 #命名参数 33 def func_with_named_parameters(x, y, z): 34 print(x, y, z) 35 36 func_with_named_parameters(z = 1, y = 2, x = 3) 37 38 #默认值参数 39 def func_with_default_value_parameters(x, y, z = 3): 40 print(x, y, z) 41 42 func_with_default_value_parameters(y = 2, x = 1) 43 44 #收集命名参数 45 def func_with_collection_rest_naned_parameters(*args, **named_agrs): 46 print(args) 47 print(named_agrs) 48 49 func_with_collection_rest_naned_parameters(1, 2, 3, x = 4, y = 5, z = 6) 50 51 #集合扁平化 52 func_with_collection_rest_naned_parameters([1, 2, 3], {"x": 4, "y": 4, "z": 6}) #这会导致args[0]指向第一个实参,args[1]指向第二个实参。 53 func_with_collection_rest_naned_parameters(*[1, 2, 3], **{"x": 4, "y": 4, "z": 6}) #这里的执行相当于func_with_collection_rest_naned_parameters(1, 2, 3, x = 4, y = 5, z = 6)。
作用域
1 # coding=utf-8 2 3 # 只有函数执行才会开启一个作用域。 4 if(2 > 1): 5 x = 1 6 7 print(x) # 会输出1。 8 9 10 # 使用vars()函数可以访问当前作用域包含的变量。 11 x = 1 12 print(vars()["x"]) 13 14 # 使用globals()函数可以访问全局作用域。 15 x = 1 16 17 def func(): 18 print(globals()["x"]) 19 20 func() 21 22 # 使用locals()函数可以访问局部作用域。 23 def func(): 24 x = 2 25 print(locals()["x"]) 26 27 func() 28 29 # 每个函数定义时都会记住所在的作用域。 30 # 函数执行的时候会开启一个新的作用域,函数内变量访问的规则是:先访问当前作用域,如果没有就访问函数定义时的作用域,递归直到全局作用域。 31 x = 1 32 33 def func(): 34 y = 2 35 print(x, y) # 输出1 2 36 37 func() 38 39 40 # 变量赋值始终访问的是当前作用域。 41 x = 1 42 43 def func(): 44 x = 2 45 y = 2 46 print(x, y) # 输出2 2 47 48 func() 49 print(x) #输出 1 50 51 # 局部变量会覆盖隐藏全局变量,想访问全局变量可以采用global关键字或globals()函数。 52 x = 1 53 54 def func(): 55 global x 56 x = 2 57 y = 2 58 print(x, y) # 输出2 2 59 60 func() 61 print(x) #输出 2
1 # python支持闭包 2 def func(x): 3 def inner_func(y): 4 print(x + y) 5 6 return inner_func 7 8 inner_func = func(10) 9 inner_func(1) 10 inner_func(2)
1 #函数作为对象 2 def func(fn, arg): 3 fn(arg) 4 5 func(print, "hello") 6 func(lambda arg : print(arg), "hello")
模块
几个模块相关的规则:
- 一个文件代表一个模块。
- 可以用import module导入模块,也可以用form module import member导入模块的成员。
- 如果导入的是module,必须使用module.member进行访问;如果导入的member,可以直接访问member。
- 导入的module或member都会变成当前module的member。
b.py
1 # coding=utf-8 2 3 print __name__ 4 5 def say_b(): 6 print "b"
a.py
1 # coding=utf-8 2 3 import b 4 from b import * 5 6 print __name__ 7 8 def say_a(): 9 print "a"
test.py
# coding=utf-8 import a print __name__ a.say_a(); a.say_b(); a.b.say_b()
输出
1 b 2 a 3 __main__ 4 a 5 b 6 b
异常管理
1 # coding=utf-8 2 3 # 自定义异常 4 class HappyException(Exception): 5 pass 6 7 # 引发和捕获异常 8 try: 9 raise HappyException 10 except: 11 print("HappyException") 12 13 try: 14 raise HappyException() 15 except: 16 print("HappyException") 17 18 # 捕获多种异常 19 try: 20 raise HappyException 21 except (HappyException, TypeError): 22 print("HappyException") 23 24 # 重新引发异常 25 try: 26 try: 27 raise HappyException 28 except (HappyException, TypeError): 29 raise 30 except: 31 print("HappyException") 32 33 #访问异常实例 34 try: 35 raise HappyException("都是我的错") 36 except (HappyException, TypeError), e: 37 print(e) 38 39 #按类型捕获 40 try: 41 raise HappyException 42 except HappyException: 43 print("HappyException") 44 except TypeError: 45 print("TypeError") 46 47 #全面捕获 48 try: 49 raise HappyException 50 except: 51 print("HappyException") 52 53 #没有异常的else 54 try: 55 pass 56 except: 57 print("HappyException") 58 else: 59 print("没有异常") 60 61 #总会执行的final 62 try: 63 pass 64 except: 65 print("HappyException") 66 else: 67 print("没有异常") 68 finally: 69 print("总会执行")
操作MYSQL 数据库
需要导入MySQLdb模块
MySQL-python-1.2.3.win32-py2.7.exe
MySQL-python-1.2.3.win-amd64-py2.7.exe
1 import MySQLdb 2 try: 3 conn=MySQLdb.connect(host='127.0.0.1',user='catxjd',passwd='catxjd',port=3306) 4 cur=conn.cursor() 5 6 cur.execute('create database if not exists python') 7 conn.select_db('python') 8 cur.execute('create table test(id int,info varchar(20))') 9 10 value=[1,'hi rollen'] 11 cur.execute('insert into test values(%s,%s)',value) 12 13 values=[] 14 for i in range(20): 15 values.append((i,'hi rollen'+str(i))) 16 17 cur.executemany('insert into test values(%s,%s)',values) 18 19 cur.execute('update test set info="I am rollen" where id=3') 20 21 conn.commit() 22 cur.close() 23 conn.close() 24 25 except MySQLdb.Error,e: 26 print "Mysql Error %d: %s" % (e.args[0], e.args[1])
实例 1、取得 MYSQL 的版本
1 # -*- coding: UTF-8 -*- 2 #安装 MYSQL DB for python 3 import MySQLdb as mdb 4 con = None 5 try: 6 #连接 mysql 的方法: connect('ip','user','password','dbname') 7 con = mdb.connect('localhost', 'root','root', 'test'); 8 9 #所有的查询,都在连接 con 的一个模块 cursor 上面运行的 10 cur = con.cursor() 11 12 #执行一个查询 13 cur.execute("SELECT VERSION()") 14 #取得上个查询的结果,是单个结果 15 16 data = cur.fetchone() 17 print "Database version : %s " % data 18 finally: 19 if con: 20 #无论如何,连接记得关闭 21 con.close()
实例 2、创建一个表并且插入数据
1 import MySQLdb as mdb 2 import sys 3 4 #将 con 设定为全局连接 5 con = mdb.connect('localhost', 'root', 'root', 'test'); 6 with con: 7 8 #获取连接的 cursor,只有获取了 cursor,我们才能进行各种操作 9 cur = con.cursor() 10 11 #创建一个数据表 writers(id,name) 12 cur.execute("CREATE TABLE IF NOT EXISTS \ 13 Writers(Id INT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(25))") 14 15 #以下插入了 5 条数据 16 cur.execute("INSERT INTO Writers(Name) VALUES('Jack London')") 17 cur.execute("INSERT INTO Writers(Name) VALUES('Honore de Balzac')") 18 cur.execute("INSERT INTO Writers(Name) VALUES('Lion Feuchtwanger')") 19 cur.execute("INSERT INTO Writers(Name) VALUES('Emile Zola')") 20 cur.execute("INSERT INTO Writers(Name) VALUES('Truman Capote')")
实例 3、 python 使用 slect 获取 mysql 的数据并遍历
import MySQLdb as mdb import sys #连接 mysql,获取连接的对象 con = mdb.connect('localhost', 'root', 'root', 'test'); with con: #仍然是,第一步要获取连接的 cursor 对象,用于执行查询 cur = con.cursor() #类似于其他语言的 query 函数, execute 是 python 中的执行查询函数 cur.execute("SELECT * FROM Writers") #使用 fetchall 函数,将结果集(多维元组)存入 rows 里面 rows = cur.fetchall() #依次遍历结果集,发现每个元素,就是表中的一条记录,用一个元组来显示 for row in rows: print row
运行结果:
(1L, ‘Jack London')
(2L, ‘Honore de Balzac')
(3L, ‘Lion Feuchtwanger')
(4L, ‘Emile Zola')
(5L, ‘Truman Capote')
上面的代码,用来将所有的结果取出,不过打印的时候是每行一个元祖打印,现在我们使用方法,取出其中的单个数据:
1 import MySQLdb as mdb 2 import sys 3 4 #获取 mysql 的链接对象 5 con = mdb.connect('localhost', 'root', 'root', 'test'); 6 with con: 7 #获取执行查询的对象 8 cur = con.cursor() 9 #执行那个查询,这里用的是 select 语句 10 cur.execute("SELECT * FROM Writers") 11 #使用 cur.rowcount 获取结果集的条数 12 numrows = int(cur.rowcount) 13 #循环 numrows 次,每次取出一行数据 14 for i in range(numrows): 15 #每次取出一行,放到 row 中,这是一个元组(id,name) 16 row = cur.fetchone() 17 #直接输出两个元素 18 print row[0], row[1]
运行结果: 1 Jack London 2 Honore de Balzac 3 Lion Feuchtwanger 4 Emile Zola 5 Truman Capote
实例 4、使用字典 cursor 取得结果集(可以使用表字段名字访问值)
1 import MySQLdb as mdb 2 import sys 3 #获得 mysql 查询的链接对象 4 con = mdb.connect('localhost', 'root', 'root', 'test') 5 with con: 6 #获取连接上的字典 cursor,注意获取的方法, 7 #每一个 cursor 其实都是 cursor 的子类 8 cur = con.cursor(mdb.cursors.DictCursor) 9 #执行语句不变 10 cur.execute("SELECT * FROM Writers") 11 #获取数据方法不变 12 rows = cur.fetchall() 13 #遍历数据也不变(比上一个更直接一点) 14 for row in rows: 15 #这里,可以使用键值对的方法,由键名字来获取数据 16 print "%s %s" % (row["Id"], row["Name"])
实例 5、获取单个表的字段名和信息的方法
1 import MySQLdb as mdb 2 import sys 3 #获取数据库的链接对象 4 con = mdb.connect('localhost', 'root', 'root', 'test') 5 with con: 6 #获取普通的查询 cursor 7 cur = con.cursor() 8 cur.execute("SELECT * FROM Writers") 9 rows = cur.fetchall() 10 #获取连接对象的描述信息 11 desc = cur.description 12 print 'cur.description:',desc 13 #打印表头,就是字段名字 14 print "%s %3s" % (desc[0][0], desc[1][0]) 15 for row in rows: 16 #打印结果 17 print "%2s %3s" % row
运行结果: cur.description: ((‘Id', 3, 1, 11, 11, 0, 0), (‘Name', 253, 17, 25, 25, 0, 1)) Id Name 1 Jack London 2 Honore de Balzac 3 Lion Feuchtwanger 4 Emile Zola 5 Truman Capote
实例 6、使用 Prepared statements 执行查询(更安全方便)
1 import MySQLdb as mdb 2 import sys 3 4 con = mdb.connect('localhost', 'root', 'root', 'test') 5 with con: 6 cur = con.cursor() 7 #我们看到,这里可以通过写一个可以组装的 sql 语句来进行 8 cur.execute("UPDATE Writers SET Name = %s WHERE Id = %s", 9 ("Guy de Maupasant", "4")) 10 #使用 cur.rowcount 获取影响了多少行 11 print "Number of rows updated: %d" % cur.rowcount
结果:
Number of rows updated: 1
实例 7、把图片用二进制存入 MYSQL
有人喜欢把图片存入 MYSQL(这种做法貌似很少吧),我看大部分的程序,图片都是存放在服务器上的文件,数据库中存的只是图片的地址而已,不过 MYSQL 是支持把图片存入数据库的,也相应的有一个专门的字段 BLOB (Binary Large Object),即较大的二进制对象字段,请看如下程序,注意测试图片自己随便找一个,地址要正确:
首先,在数据库中创建一个表,用于存放图片:
1 CREATE TABLE Images(Id INT PRIMARY KEY AUTO_INCREMENT, Data MEDIUMBLOB);
然后运行如下 PYTHON 代码进行:
1 import MySQLdb as mdb 2 import sys 3 4 try: 5 #用读文件模式打开图片 6 fin = open("../web.jpg") 7 #将文本读入 img 对象中 8 img = fin.read() 9 #关闭文件 10 fin.close() 11 except IOError, e: 12 #如果出错,打印错误信息 13 print "Error %d: %s" % (e.args[0],e.args[1]) 14 sys.exit(1) 15 try: 16 #链接 mysql,获取对象 17 conn = mdb.connect(host='localhost',user='root',passwd='root', 18 db='test') 19 #获取执行 cursor 20 cursor = conn.cursor() 21 #直接将数据作为字符串,插入数据库 22 cursor.execute("INSERT INTO Images SET Data='%s'" % 23 mdb.escape_string(img)) 24 #提交数据 25 conn.commit() 26 #提交之后,再关闭 cursor 和链接 27 cursor.close() 28 conn.close() 29 except mdb.Error, e: 30 #若出现异常,打印信息 31 print "Error %d: %s" % (e.args[0],e.args[1]) 32 sys.exit(1)
实例 8、从数据库中把图片读出来
1 import MySQLdb as mdb 2 import sys 3 4 try: 5 #连接 mysql,获取连接的对象 6 conn = mdb.connect('localhost', 'root', 'root', 'test'); 7 cursor = conn.cursor() 8 #执行查询该图片字段的 SQL 9 cursor.execute("SELECT Data FROM Images LIMIT 1") 10 #使用二进制写文件的方法,打开一个图片文件,若不存在则自动创建 11 fout = open('image.png','wb') 12 #直接将数据如文件 13 fout.write(cursor.fetchone()[0]) 14 #关闭写入的文件 15 fout.close() 16 #释放查询数据的资源 17 cursor.close() 18 conn.close() 19 except IOError, e: 20 #捕获 IO 的异常 ,主要是文件写入会发生错误 21 print "Error %d: %s" % (e.args[0],e.args[1]) 22 sys.exit(1)
实例 9、使用 Transaction 即事务(手动提交,自动回滚)
import MySQLdb as mdb import sys try: #连接 mysql,获取连接的对象 conn = mdb.connect('localhost', 'root', 'root', 'test'); cursor = conn.cursor() #如果某个数据库支持事务,会自动开启 #这里用的是 MYSQL,所以会自动开启事务(若是 MYISM 引擎则不会) cursor.execute("UPDATE Writers SET Name = %s WHERE Id = %s", ("Leo Tolstoy", "1")) cursor.execute("UPDATE Writers SET Name = %s WHERE Id = %s", ("Boris Pasternak", "2")) cursor.execute("UPDATE Writer SET Name = %s WHERE Id = %s", ("Leonid Leonov", "3")) #事务的特性 1、原子性的手动提交 conn.commit() cursor.close() conn.close() except mdb.Error, e: #如果出现了错误,那么可以回滚,就是上面的三条语句要么执行,要么都不执行 conn.rollback() print "Error %d: %s" % (e.args[0],e.args[1])