给Python初学者的技巧

原文地址:http://maxburstein.com/blog/python-shortcuts-for-the-python-beginner/ 下面这些内容是我多年使用python总结出来一些有用的提示和工具,希望对读者们有些帮助。 变量交换 x = 6 y = 5 x, y = y, x print x >>> 5 print y >>> 6 单行的if声明 print "Hello" if True else "World" >>> Hello 字符串连接 最后一个是一个很酷的连接了两种不同类型的对象的方式。 nfc = ["Packers", "49ers"] afc = ["Ravens", "Patriots"] print nfc + afc >>> ['Packers', '49ers', 'Ravens', 'Patriots'] print str(1) + " world" >>> 1 world print `1` + " world" >>> 1 world print 1, "world" >>> 1 world print nfc, 1 >>> ['Packers', '49ers'] 1 数字诀窍 #Floor Division (rounds down) print 5.0//2 >>> 2 #2 raised to the 5th power print 2**5 >> 32 小心除法和浮点数! print .3/.1 >>> 2.9999999999999996 print .3//.1 >>> 2.0 数值比较 x = 2 if 3 > x > 1: print x >>> 2 if 1 < x > 0: print x >>> 2 同时遍历两个列表 nfc = ["Packers", "49ers"] afc = ["Ravens", "Patriots"] for teama, teamb in zip(nfc, afc): print teama + " vs. " + teamb >>> Packers vs. Ravens >>> 49ers vs. Patriots 遍历列表同时得出序号和内容 teams = ["Packers", "49ers", "Ravens", "Patriots"] for index, team in enumerate(teams): print index, team >>> 0 Packers >>> 1 49ers >>> 2 Ravens >>> 3 Patriots 列表解析 numbers = [1,2,3,4,5,6] even = [number for number in numbers if number%2 == 0] 字典解析 teams = ["Packers", "49ers", "Ravens", "Patriots"] print {key: value for value, key in enumerate(teams)} >>> {'49ers': 1, 'Ravens': 2, 'Patriots': 3, 'Packers': 0} 初始列表值 items = [0]*3 print items >>> [0,0,0] 列表转换成字符串 teams = ["Packers", "49ers", "Ravens", "Patriots"] print ", ".join(teams) >>> 'Packers, 49ers, Ravens, Patriots' 从字典中获得值(key) data = {'user': 1, 'name': 'Max', 'three': 4} is_admin = data.get('admin', False) 列表的子集 x = [1,2,3,4,5,6] #First 3 print x[:3] >>> [1,2,3] #Middle 4 print x[1:5] >>> [2,3,4,5] #Last 3 print x[-3:] >>> [4,5,6] #Odd numbers print x[::2] >>> [1,3,5] #Even numbers print x[1::2] >>> [2,4,6] Collections模块 除了Python的内置数据类型,在collections模块中提供了一些额外的特殊用途。我发现计数器有时是非常有用的。你甚至可以找到一些有用的,如果你参与了今年Facebook的HackerCup。 from collections import Counter print Counter("hello") >>> Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1}) Itertools模块 from itertools import combinations teams = ["Packers", "49ers", "Ravens", "Patriots"] for game in combinations(teams, 2): print game >>> ('Packers', '49ers') >>> ('Packers', 'Ravens') >>> ('Packers', 'Patriots') >>> ('49ers', 'Ravens') >>> ('49ers', 'Patriots') >>> ('Ravens', 'Patriots') False == True 这是一个有趣的一个比一个有用的技术。在Python中True和False是基本上是全局变量。因此: False = True if False: print "Hello" else: print "World" >>> Hello 如果你有任何其他很酷的提示/技巧,让他们在下面的意见。感谢您的阅读! ...

阅读全文 »

python challenge 介绍




Python Challenge是一个过关式的解谜站点,使用的是经典在线解谜站点Not Pr0n的模式:根据提示找出下一关的网页地址。和Not Pr0n不同的是,在每一关里你都需要编写程序来寻找答案。虽然这个解谜站点的名字叫做Python Challenge,但事实上你可以使用任意一种程序语言(除了少数一两关可能会用到点Python的知识),Python Challenge的创始人是Nadav Samet。

阅读全文 »

FLASK开源项目--派生吧博客推介之五

