MongoDB基础入门_云涛_新浪博客

Posted on

MongoDB基础入门云涛新浪博客

新浪博客

博客首页

登录注册 你没见过的口袋妖怪 发博文

博文

×

推荐:2012博客年终盘点最小清新年度热图盘点 推荐:2012博客年终盘点最小清新年度热图盘点

云涛

http://blog.sina.com.cn/shangguanyuntao [订阅][手机订阅]

首页 博文目录 图片 关于我

个人资料

云涛

云涛

Qing 微博 加好友 发纸条

写留言 加关注

  • 博客等级:
  • 博客积分:176

  • 博客访问:8,061

  • 关注人气:2

相关博文

谭氏太极

微三国

医生爱红酒 更多>> 精彩图文

黑白世界中的人体之美

  • 黑白世界中的人体之美
  • 实拍色彩斑斓的威尼斯
  • 自制薰衣草马卡龙

查看更多>>

推荐博文

康斯坦丁

趣看天下

科学松鼠会

李秋雨

李秋雨

趣看天下

董正伟

惠普中国研究院

刘兴亮

itkiller

  • 兰州郊外乡村雪中行

兰州郊外乡村雪中行

  • 熊猫基因有助人体健康

熊猫基因有助人体健康

  • 男子体验分娩痛不欲生

男子体验分娩痛不欲生

  • 显微镜下的真实生活

显微镜下的真实生活

  • 挖地道洗劫银行金库

挖地道洗劫银行金库

  • 游戏迷最爱蛋糕

游戏迷最爱蛋糕

查看更多>> 谁看过这篇博文

暂无访客

正文 字体大小:

MongoDB基础入门

(2012-11-14 14:26:35)

转载

标签:

三元素

文件夹

关系数据库

集合

文档

it

分类: MongoDB 关于MongoDB的好处,优点之类的这里就不说了,唯一要讲的一点就是MongoDB中有三元素:数据库,集合,文档,其中“集合”就是对应关系数据库中的“表”,“文档”对应“行”。

一: 下载

上MongoDB官网 ,我们发现有32bit和64bit,这个就要看你系统了,不过这里有两点注意:

①:根据业界规则,偶数为“稳定版”(如:1.6.X,1.8.X),奇数为“开发版”(如:1.7.X,1.9.X),这两个版本的区别相信大家都知道吧。

②:32bit的MongoDB最大只能存放2G的数据,64bit就没有限制。

我这里就下载"2.0.2版本,32bit“,ok,下载之后我就放到”E盘“,改下文件夹名字为”MongoDB“。

二:启动

①:启动之前,我们要给MongoDB指定一个文件夹,这里取名为”db",用来存放MongoDB的数据。

八天学会MongoDB:第一天 基础入门

②:微软徽标+R,输入cmd,首先找到“MongoDB”的路径,然后运行mongod开启命令,同时用--dbpath指定数据存放地点为“db”文件夹。

八天学会MongoDB:第一天 基础入门

③:最后要看下是否开启成功,从图中的信息中获知,MongoDB采用27017端口,那么我们就在浏览器里面键入“http://localhost:27017/”,

打开后,MongoDB告诉我们在27017上Add 1000可以用http模式查看MongoDB的管理信息。

八天学会MongoDB:第一天 基础入门

三:基本操作

由于是开篇,就大概的说下基本的“增删查改“,我们再开一个cmd,输入mongo命令打开shell,其实这个shell就是MongoDB的客户端,

同时也是一个js的编译器,默认连接的是“test”数据库。

八天学会MongoDB:第一天 基础入门

<1> insert 操作

好,数据库有了,下一步就是集合,这里就取集合名为“person”,要注意的就是文档是一个json的扩展(Bson)形式。

八天学会MongoDB:第一天 基础入门

<2> find 操作

我们将数据插入后,肯定是要find出来,不然插了也白插,这里要注意两点:

① “_id": 这个字段是数据库默认给我们加的GUID,目的就是保证数据的唯一性。

② 严格的按照Bson的形式书写文档,不过也没关系,错误提示还是很强大的。

八天学会MongoDB:第一天 基础入门

<3> update操作

update方法的第一个参数为“查找的条件”,第二个参数为“更新的值”,学过C/#,相信还是很好理解的。

八天学会MongoDB:第一天 基础入门

<4> remove操作

remove中如果不带参数将删除所有数据,呵呵,很危险的操作,在MongoDB中是一个不可撤回的操作,三思而后行。

八天学会MongoDB:第一天 基础入门

分享: 分享到新浪Qing

0

喜欢 阅读(16) 评论 (0) 收藏(0) 转载(0) 喜欢 打印举报

已投稿到: 排行榜 圈子

转载列表:

* 转载

转载是分享博文的一种常用方式... 前一篇:Linux压缩及解压命令

后一篇:MongoDB细说增删查改

评论 重要提示:警惕虚假中奖信息|[商讯]我有明星气势签名

[发评论]

发评论 [商讯]爱心签名换梦想,天天派奖|[商讯]提高博客人气新方法

小新小浪炮炮兵张富贵旺狗悠嘻猴酷巴熊更多>>

昵 称:

分享到微博 评论并转载此博文

验证码: 请点击后输入验证码 收听验证码

匿名评论

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。 < 前一篇Linux压缩及解压命令

后一篇 >MongoDB细说增删查改

新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2013 SINA Corporation, All Rights Reserved

新浪公司 版权所有

X

分享到...

选择其他平台 >> 365

长微博

微语录

九宫格

发照片

发视频

发商品

