Python知识之什么是*args和**kwargs?

先来看个例子:

def foo(*args, **kwargs):
    print 'args = ', args
    print 'kwargs = ', kwargs
    print '---------------------------------------'

if __name__ == '__main__':
    foo(1,2,3,4)
    foo(a=1,b=2,c=3)
    foo(1,2,3,4, a=1,b=2,c=3)
    foo('a', 1, None, a=1, b='2', c=3)

输出结果如下:

args =  (1, 2, 3, 4) 
kwargs =  {} 
--------------------------------------- 
args =  () 
kwargs =  {'a': 1, 'c': 3, 'b': 2} 
--------------------------------------- 
args =  (1, 2, 3, 4) 
kwargs =  {'a': 1, 'c': 3, 'b': 2} 
--------------------------------------- 
args =  ('a', 1, None) 
kwargs =  {'a': 1, 'c': 3, 'b': '2'} 
---------------------------------------

 

可以看到,这两个是python中的可变参数。*args表示任何多个无名参数,它是一个tuple;**kwargs表示关键字参数,它是一个dict。并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b=’2′, c=3, a’, 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。

呵呵,知道*args和**kwargs是什么了吧。还有一个很漂亮的用法,就是创建字典:

def kw_dict(**kwargs):
        return kwargs
print kw_dict(a=1,b=2,c=3) == {'a':1, 'b':2, 'c':3}

 

其实python中就带有dict类,使用dict(a=1,b=2,c=3)即可创建一个字典了。

Python中的操作符重载

关于Python中的操作符重载,可以查看2.7.3文档地址:

http://docs.python.org/reference/datamodel.html#special-method-names

或者一篇详细的中文教程:

Python 魔术方法指南

类可以重载python的操作符,操作符重载使我们的对象与内置的一样。__X__的名字的方法是特殊的挂钩(hook),python通过这种特殊的命名来拦截操作符,以实现重载。 python在计算操作符时会自动调用这样的方法,例如:如果对象继承了__add__方法,当它出现在+表达式中时会调用这个方法。通过重载,用户定义的对象就像内置的一样。

在类中重载操作符

  1. 操作符重载使得类能拦截标准的python操作。
  2. 类可以重载所有的python的表达式操作符。
  3. 类可以重载对象操作:print,函数调用,限定等。
  4. 重载使得类的实例看起来更像内置的。
  5. 重载是通过特殊命名的类方法来实现的。 继续阅读Python中的操作符重载

数据采集技术之在Python中Libxml模块安装与使用XPath

为了使用XPath技术,对爬虫抓取的网页数据进行抽取(如标题、正文等等),之后在Windows下安装libxml2模块(安装后使用的是Libxml模块),该模块含有xpath。

准备

需要的软件包:

安装

Python2.7的安装这里不再赘述

lxml的安装,直接运行exe,会自动找到py27的目录进行安装

使用XPath抽取

下面用一个实例来验证,程序来自redice’s Blog的文章:

libxml2库的安装,xpath的使用

#coding:utf-8

import codecs
import sys
#不加如下行,无法打印Unicode字符,产生UnicodeEncodeError错误。?
sys.stdout = codecs.lookup('iso8859-1')[-1](sys.stdout)

from lxml import etree

html = r'''<div>
    <div>redice</div>
    <div id="email">redice@163.com</div>
    <div name="address">中国</div>
    <div>http://www.redicecn.com</div>
</div>'''

tree = etree.HTML(html)

#获取email。email所在的div的id为email
nodes = tree.xpath("//div[@id='email']")
print nodes[0].text

#获取地址。地址所在的div的name为address
nodes = tree.xpath("//div[@name='address']")
print nodes[0].text

#获取博客地址。博客地址位于email之后兄弟节点的第二个
nodes = tree.xpath("//div[@id='email']/following-sibling::div[2]")
print nodes[0].text

 

运行结果:

redice@163.com
中国
http://www.redicecn.com

Python操作Mysql实例代码教程(查询手册)

本文介绍了Python操作MYSQL、执行SQL语句、获取结果集、遍历结果集、取得某个字段、获取表字段名、将图片插入数据库、执行事务等各种代码实例和详细介绍,代码居多,是一桌丰盛唯美的代码大餐。

实例1、取得MYSQL的版本

在windows环境下安装mysql模块用于python开发,请见我的另一篇文章:

MySQL-python Windows下EXE安装文件下载

# -*- coding: UTF-8 -*-

# 安装MYSQL DB for python
import MySQLdb as mdb

con = None

try:
    # 连接mysql的方法:connect('ip','user','password','dbname')
    con = mdb.connect('localhost', 'root',
        'root', 'test');

    # 所有的查询,都在连接con的一个模块cursor上面运行的
    cur = con.cursor()

    # 执行一个查询
    cur.execute("SELECT VERSION()")

    # 取得上个查询的结果,是单个结果
    data = cur.fetchone()
    print "Database version : %s " % data
finally:
    if con:
        # 无论如何,连接记得关闭
        con.close()

执行结果:

Database version : 5.5.25

继续阅读Python操作Mysql实例代码教程(查询手册)

MySQL-python Windows下EXE安装文件下载

最近学python,学到用python连接mysql的时候,我首先去python-mysql官网上下载了一个源码包,然后放到了python的Lib\site-packages目录下,结果运行测试的时候,一直说没有模块__mysql

网上找解答方法,大部分人的方法都不可以,有人提议用exe自动安装会很有效,于是在谷歌直接搜”python mysql exe”,找到了最终的exe安装文件:

MySQL-python-1.2.3.win32-py2.7.exe

安装之后,重新运行程序,完美无误

该MySQL-python-1.2.3.win32-py2.7.exe的下载地址:

http://www.codegood.com/archives/129