数据库的部分已经介绍完成,现在介绍了最后一部分:视图函数。 对于博客而言,视图函数需要完成的是:首页,文章页,分类页,标签页,搜索页,错误页面,关于页面。 错误页面 这个部分代码十分简单,直接返回404的模板。 @app.errorhandler(404) def page_not_found(e): return render_template('404.html'), 404 @app.route('/error/404') def error_404(): return render_template('404.html'), 404 关于页面 直接返回about页面的模板,直接需要额外处理页面的侧边栏,这个时候需要传一些参数:所有的分类,热门文章,最新文章,随机便签,最新评论。 @app.route('/about') def about(): categorys = Category.query.getall() #所有的分类 hot = Post.query.hottest()[:20] #热门文章,20个 new = Post.query.newpost()[:20] #最新文章,20个 tag = Tag.query.getall() shuffle(tag) tag = tag[:20] #标签云,20个 comments = Comment.query.newcomment()[:20] #最新评论,20个 return render_template('/about.html', categorys=categorys, hotarticles=hot, newpost=new, tags=tag, comments=comments) 首页 对于首页需要关注的是分页的情况,幸好, flask-sqlalchemy 提供了相应的处理函数,这里需要处理的提供当前页面,最后页数的参数到模板中。 @app.route('/') @app.route('/page/') def index(pageid=1): categorys = Category.query.getall() p = Post.query.getpost_perpage(pageid, per_page) hot = Post.query.hottest()[:20] new = Post.query.newpost()[:20] tag = Tag.query.getall() shuffle(tag) tag = tag[:20] comments = Comment.query.newcomment()[:20] articles = p.items if not p.total: pagination = [0] elif p.total % per_page: pagination = range(1, p.total / per_page + 2) else: pagination = range(1, p.total / per_page + 1) return render_template('/index.html', categorys=categorys, articles=articles, hotarticles=hot, newpost=new, tags=tag, comments=comments, pageid=pageid, pagination=pagination[pageid - 1:pageid + 10], last_page=pagination[-1], nav_current="index" ) 标签,分类页面 这个其实跟首页雷同,只是需要提供的文章内容不同。代码就略了。 搜索页面 对于搜索页面,我们需要获取请求的搜索关键词,然后调用数据库的查询函数,传入关键字就行。 @app.route('/search') @app.route('/search/page/') def search(pageid=1): categorys = Category.query.getall() hot = Post.query.hottest()[:20] new = Post.query.newpost()[:20] tag = Tag.query.getall() shuffle(tag) tag = tag[:20] comments = Comment.query.newcomment()[:20] searchword = request.args.get('s', '') if not searchword: return redirect(url_for('error_404')) searchresult = Post.query.search(searchword) p = pageby(searchresult, pageid, per_page, Post.post_create_time.desc()) articles = p.items if not p.total: pagination = [0] elif p.total % per_page: pagination = range(1, p.total / per_page + 2) else: pagination = range(1, p.total / per_page + 1) return render_template('/search.html', key=searchword, categorys=categorys, articles=articles, hotarticles=hot, newpost=new, tags=tag, comments=comments, pageid=pageid, pagination=pagination[pageid - 1:pageid + 10], last_page=pagination[-1] ) 文章页 对于文章页面,只需要传入指定的文章内容就行了,侧边栏跟首页的处理方式一样。 @app.route('/article/') def article(postid=5): categorys = Category.query.getall() hot = Post.query.hottest()[:20] new = Post.query.newpost()[:20] tag = Tag.query.getall() shuffle(tag) tag = tag[:20] comments = Comment.query.newcomment()[:20] articles = Post.query.getall() shuffle(articles) articles = articles[:5] post = Post.query.getpost_id(postid) if not post: return redirect(url_for('error_40 ...

阅读全文 »

FLASK开源项目--派生吧博客推介之四