最近喜欢了的博主: 加载中…

分享到新浪微博

为了您的账号安全,请绑定邮箱 分享到X

腾讯微博

一键通 新浪微博

QQ空间

人人网 天涯

凤凰微博 朋友网

人民微博 豆瓣网 搜狐微博

新华微博 手机

网易微博 开心网

百度空间 QQ好友 更多平台... (130)

bShare

幻灯播放

关闭

百度笔试题

Posted on

百度笔试题 - 面试秘籍 - Job - ITeye论坛

您还未登录 ! 我的应用 登录 注册

ITeye-最棒的软件开发交流社区

-

论坛首页招聘求职版面试秘籍

百度笔试题

全部 企业点评 职场话题 求职经验 面试秘籍 招聘职位

中国智汇 云领全球 华为终端智汇云开发者大赛火热开赛

浏览 1060 次 主题:百度笔试题

精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0) 作者 正文 * mistbow

  • 等级: 初级会员
  • mistbow的博客
  • 性别:
  • 文章: 5
  • 积分: 30
  • 来自: 沈阳
  • 发表时间:18 小时前 最后修改:18 小时前

< > 猎头职位: 上海: 上海:天会皓闻诚聘资深Java架构师

相关文章:

推荐链接

写log文件吧! 记录url,ip,date; 按天做备份,类似access.log 返回顶楼 回帖地址

0 0 请登录后投票 * sniffer123

  • 等级: 初级会员
  • sniffer123的博客
  • 性别:
  • 文章: 52
  • 积分: 30
  • 来自: 上海
  • 发表时间:13 小时前

不懂 按我的想法 分时间段存数据 每个时间段的数据按树状组织 叶子上记录次数 要是用哈希的话 很难统计范围数据吧 返回顶楼 回帖地址

0 0 请登录后投票 * kanny87929

  • 等级: 初级会员
  • kanny87929的博客
  • 性别:
  • 文章: 234
  • 积分: 30
  • 来自: 上海
  • 发表时间:10 小时前 最后修改:9 小时前

如果要设计一个系统那真的是难为你了 但要是让你设计查询的思路还是可以的 假设就一张表,表里3个字段 url, ip, date 存上1000亿条数据,你需要在这3个字段上都建立索引,利用分词 如果里面有一条数据 url:http://www.iteye.com/topic/1037635 分解这个url的词源可以为http,www.iteye.com,topic/1037635 ip:192.168.1.3 分解这个ip的词源可以为192,168,1,3 date:2011-05-10 21:56:37 分解这次date的词源可以为2011-05-10, 21, 56, 37 每个词源都可以建立索引 比如说你查的就是这条url,由于你本条url已经被分词,并且建立了索引, 也许符合http索引里有900亿,在这900亿里符合www.iteye.com的有10亿,10亿里符合topic/1037635的有103191条,那么这个就是此url的总访问量,如果加上时间的判断就是某段时间段的访问量 在1000亿条的数据表上对每一个字段,进行分词和建立索引,是一个需要精密排序算法,和也许需要多CPU分布计算处理的过程,建立索引再优化的算法也需要一定的时间,但一旦索引建立好,通过索引的归类排序查询起来就非常的快。 我不知道楼主是不是深刻理解,索引的真正目的 在数据上建立索引就是把数据进行归类排序的过程 比如我公司有100人,我为了快速在员工手册上找到这个人 我首先要知道这个员工的一些最基本属性,比如姓名,性别,年龄(当然大多就知道个姓名就够了) 那么我的员工手册的目录就要有几种讲究 如果 按,性别分为男和女,男员工从第1页到第200页,女员工从第201页到400页 然后在性别男的结果集中分,20到30岁之间的几页到几页,30到40岁之间的几页到几页 然后如果我想看一下30到40岁之间的就可以翻到拿一页开始看。 这里的排版只是个比喻,一般企业都是按职位和部门分排,这样看到那个部门就知道下面有那些员工 如果我设计了一个索引算法 有一个人叫张峰,那么把张和峰分开建立索引,那么就会把姓张的或是名字里有张这个字的人全部归类到张这个索引下(当然算法是自己定了,定的时候只要求名字开头第一个字为张的才归类,名字里有张的不算也是可以的),然后名字里有峰的人归到一类。这样就很容易快速找到 如果归类的数据集比较大,那么在归类的数据集上在归类。这个就是索引上再建立索引, 所以说为什么索引的建立和修改是需要花大量的计算和时间的 但最好还是只建立一层索引,多种索引,看到新华字典的编排就是一个典型的例子 就2种索引,一种按拼音,一种按偏旁,而按偏旁的索引又是一个层次索引,因为找到某个偏旁后,翻到那页还要有一个数笔画确认字的索引。最后你才能确认这个字在具体哪一页。 总结:索引的目的就是为了最大限度减少查询的次数。 那么百度这个1000亿数据的题目,其实应该考查你对建立索引和查询索引的一个思路,如果让你写算法,那真不是一朝一夕就马上出来的事。 返回顶楼 回帖地址

0 0 请登录后投票 * chinaagan

  • 等级: 初级会员
  • chinaagan的博客
  • 性别:
  • 文章: 1
  • 积分: 30
  • 来自: 重庆
  • 发表时间:9 小时前

采用缓存,然后写进日志文件里面,然后采用分布式比如hadoop来分析日志。不知道有没有道理? 返回顶楼 回帖地址

0 0 请登录后投票 * yizhilong28

  • 等级: 初级会员
  • yizhilong28的博客
  • 性别:
  • 文章: 76
  • 积分: 30
  • 来自: 武汉
  • 发表时间:2 小时前

chinaagan 写道

采用缓存,然后写进日志文件里面,然后采用分布式比如hadoop来分析日志。不知道有没有道理? 估计这个最符合百度的心意,呵呵。 返回顶楼 回帖地址

0 0 请登录后投票 * lkj107

  • 等级: 初级会员
  • lkj107的博客
  • 性别:
  • 文章: 2025
  • 积分: 40
  • 来自: 石家庄
  • 发表时间:1 小时前

这种数据如果用nosql应该很费劲吧,还是用传统的数据库方便,因为是分段的,当然是分表了,例如每个月一张表,表四个字段,主键,url,ip,日期 返回顶楼 回帖地址

0 0 请登录后投票 * mistbow

  • 等级: 初级会员
  • mistbow的博客
  • 性别:
  • 文章: 5
  • 积分: 30
  • 来自: 沈阳
  • 发表时间:31 分钟前

感谢大家的回答,学到不少知识 返回顶楼 回帖地址

0 0 请登录后投票 * skord

  • 等级: 初级会员
  • skord的博客
  • 性别:
  • 文章: 3
  • 积分: 30
  • 来自: 上海
  • 发表时间:28 分钟前

学习了. kanny87929 写道

如果要设计一个系统那真的是难为你了 但要是让你设计查询的思路还是可以的 假设就一张表,表里3个字段 url, ip, date 存上1000亿条数据,你需要在这3个字段上都建立索引,利用分词 如果里面有一条数据 url:http://www.iteye.com/topic/1037635 分解这个url的词源可以为http,www.iteye.com,topic/1037635 ip:192.168.1.3 分解这个ip的词源可以为192,168,1,3 date:2011-05-10 21:56:37 分解这次date的词源可以为2011-05-10, 21, 56, 37 每个词源都可以建立索引 比如说你查的就是这条url,由于你本条url已经被分词,并且建立了索引, 也许符合http索引里有900亿,在这900亿里符合www.iteye.com的有10亿,10亿里符合topic/1037635的有103191条,那么这个就是此url的总访问量,如果加上时间的判断就是某段时间段的访问量 在1000亿条的数据表上对每一个字段,进行分词和建立索引,是一个需要精密排序算法,和也许需要多CPU分布计算处理的过程,建立索引再优化的算法也需要一定的时间,但一旦索引建立好,通过索引的归类排序查询起来就非常的快。 我不知道楼主是不是深刻理解,索引的真正目的 在数据上建立索引就是把数据进行归类排序的过程 比如我公司有100人,我为了快速在员工手册上找到这个人 我首先要知道这个员工的一些最基本属性,比如姓名,性别,年龄(当然大多就知道个姓名就够了) 那么我的员工手册的目录就要有几种讲究 如果 按,性别分为男和女,男员工从第1页到第200页,女员工从第201页到400页 然后在性别男的结果集中分,20到30岁之间的几页到几页,30到40岁之间的几页到几页 然后如果我想看一下30到40岁之间的就可以翻到拿一页开始看。 这里的排版只是个比喻,一般企业都是按职位和部门分排,这样看到那个部门就知道下面有那些员工 如果我设计了一个索引算法 有一个人叫张峰,那么把张和峰分开建立索引,那么就会把姓张的或是名字里有张这个字的人全部归类到张这个索引下(当然算法是自己定了,定的时候只要求名字开头第一个字为张的才归类,名字里有张的不算也是可以的),然后名字里有峰的人归到一类。这样就很容易快速找到 如果归类的数据集比较大,那么在归类的数据集上在归类。这个就是索引上再建立索引, 所以说为什么索引的建立和修改是需要花大量的计算和时间的 但最好还是只建立一层索引,多种索引,看到新华字典的编排就是一个典型的例子 就2种索引,一种按拼音,一种按偏旁,而按偏旁的索引又是一个层次索引,因为找到某个偏旁后,翻到那页还要有一个数笔画确认字的索引。最后你才能确认这个字在具体哪一页。 总结:索引的目的就是为了最大限度减少查询的次数。 那么百度这个1000亿数据的题目,其实应该考查你对建立索引和查询索引的一个思路,如果让你写算法,那真不是一朝一夕就马上出来的事。 返回顶楼 回帖地址

0 0 请登录后投票

论坛首页招聘求职版面试秘籍 跳转论坛:Java编程和Java企业应用 Web前端技术 移动编程和手机应用开发 C/C++编程 Ruby编程 Python编程 PHP编程 Flash编程和RIA Microsoft .Net 综合技术 软件开发和项目管理 行业应用 入门讨论 招聘求职 海阔天空

© 2003-2011 ITeye.com. [ 京ICP证110151号 ]

阿里巴巴笔试题_身高排队问题

Posted on

阿里巴巴笔试题_身高排队问题

您还未登录 ! 我的应用 登录 注册

JavaEye-最棒的软件开发交流社区

论坛首页招聘求职版求职经验

阿里巴巴笔试题_身高排队问题

全部 企业点评 职场话题 求职经验 面试秘籍 招聘职位

浏览 248 次 主题:阿里巴巴笔试题_身高排队问题

精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0) 作者 正文 * thinke365

  • 等级: 初级会员
  • thinke365的博客
  • 文章: 9
  • 积分: 90
  • 来自: 杭州
  • 发表时间:前天