这一部分主要介绍博客的数据库以及定义的常用的查询函数,这一部分代码主要在model.py里面。博客的数据库主要包含category,tag,tags,post,comment五张表。现在分别对这五张表以及相关的查询函数进行解析: category category(分类表),主要储存了博客的分类,表项只有id(自增)以及name(唯一). class Category(db.Model): __tablename__ = 'category' #表名 query_class = CategoryQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id category_name = db.Column(db.String(200), unique=True) #name #下面的内容可以自由选择 def __init__(self, category_name): self.category_name = category_name def __repr__(self): return ' ' % self.category_name 查询只要定义了两个函数getall以及getcategory_id:getall()获取所有的分类,getcategory_id(id)获取指定id 的分类。 class CategoryQuery(BaseQuery): def getall(self): return self.all() def getcategory_id(self, id): return self.get(id) tags tags(文章标签映射表),主要存储了文章id与标签的id的对应关系,存储文章的时候,该表会自动进行更新。 article_tags = db.Table('tags', db.Column( 'tag_id', db.Integer, db.ForeignKey('tag.id')), db.Column( 'post_id', db.Integer, db.ForeignKey('post.id')), ) tag tag(标签表),主要存储了文章的标签,表只有id(自增)以及name。 class Tag(db.Model): __tablename__ = 'tag' #表名 query_class = TagQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id name = db.Column(db.String(50)) #name def __init__(self, name): self.name = name def __repr__(self): return ' ' % self.name 查询只要定义了两个函数getall以及gettag_id:getall()获取所有的标签,gettag_id(id)获取指定id 的标签。 class TagQuery(BaseQuery): def getall(self): return self.all() def gettag_id(self, id): return self.get(id) post post(文章表),主要存储了博客的文章内容以及相关的分类以及标签信息,表只有id(自增)、post_content、post_title、post_create_time、view_num、comment_count、status、author_id、post_modified_time、category_id、post_name、tags_name(id,文章内容,文章标题,文章创建时间,阅读次数,评论数量,文章状态,作者id,文章修改时间,分类id,网址的缩写名称,标签名称)。 class Post(db.Model): __tablename__ = 'post' #表名 query_class = PostQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id post_content = db.Column(db.Text) #文章内容 post_title = db.Column(db.String(100)) #文章标题 post_name = db.Column(db.String(200), unique=True) #文章的网址的缩写,主要用于文章的网址以便于SEO优化 post_create_time = db.Column(db.DateTime, default=datetime.utcnow) #文章创建时间 view_num = db.Column(db.Integer, default=0) #阅读次数 comment_count = db.Column(db.Integer, default=0) #评论次数 status = db.Column(db.Integer, default=1) #文章状态 author_id = db.Column(db.Integer, default=1) #作者id,默认是1 post_modified_time = db.Column(db.DateTime, default=datetime.utcnow) #文章的修改时间 category_id = db.Column(db.Integer, db.ForeignKey('category.id')) #类型id categorys = db.relationship('Category', backref=db.backref( 'posts', lazy='dynamic'), lazy='select') #定义与category表之间的关系 tags = db.relationship('Tag', secondary=article_tags, backref=db.backref('posts', lazy='dynamic')) #定义域tag表之间的关系 def __init__(self, tags, post_content, post_title, category_id, post_name, post_create_time=None, view_num=0, comment_count=0, status=1, author_id=1, post_modified_time=None): self.post_content = post_content self.post_title = post_title self.category_id = category_id self.post_name = post_name ...

阅读全文 »

FLASK开源项目--派生吧博客推介之三

这一部分主要对博客的源代码进行就解析,会分三次完成。首先看看代码主要有config.py,model.py,views.py,myapp.py这四个文件。


  • config.py


# -*- coding: utf-8 -*-

# configuration page num  每页的文章数

PER_PAGE = 10        

# configuration mysql

SQLALCHEMY_DATABASE_URI = "mysql://%s:%s@%s/%s"%('root','root','127.0.0.1','test')
# 密钥
SECRET_KEY = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
# 管理界面的用户名和密码
USERNAME = 'admin'
PASSWORD = 'admin'
# 图片上传路径
UPLOAD_FOLDER = '/static/upload/'
#允许的图片类型

ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])

配置文件里面主要设置了每页的文章数,数据库的相关信息:用户名、密码、地址、数据库名称,密钥,管理页面的用户名和密码,图片上传路径,允许的图片类型。

  • myapp.py

这里面的代码比较简单,主要是导入相应的模块,app运行的端口以及debug模式:


from flask import Flask
app = Flask(__name__)
app.config.from_object('config')
from views import *

if __name__ == '__main__':
 app.run(host='0.0.0.0', debug=True)


阅读全文 »