相关文章:

  • 趣味编程:24点算法实现
  • 2006百度之星程序设计大赛试题-变态比赛规则(解答)
  • 来来来,有兴趣的人便来战这算法题吧: 推荐圈子: Pipboy 更多相关推荐 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 假定这12个人各自有自己的编号,即1、2、3... 11、12. 并且编号1到编号12所代表的人身高是递增的。 解这道题基于观察发现的如下规律: a、第一排第一个人必定是1. b、第一排第二个位置的可选值是2、3,第一排第三个位置的可选值是3、4、5,...,第一排第6个人的可选值是6、7、8、9、10、11 c、第一排的数字确定后,第二排的顺序可以唯一确定。因为剩下的6个数字只能递增排列(显然只有一种结果),所以只需确定第一排的所有排列可能就行了。 如下是解题的最初实现方法。采用穷举法实现。 /#include using namespace std; /#include /#include // 后来发现不需要记录路径中现有节点。因为数字本身存在偏序的问题,往上涨就行了 set path; vector> marks; int getCount(int depth, int max) { if(depth==marks.size()) { int flag=0; for(int i=0; imax) { flag ++; } } return flag; } int count = 0; for(int i=0;imax) { count += getCount(depth+1,marks[depth-1][i]); } } return count; } int main() { int n; while(cin>>n) { marks.clear(); for(int i=1; i<=n/2; i++) { vector node; for(int j=0;j<i;j++) { node.push_back(i+j); } marks.push_back(node); } cout << getCount(1, 0) << endl; } return 0; } 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。

推荐链接

论坛首页招聘求职版求职经验 跳转论坛:Java编程和Java企业应用 Web前端技术:AJAX和RIA 移动编程和手机应用开发 C/C++编程 Ruby编程 Python编程 PHP编程 Flash编程 Microsoft .Net 综合技术 软件开发和项目管理 行业应用 入门讨论 招聘求职 海阔天空

© 2003-2009 JavaEye.com. All rights reserved. 上海炯耐计算机软件有限公司 [ 沪ICP备05023328号 ]

Python语言经验总结

Posted on

Python语言经验总结

Python语言经验总结

Python语言是不被大多数人知道的东西,这里就简单概述下Python语言,顺便闲谈一下Python 标准库。“俗话”说:库即是语言,语言即是库。由此可见拥有一套高质量、具备良好可复用库对于一门通用开发语言来说有多重要。这也的难怪“C + + 老爹”BjarneStroustrup? 逢人就大倒苦水:C++的库还是太少,C++社群需要开发更多高质量的库出来!