flask开源项目--派生吧博客推介之二

上一部分介绍了博客整个结构,这一部分主要介绍templates与static两大文件夹里面的内容。

首先来看下templates 的内容:

这是整个博客的所有的页面:

  • 404.html:错误页面,里面嵌入了公益寻人的js代码;
  • about.html:个人说明页面
  • category.html:分类目录的页面
  • editpost.html:文章编辑的页面
  • error.html:错误页面,里面会显示具体的错误信息,用于给调试使用;
  • foot.html:所有页面的页脚部分
  • head.html:所有页面的头的部分
  • index.html:博客的首页
  • layout.hml:页面的通用结构
  • login.html:登录页面
  • newpost.html:编写新文章的页面
  • post.html:单页文章的页面
  • search.html:搜索结果的页面
  • sider.html:所有页面的侧边栏
  • tag.html:标签页面

static文件夹内容:

css:包含页面所有的css

images:页面的所有使用的图片

js:页面所使用的js

kindeditor:富媒体文本编辑器的代码地址

upload:博客上传的图片的文件夹

这是这两大文件夹里面的内容,下一部分针对所有源码就行解析!

阅读全文 »

flask开源项目--派生吧博客推介之一

项目简介:

网址:www.pythonpub.com

代码地址:https://github.com/sixu05202004/flaskblog

项目是用于简单的个人博客,前端界面主要是拷贝了wordpress的主题:NeoEase

项目使用的技术与插件:


  • flask_sqlalchemy:是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展。 它致力于简化在 Flask 中 SQLAlchemy 的 使用,提供了有用的默认值和额外的助手来更简单地完成日常任务。
  • flask_cache:缓存插件,可以用于提高网页的访问速度
  • Bootstrap:Twitter的著名的CSS/HTML框架
  • kindeditor:富文本编辑器


代码结构:

templates里面包含了很多网页模板:首页,文章页,标签页,分类页,搜索页等等,views.py包含很多的试图函数,config.py里面提供了一些基本的配置,model.py提供了基本的数据模型以及一些数据查询和处理的函数。

下一部分将会对源代码进行解析。


阅读全文 »

使用 gdb 调试 Python 进程

有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump。例如现在遇到一个mod_wsgi的进程僵死了,不接受 请求,想看看究竟是运行到哪行Python代码呢?这时就需要祭出gdb这个神器了。 准备 1. 确认你的gdb版本是>=7,gdb从版本7开始支持对Python的debug。 (ref)

2.确认gdb连接的Python是所要debug的Python,否则请重新编译gdb。