还好,为Python语言开发一套质量不错的库的复杂程度远没有C++来得复杂。而且Python社区同样也深知库的重要性。结果就是Python的发行版即奉上超过300个的标准库(这还不包括专门针对Mac机的50 余个库,谁让那小子另类呢)。 300 多个库中,绝大部分具备跨平台能力(/*NIX/Windows)。这些库覆盖了开发的方方面面,Python语言的用户可以在一个典型命令行环境下(比如Linux Shell),仅仅利用标准库即可完成绝大部分工作,同时无需考虑库的各种兼容性问题。Python社群对于库的重视可见一斑。

即便是拥有如此多的标准库。这也似乎未能阻止Python社群的开发者们天马行空般的思维。借助于动态语言简洁、优雅、灵活的表达能力,这些第三方的库经常展现出令人赞叹的想象力。

好吧,现在让我们在庞大的Python库选取点滴,也许它能带给我们一些另类的思考。

SQLObject

SQLObject 可以看做是Python领域的Hibernate。它也是目前python社区中最为成熟方便的O/R mapping工具。和Hibernate相比,SQLObject 利用了动态语言的独有特性,通过灵活使用继承、灵活使用MetaData?能力,能够快速方便定义直接在程序中定义映射类,不用像Hibernate中那样还需单独定义一个XML文件。同样,借助强大的动态能力,SQLObject 还拥有一个Hibernate所远不及的功能,那就是SQLObject 的映射类可以在运行时动态改变自身结构,这也意味着数据库中的表结构也可以在运行时进行改变。总之,对Hibernate略有了解的开发者均能迅速理解SQLObject。虽然我一直认为SQLObject 还远未能将Python 的动态能力发挥到极致。不过这却是一个良好的开始。也许我们可以在不久将来看到更多更具新意的O/R mapping 工具。

TurboGear?

自RoR(Ruby on Rails)在Web开发领域一夜成名后,在其它语言社区,跟风之作也如雨后春笋一般涌现出来。虽然TurboGear?并非刻意模仿RoR 之作,不过它确确实实借着RoR流行潮流得到更多人的重视。与RoR相同,TurboGear?也是一个轻量级Web开发套件,通过几个命令行工具能够快速生成以数据库为核心的基本框架代码。典型的RoR 思想!这和许多开源框架的原则一样——“避免重新发明轮子”。TurboGear?的Web 控制层使用CherryPy?;持久层使用SQLObject;模板使用Kid;AJAX使用MochiKit?。几乎所有的重要的功能组件都源自第三方。TurboGear?自身更像一个黏合剂,把所有的功能组合在一起,并能够形成力量的倍增。

4Suite

虽然Python 标准库提供了XML处理工具,但是它只提供一些基本功能。如果你想获得更为强大的XML 处理能力,4Suite是一个更好的选择。

4Suite被称为XML工具中“内行的选择”。除了最基本的Dom-Like和SAX-Like处理库外,4Suite 还提供XInclude,XPointer,XLink,XPath,XUpdate用于XML文档的查询、更新操作等等;提供XSLT完整处理能力。

4Suite不光功能强大,性能也相当不错。这主要是得益于其核心代码部分采用C完成。这在需要处理大量XML文档的地方,4Suite实在是一个完美的选择。

Pyro

Pyro 的全称是“Python Remote Objects”。按照字面即可理解Pyro 的功能:提供远程对象。Pyro 为Python语言提供异常简洁的RPC解决方案。其实Python语言中不乏一些更加通用的远程调用方案,例如都是基于XML 的XMLRPC和SOAP。那么 Pyro这样的单纯的Python远程调用方案具有什么样的优势呢?那就是性能与易用性。

由于动态语言具有强大反射能力,因此实现对象序列化对于Python来说简直易如反掌。对象的序列化在Python中被称为pickle,这是许多Python应用的核心机制。Pyro 也正是充分利用pickle 的威力,在网络间提供远程对象的调用。它的性能要远远超过使用XML 对远程对象进行编码/解码。同时,它在接口调用设计上也非常简洁。在服务器端和客户端只需2、3 行代码就完成对象的封装与调用,远比SOAP来得简单轻松。

Twisted

上个月,Zope 3.2发布,在这个最新版中, 一个重要的变化就是:使用了近十年的处理Web请求的网络框架代码被放弃,取而代之是以Twisted 为核心实现的代码。据称这样可以改善系统性能以及可扩展性。于是Twisted库再一次成为了人们关注的焦点。 Twisted 的核心概念是非阻塞异步网络服务器(所以它也被成为Python中ACE,如果你还不知道什么是 ACE,那么看看前面关于C++库的文章),这是目前为止性能最好的网络处理模型。也许是非阻塞异步处理的天生复杂性所致,Twisted 几乎是我所见过的最复杂,最难用的Python库。Twisted 的使用者需要面对大量新的概念和新的模式,这一点上和ACE 倒颇有几分相似。陡峭的学习曲线,阻碍了很多人掌握Twisted 库。这也许是想要获得高性能所付出的必要代价。难怪 O’REYLLI在其出版的关于Twisted的书的封面引用了一只九头怪蛇,还真是贴切。

Psyco

赞美Python的好话可以说一箩筐,那么它的缺点是什么?这还用问吗,当然是性能。性能——已经成为Python根深蒂固的老毛病了。不要说和C++/Java/C/#这样的语言相比,即使是和它的同门兄弟们——Ruby、Perl、PHP 这样的脚本语言相比,Python的性能依然是最糟糕的。Python的设计者们似乎仅仅在乎语言机制的完美,几乎不考虑性能。CPythony 引擎已经发展了这么多年,查看其源代码,性能优化代码少之又少。对象引用模型至今还在使用引用计数器的方式,至于发展一个JIT 引擎,算了吧,不要指望了。还好,Psyco 的出现,带给我们了一线希望。Psyco 通过将运行中字节码编译为二进制代码从而大幅提升整个应用的性能,在某些环境中甚至能将速度提升一个数量级。虽然Psyco还不能视为一个真正意义上的JIT 的引擎,也无法像Java中的JIT 那样提供完全透明的服务。但我们仍然要为Psyco的发展感到振奋。目前,在其最新版本中,只需两行代码的添加,就能使你的程序充分使用Psyco,从而提升性能。

wxPython

在许多人眼里,动态语言/脚本语言一般仅适合完成命令行或WEB的工作,而在桌面开发方面实在是丑陋不堪。而wxPython的出现无疑是给这种偏见以有力的回击。

wxPython 实际上发展多年的C++框架wxWindow(现已更名为wxWidgets)的Python封装。而 wxWindow的目标是建立一个跨平台的GUI 框架。wxWindow 现已能在Windows/Unix/Mac 上良好运行。自然wxPython也能横跨上述几个平台。

wxPython 使用的原生窗口。这就意味着使用wxPython 开发的GUI 和操作系统本地GUI 系统在界面外观上没有任何区别。如果和Java中GUI库对比一下,就可以发现,wxPython 更加类似SWT 而不是Swing。因为SWT也是使用的原生窗口,想想Eclipse 的界面有多漂亮就知道原生窗口的优势了。

虽然不少C++爱好者对wxWindow框架的设计颇有微词,不过在经过Python的封装后,没有了指针、没有了 MFC时代的事件机制,wx框架的易用性获得了极大提升。这也是Python的另一个巨大魅力所在。以上介绍Python语言。

Python学习笔记

Posted on

Python学习笔记

(Michael) Xiaofeng Yang

M.Sc. Candidate School of Computing Queen's University

Python介绍程序设计基础语法变量运算符参数语句控制函数数据结构字符串列表字典元组面向对象基础对象属性对象方法运算符重载对象继承高级编程正则表达式文件处理XML 编程网络编程数据库常用标准库参考资料

Python介绍

  • Python 是一种解释性语言,程序是被解释器来解析执行的。
  • 版本信息:$ python -V
  • python 大小写敏感
  • python 帮助文档设置:

前提是安装python2.5-doc (名字因版本不同可不同) env PATHONDOCS=/usr/share/doc/python2.5 /# python >>> help(print) /#/# 打印print函数信息 在python中,可以定义模块或函数的帮助文档,用三引号表示 """ ....... """, 然后调用函数或模块的 doc 属性

  • 测试程序: /#! env python print "hello world"

  • 文件编码 /#! env python /#-/- coding: UTF-8 -/-

  • 一些不错的句子摘录: Program testing can be used to show the presence of bugs, but never to show their absence! ---- Edsger W. DijkstraFinding a hard bug requires reading, running, ruminating, and sometimes retreating. If you get stuck on one of these activities, try the others.

程序设计

基础语法

  • 注释语句用

/# 表示

  • 使用数学公式要先导入

math 模块

  • None 是一种特殊值,代表无效值,注意与

"None" 不同,后者表示值为

None 的字符串,前者无值。

  • 注意

== 和

=== 的区别:前者表示比较值的大小是否等同,后者用来测试是否为同一对象。

  • 读取用户输入数据:

input=raw_input("Please enter a value:")

  • 读取到的值存储在字符串中,如上所示的

input ,如果期待的是一个整型数值,则需要进行显示转换:

int(input) .

  • Python里的两个boolean值:

True 和

False

  • 判断某变量是否属于指定的数据类型:

isinstance(var, type)

  • 长整型数据表示:

2L

  • 字符串:

  • 在python里,单引号和双引号是完全相同的

  • """ : 表示中间的单引号和双引号都不会被解析,字符串可以换行
  • unicode字符串要加前缀u或U
  • 自然字符串用r前缀表示: r"Newlines are indicated by \n"
  • 转义符:

  • \' 表示单引号'

  • \出现在行末,表示字符串在下一行继续,不表示换行
  • 标识符命名:

  • 首字母为大小写字母

(a-zA-Z) 或

"_"

  • 其他字母由大小写字母

(a-zA-Z),"_" 和数字

(0-9) 组成

  • 大小写敏感
  • 语句:

  • 多条语句在同一行用";"分隔

  • 一条语句在多行用"\"来分隔
  • 缩进:

在python里,不能随便缩进。缩进一次代表进入一个block,类似于进入 "{}"语句

  • exec:

执行一段python代码

  • eval:

计算表示式

  • assert:

条件声明,当fail时,会抛出AssertionError

  • 空值:

python里的空值为None

变量

  • 变量:

不需要声明和定义数据类型,可直接使用

  • 声明全局变量: global x

运算符

特殊需要记住的:

// 表示取整除,返回商的整数部分, 其余都一样

  • and 和 or 运算符:

在python里,and 和 or 运算符并不返回布尔值,而是返回最后计算的运算子,例如: 'a' and 'b' 返回 'b' 'a' or 'b' 返回 'a'

  • python里没有

++, -- 运算符,采用

+=, -= 代替实现功能。

参数

  • 同Java语言一样,Python的参数传递是值传递,即传递的是参数值的拷贝。

参数类型

  • 函数参数:

多个参数跟在函数后面用","分隔,例如: lang='python' print 'this is a test for', lang

  • print 语句结尾加逗号

, 表示分行语句。

  • 默认参数:只有在形参表末尾的那些参数可以有默认参数值,即你不能在声明函数形参的时候,先声明有默认值的形参而后声明没有默认值的形参

参数传递

  • 对数组或字典类型的数据传递用/和//前缀来表示,例如/argv,则所有参数传递作为数组类型存储在argv变量里,如果是//argv,则作为键值对存储在argv中.
  • 每个传递给程序的命令行参数都以列表的形式存储在 sys.argv里面:

sys.argv[0] 表示文件名本身,

sys.argv[1]... 表示真正传递给脚本的参数对于更复杂的通过参数选项来传递参数值,用 gotopt 模块来实现: opts, args = getopt.getopt(argv, "hg:d", ["help", "grammar="])

GetOpt功能

  • 接收3个参数: 参数列表(argv), 短标志选项(h, g:, d),长标志选项(help, grammar=)
  • 返回1个元组 (tuple) opts 和参数列表 args: opts: (flag, argument),flag为选项名,如 -d, --help,argument存储其对应的参数值,如果没有,则为None args: 剩余的其他参数,如果没有,则为None

  • 短标志说明: g: 表示 -g 选项后必须跟一个参数

  • 长标志说明: grammar= 表示 --grammar 选项后必须跟一个参数 长标志和短标志参数的顺序要保持一致,允许缺少某个参数选项,只要顺序一致就行。

语句控制

  • for 循环: for var in array:

  • 控制语句:

  • python里没有switch ... case 语句,使用if...elif...else语句

  • True和False被称为布尔类型。你可以分别把它们等效地理解为值1和0。
  • while循环语句可以跟一个else从句
  • 异常语句:

  • try...except: 捕捉异常

  • try ... except 可以跟 else 语句

  • try...finally: 异常发生时总是要执行的语句
  • raise: 引发异常
  • 超类: Error 和 Exception

函数

  • lambda 函数:

用lambda算子创建新的函数对象,例如: def base_fun(n): return lambda s:s/*n //new_fun 定义一个函数叫

base_fun ,该函数执行的结果返回一个新的函数

new_fun ,参数是

s ,返回的结果是

s/*n 比如

new_fun = base_fun(2) ,则返回的函数

new_fun(s) 为:

s/*2 然后执行

new_fun(5) ,则返回

5/*2=10

  • glob 函数:

glob采用通配符来获取所有条件匹配的文件或文件夹,存储在返回的list中,例如: import glob glob.glob("/home/michael////.mp3") 获取"/home/michael"目录及其子目录下的所有mp3文件列表

数据结构

字符串

  • 字符串是不可改变对象 immutable object
  • 常用方法: str.upper() str.find(ch, [startindex], [endindex]) str.strip()

  • 遍历运算符

in : for letter in word: ......

  • in 还可用来判断属组中是否含有某元素: if letter in word: .... if letter not in word: ....

  • string 模块: string.lowercase: 所有的小写字母

列表

  • 列表的引用:

  • 列表的赋值语句不创建拷贝

  • 拷贝可以通过列表的slice来建立
  • 列表是可改变对象
  • range 方法产生常用连续数字列表 range(1,5) => [1,2,3,4] range(5) => [1,2,3,4] range(1,5,2) => [1,3]

  • 运算符:

  • : 连接多个list /* : 重复列表多次
  • 列表切割: t = ['a', 'b', 'c', 'd', 'e', 'f'] t[1:3] => ['b', 'c'] t[:3] => ['a', 'b', 'c'] t[3:] => ['d', 'e', 'f'] t[:] => ['a', 'b', 'c', 'd', 'e', 'f']

  • 列表方法: t1 = ['a', 'b', 'c'] t2 = ['d', 'e'] t1.append(t2): 添加列表元素,参数可以为另一个列表 ['a', 'b', 'c', ['d', 'e']] t1 = ['a', 'b', 'c'] t2 = ['d', 'e'] t1.extend(t2) => ['a', 'b', 'c', 'd', 'e']

  • 字符串转换成列表 l = list(s) l = s.split() l = s.split(delimiter) /#默认的分隔符为空格

  • 列表转换成字符串 delimiter.join(l)

  • 列表函数 li.append(), li.insert(), li.extend(), li.index() li.remove(), li.pop()

字典

  • 构造:内建函数

dict() 创建一个空词典对象

  • in 操作符用来判断是否存在某个键值

key

  • 返回所有的值:

dict.values()

  • get 方法:

dict.get('key', [default])

NOTE: 在词典对象中,只有具有

hashtable 方法的对象才能作为key值,所以必须是

immutable 的对象,比如

int, float, string, tuple 。例如

list, dictionary 就不能作为key。

  • 基于dictionary的字符串格式化:

  • %(key)s 表示在dictionary中对应key键值的value,例如params = {'pwd':'pass', 'pwd2':'pass2'} "%(pwd)s is not correct." % params 返回 "pass is not correct."

  • 字典函数 del d[index]

  • locals 和 globals:

  • locals()函数返回局部变量的dictionary的一个拷贝

  • globals()函数返回实际的全局变量的dictionary,修改其中的值会影响全局变量

元组

元组数据(Tuple)是不可更改对象(immutable),通常用于返回多个变量值,例如

return firstname, lastname .

  • 元组里可以使用字符串和列表里的操作 t = tuple('abcd') => ('a', 'b', 'c', 'd') t[1:3] => ('b', 'c')

  • 元组赋值非常灵活,比如两个变量值的交换: a, b = b, a

  • 元组在用于返回多个值时非常有用: quot, rem = divmod(7,3) quot => 2 rem => 1

  • 词典对象

items 方法的返回值就是一组元组列表 d = {'a':0, 'b':1, 'c':2} t = d.items() => [('a',0), ('b', 1), ('c', 2)]

  • 元组与词典对象的转换: d = dict(t)

  • 元组数据可以作为

dictionary 对象的键

key dic[last, first] = number for last, first in dic: print first, last, dic[last, first]

  • 元组函数 tuple只读, tuple没有函数方法

面向对象

基础

  • 包的导入:

包其实就是一个普通的目录,即文件夹,但其特征就是位于该目录下的init.py文件; 没有此文件的目录仅仅是一个普通文件夹

  • self:

类的方法比较特殊,必须加上self参数,等同于Java里的this,指代当前对象本身

  • import as :

在程序中简写模块的名称

  • 类属性和数据属性:

数据属性定义在 init

类属性定义在类的空间里,类似于Java中的static数据

对象属性

  • 浅拷贝 (shallow copy):

copy.copy(obj)

  • 深拷贝 (deep copy):

copy.deepcopy(obj)

  • 判断对象是否含有某个属性:

    hasattr(obj, 'attributename')

  • 对象的属性信息都存储在该对象的一个

dictionary 里:

print p.dict {'y':4, 'x':3}

该例子表示对象

p 中含有属性

y 和

x ,其值分别为4和3。

def printattributes(obj): for attr in obj._dict: print attr, getattr(obj, attr)

对象方法

  • 特殊方法:

  • init: 初始化类的方法,等同于Java里的constructor

  • del: 类似于Java里的desconstructor, 类不再被使用时执行,但无法确定在什么时候被运行
  • str: 类对象的表示,用于print对象时的输出,等同于Java中的toString()方法
  • lt(self, other): 用于与其他对象的比较,如果小于other对象,则返回True

  • getitem(self, key): 定义此函数后,可以对对象调用其[key]来返回对应于key的item

  • len(self): 对序列对象使用内建的len()函数,比如在对象内定义了len(self) 函数后,可以直接调用对象的len()函数
  • : python里用前缀表示私有变量, _privatevar,用前缀表示只在类或对象内使用的变量
  • repr():

返回对象的规范字符串表示,效果和反引号一样, 和str()的不同是,str()是用在print对象时的输出字符串,repr()和是直接返回表示对象的字符串,如果两个值一样的话,其关系如以下所示: print == print repr() == print <obj>

  • 私有方法:

python中私有方法是在方法名前加上前缀 "__"来表示,从外部无法直接调用方法

调用私有方法可以通过

_ 来调用,例如类Test里定义了一个私有方法叫

__method() ,从外部调用就是

_Test__method

虽然可以这么调用私有方法,但建议从不采用这种方法,否则就违背了私有方法存在的目的

  • 对象的内置函数: type(), str(), dir() dir函数返回对象的所有属性,字段,方法 三个函数都归结到了内置模块 builtin 中了,所以等同于调用 builtin.type(), builtin.str()

函数与方法的区别:

  • 函数指过程性的语句,方法指属于某个类对象的函数,定义的方式不一样
  • 函数指代的纯函数,和类没有任何关系
  • 方法定义的第一个参数必须是该方法所属的类对象,即关键字表示的

this

  • 函数定义: class Time: ...... def print_time(time): print '%.2d:%.2d:%.2d' % (time.hour, time.minute, time.second)

  • 方法定义: class Time: .... def print_time(self): print '%.2d:%.2d:%.2d' % (self.hour, self.minute, self.second)

  • 在方法调用时,参数

self 被省略掉。

  • str(self) 方法:用于打印该对象所显示的对象信息
  • repr(self) 方法:用于

eval 某个对象产生的结果

运算符重载

  • 重载

+ ,通过定义

add(self, other) 方法来实现

  • radd(self, other)__ 方法用于当对象出现于

+ 的右边。

  • 当对象实现了

add() 方法时,

sum() 方法就适用于该对象。

  • cmp 用于定义对对象的大小比较。
  • 当对象实现了

cmp 方法后,可以采用

sort() 方法来对对象进行排序。

对象继承

  • 继承定义: class Hand(Deck): ....

高级编程

正则表达式

  • re.sub import re s = 'abcdef' re.sub(,"",s): re模块用sub方法来替代符合正则表达的字符串,在指定正则表达式时,为了减小"转义字符灾难"的影响,可以加上r前缀,这样在表达式中的所有字符串不需要进一步转义,比如: re.sub(r'\bROAD$', 'RD.', s)就比re.sub('\bROAD$', 'RD.', s) 清晰多了

  • re.search(pattern, 'string')

松散正则表达: re.search(pattern, 'string', re.VERBOSE) pattern = """ ^ /# beginning of string M{0,4} /#thousands - 0 to 4 M's $ /# end of string """ re.compile(r'regpattern').search(s) re.compile(r'regpattern', re.VERBOSE).search(s)

文件处理

  • 打开文件:

fin=open('file.txt')

  • 读取: fin.readline()
  • 写入: fin.write(linetext)

  • 绝对路径:

os.path.abspath('memo.txt')

  • 判断路径是否存在:

os.path.exists('memo.txt')

  • 获取当前路径:

os.getcwd()

  • 判断文件或目录: os.path.isfile() os.path.isdir()

  • 列出所有文件:

os.listdir(cwd)

XML 编程

解析XML文件

from xml.dom import minidom >>> xmldoc = minidom.parse(filename)xmldoc 返回一个

Document 对象, 该对象是

Node 的子类。从

Node 继承下来的方法有:

childNodes, firstChild, lastChild, toxml 。

网络编程

  • HTTP 状态代码 200 - OK 404 - Not Found 301 - 永久重定向 302 - 临时重定向 304 - 从上次访问后没有修改

urllib 模块

urllib 模块依赖于 httplib 模块,可以通过设置 httplib 模块属性打开调试选项: httplib.HTTPConnection.debuglevel = 1

使用方法:

urllib.open()

用minidom.parse函数处理各种类型文件:

web页面: urlopen() 本地文件: open() 字符串: StringIO()

stdout, stderr 都是文件类型对象,但是只能

写入 操作,不能读出。

stdin 是只读的文件类型对象。

urllib2 模块

urllib2 模块来获取HTTP资源分为三个步骤完成:

  • 构建

Request 对象:

request = urllib2.Request(res)

  • 构建

opener 处理器:

opener = urllib2.build_opener()

  • 用构建的处理器去获取

Request 对象:

feeddata = opener.open(request)

Request 对象通过

add_header 方法来更改HTTP头数据的属性值。

feeddata.headers 是一个

dictionary 对象。

检查Web服务有没有更新所使用的不同头数据:

Last-Modified :

If-Modified-Since

Etag :

If-None-Match

数据库

anydbm模块

anydbm 模块是以键值对

key:value 来存储数据的,可以如同对

dictionary 数据类型一样进行操作:

import anydbm >>> db = anydbm.open('dbname.db', 'c') >>> db['keyname'] = 'value of the key' >>> print db['keyname'] anydbm 的局限性是键值都必须为字符串类型。

Pickling模块

Pickling 可以存储对象数据

import pickle >>> t = [1, 2, 3] >>> pickle.dumps(t) '(lp0\nI1\naI2\naI3\na.' >>> t2 = pickle.loads(t) >>> print t2 [1, 2, 3]

常用标准库

sys

sys.argv[0] 指向程序名 sys.version sys.stdout/sys.stdin/sys.stderr

os

os.name: 平台名字, windows下返回"NT", linux下返回"posix" os.getcwd(): 返回当前的工作目录 os.getenv(), os.putenv(): 读取和设置当前环境变量 os.listdir(): 返回指定目录下的所有文件和目录 os.remove(): 删除一个文件 os.system(): 执行一个shell命令 os.linesep: 当前平台上的行终止符, linux下返回'\n', windows下返回'\r\n' os.path.split(): 返回一个路径的目录名和文件名 (

,) os.path.isfile(), os.path.isdir(): 检验给出的路径是文件夹还是文件 os.path.exists(): 检验给出的路径是否存在

参考资料

  • Byte of Python
  • Dive into Python
  • Think like a Python Programmer
  • Core Python Programming Last Updated: 2010-02-23 Michael Yang

Success is a Science CopyRight© 2008, 2009, 2010 Michael Yang gmail