方法: $ gdb (gdb) python >import sys >print sys.version >end 2.4.3 (#1, Sep 21 2011, 19:55:41)

[GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] 在一些追求稳定的发行版(例如CentOS),Python的版本会较低,这时都会自己编译一个Python使用。而从源里安装的gdb会连接源里 Python的版本。例如在CentOS 5.4,源里的Python是2.4.3,从源安装的gdb也会连接到Python 2.4.3。 编译时注意,要把自己编译的Python路径加到PATH环境变量里,这样gdb configure的时候才会找到新版Python并连接。

3.下载libpython.py

如何Debug 假设要debug的进程号为1000 $ gdb -p 1000 使用此命令即可使gdb附加到进程。

载入libpython脚本 如果你的gdb是redhat或fedora等厂商修改过的,会有--python选项,使用此选项即可指定gdb启动时载入的Python扩展脚本(此 脚本是扩展gdb的,不是我们需要debug的脚本)。

$ gdb --python /path/to/libpython.py -p 1000 如果安装的是GNU的gdb,就需要打开gdb后手动载入libpython.py脚本 (gdb) python >import sys >sys.path.insert(0, '/path/to/libpython.py') >import libpython >end (gdb) 这时就可以使用py-bt命令打印当前线程的Python traceback了

libpython还提供很多命令,例如py-print打印变量,py-locals打印所有本地变量等等,详细可打开libpython.py查看。 一点经验 在gdb可以使用generate-core-file命令生成一个coredump文件。之后可以用gdb –core来打开coredump文件进行debug。避免一直attach住进程,可以快速重启恢复服务 gdb-heap是gdb的一个扩展。可以打印Python的内存使用情况

参考资料 DebuggingWithGdb EasierPythonDebugging Debugging with gdb (gdb documentation)

阅读全文 »

mysql命令集锦

一、连接MYSQL。 格式: mysql -h主机地址 -u用户名 -p用户密码 1、连接到本机上的MYSQL。 首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密码前必须没有空格,否则让你重新输入密码. 如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是: mysql 2、连接到远程主机上的MYSQL。假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123。则键入以下命令: mysql -h110.110.110.110 -u root -p 123;(注:u与root之间可以不用加空格,其它也一样) 3、退出MYSQL命令: exit (回车) 二、修改密码。 格式:mysqladmin -u用户名 -p旧密码 password 新密码 1、给root加个密码ab12。首先在DOS下进入目录mysql\bin,然后键入以下命令 mysqladmin -u root -password ab12 注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。 2、再将root的密码改为djg345。 mysqladmin -u root -p ab12 password djg345 三、增加新用户。 (注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符) 格式: grant select on 数据库.* to 用户名@登录主机 identified by “密码” 1、增加一个用户test1密码为abc,让他可以在任何主机上登录,并对所有数据库有查询、插入、修改、删除的权限。 首先用root用户连入MYSQL,然后键入以下命令: grant select,insert,update,delete on *.* to [email=test1@”%]test1@”%[/email]” Identified by “abc”; 但增加的用户是十分危险的,你想如某个人知道test1的密码,那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了,解决办法见2。 2、增加一个用户test2密码为abc,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作(localhost指本地主机,即MYSQL数据库所在的那台主机), 这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。 grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “abc”; 如果你不想test2有密码,可以再打一个命令将密码消掉。 grant select,insert,update,delete on mydb.* to [email=test2@localhost]test2@localhost[/email] identified by “”; 下篇我是MYSQL中有关数据库方面的操作。注意:你必须首先登录到MYSQL中,以下操作都是在MYSQL的提示符下进行的,而且每个命令以分号结束。 一、操作技巧 1、如果你打命令时,回车后发现忘记加分号,你无须重打一遍命令,只要打个分号回车就可以了。 也就是说你可以把一个完整的命令分成几行来打,完后用分号作结束标志就OK。 2、你可以使用光标上下键调出以前的命令。 二、显示命令 1、显示当前数据库服务器中的数据库列表: mysql SHOW DATABASES; 注意:mysql库里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。 2、显示数据库中的数据表: mysql USE 库名; mysql SHOW TABLES; 3、显示数据表的结构: mysql DESCRIBE 表名; 4、建立数据库: mysql CREATE DATABASE 库名; 5、建立数据表: mysql USE 库名; mysql CREATE TABLE 表名 (字段名 VARCHAR(20), 字段名 CHAR(1)); 6、删除数据库: mysql DROP DATABASE 库名; 7、删除数据表: mysql DROP TABLE 表名; 8、将表中记录清空: mysql DELETE FROM 表名; 9、显示表中的记录: mysql SELECT * FROM 表名; 10、往表中插入记录: mysql INSERT INTO 表名 VALUES (”hyq”,”M”); 11、更新表中数据: mysql- UPDATE 表名 SET 字段名1=’a',字段名2=’b’ WHERE 字段名3=’c'; 12、用文本方式将数据装入数据表中: mysql LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE 表名; 13、导入.sql文件命令: mysql USE 数据库名; mysql SOURCE d:/mysql.sql; 14、命令行修改root密码: mysql UPDATE mysql.user SET password=PASSWORD(’新密码’) WHERE User=’root’; mysql FLUSH PRIVILEGES; 15、显示use的数据库名: mysql SELECT DATABASE(); 16、显示当前的user: mysql SELECT USER(); 三、一个建库和建表以及插入数据的实例 drop database if exists school; //如果存在SCHOOL则删除 create database school; //建立库SCHOOL use school; //打开库SCHOOL create table teacher //建立表TEACHER ( id int(3) auto_increment not null primary key, name char(10) not null, address varchar(50) default ‘深圳’, year date ); //建表结束 //以下为插入字段 insert into teacher values(”,’allen’,'大连一中’,'1976-10-10′); insert into teacher values(”,’jack’,'大连二中’,'1975-12-23′); 如果你在mysql提示符键入上面的命令也可以,但不方便调试。 ...

阅读全文 »