Python常用内置函数典型用法

Python中有许多功能丰富的内置函数,本文基于Python 2.7,就常用的一些函数的典型用法做一些积累,不断更新中。

用traceback模块跟踪异常

In [2]: import traceback

In [3]: try:
   ...:     a = 1/0
   ...: except Exception as e:
   ...:     print 'error! e = {0}'.format(traceback.format_exc())
   ...:
error! e = Traceback (most recent call last):
  File "<ipython-input-3-2170d75817d3>", line 2, in <module>
    a = 1/0
ZeroDivisionError: integer division or modulo by zero

itemgetter的用法

  • 导入方法:from operator import itemgeter
  • 文档:
class itemgetter(__builtin__.object)
 |  itemgetter(item, ...) --> itemgetter object
 |
 |  Return a callable object that fetches the given item(s) from its operand.
 |  After f = itemgetter(2), the call f(r) returns r[2].
 |  After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])
 |
 |  Methods defined here:
 |
 |  __call__(...)
 |      x.__call__(...) <==> x(...)
 |
 |  __getattribute__(...)
 |      x.__getattribute__('name') <==> x.name
 |
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |
 |  __new__ = <built-in method __new__ of type object>
 |      T.__new__(S, ...) -> a new object with type S, a subtype of T
  • 用法demo示例

sorted函数的三种用法

# coding:utf-8
# sorted函数的三种用法
from operator import itemgetter

data1 = [{'aa':22,'bb':11},{'aa':12,'cc':23},{'aa':67,'dd':103}]
data2 = [{'age':18,'name':'Tom'},{'age':10,'name':'Tim'},{'age':30,'name':'John'},{'age':18,'name':'Amy'}]

def sort1():
    # 对data1依据'aa'字段值的大小从小打到排序
    ret = sorted(data1,key = lambda item:item['aa'])  # 注:如果这里的key写'bb'或'cc',会报KeyError,因为这两个属性并不是每个元素都有的
    print ret
    # 输出:
    '''
    [{'aa': 12, 'cc': 23}, {'aa': 22, 'bb': 11}, {'aa': 67, 'dd': 103}]
    '''

def sort2():
    # 对data1依据'aa'字段值的大小从小打到排序
    ret = sorted(data1,cmp = lambda x,y:cmp(x['aa'],y['aa']))
    print ret
    # 输出:
    '''
    [{'aa': 12, 'cc': 23}, {'aa': 22, 'bb': 11}, {'aa': 67, 'dd': 103}]
    '''

def sort3():
    # 使用itemgetter对data1依据'aa'字段值的大小从小打到排序
    ret = sorted(data1,key = itemgetter('aa'))
    print ret
    # 输出:
    '''
    [{'aa': 12, 'cc': 23}, {'aa': 22, 'bb': 11}, {'aa': 67, 'dd': 103}]
    '''

def sort4():
    # 对data2进行排序,先按照'age'从小到大排序,'age'相同的情况下,再按照'name'排序
    ret = sorted(data2,key = itemgetter('age','name'))
    print ret
    # 输出:
    '''
    [{'age': 10, 'name': 'Tim'}, {'age': 18, 'name': 'Amy'}, {'age': 18, 'name': 'Tom'}, {'age': 30, 'name': 'John'}]
    '''

补充:对OrderedDict对象按照value大小进行排序:

In [1]: from collections import OrderedDict

In [3]: from operator import itemgetter

# 姓名:年龄 字典
In [6]: data = {'Tom':14,'Amy':25,'Bob':18}

# 转为有序字典
In [7]: ordered_data = OrderedDict(data)

In [8]: print ordered_data
OrderedDict([('Amy', 25), ('Bob', 18), ('Tom', 14)])

# 按照年龄进行排序
In [9]: sorted_data = OrderedDict(sorted(ordered_data.items(),key = itemgetter(1)))

In [10]: sorted_data
Out[10]: OrderedDict([('Tom', 14), ('Bob', 18), ('Amy', 25)])

执行命令行命令的三种方式

# coding:utf-8
# 执行命令行命令的三种方式
import os
import commands

command = 'ls -al /root'

def method1():
    '''
    方式1
    '''
    os.system(command)
    # 执行结果:返回执行状态码

def method2():
    '''
    方式2
    '''
    out1 = os.popen(command)
    print out1.read()
    # 输出:执行结果字符串

def method3():
    '''
    方式3
    '''
    (status,out) = commands.getstatusoutput(command)
    # 输出:status是执行状态码,out是执行结果字符串

zip函数的用法

Docstring:
zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
Return a list of tuples, where each tuple contains the i-th element
from each of the argument sequences.  The returned list is truncated
in length to the length of the shortest argument sequence.

先来看看zip函数的文档,从文档中可以看出,zip函数接收1个或多个序列作为参数,返回一个由元组组成的列表。

结果列表的第i个元素是seq1~seqn的第i个元素组成的元组。

结果列表的长度等于seq1~seqn中最短的序列的长度。

一段测试代码如下:

# coding:utf-8

def main():
    a = '1234'
    b = [4,6,7]

    print zip()
    # 输出:[]

    print zip(a)
    # 输出:[('1',), ('2',), ('3',), ('4',)]

    print zip(a,a)
    # 输出:[('1', '1'), ('2', '2'), ('3', '3'), ('4', '4')]

    print zip(a,[])
    # 输出:[]

    print zip(a,b)
    # 输出:[('1', 4), ('2', 6), ('3', 7)]

if __name__ == '__main__':
    main()

map函数的用法

map函数是一个高阶函数,支持传入一个函数作为参数。先来看它的文档是怎么说的:

Docstring:
map(function, sequence[, sequence, ...]) -> list
Return a list of the results of applying the function to the items of
the argument sequence(s).  If more than one sequence is given, the
function is called with an argument list consisting of the corresponding
item of each sequence, substituting None for missing values when not all
sequences have the same length.  If the function is None, return a list of
the items of the sequence (or a list of tuples if more than one sequence).

从map函数的文档中可以看出,该函数的第一个参数为一个函数对象,后面可以跟一个或多个序列,函数的返回值是一个list.

对比zip函数的用法,可以发现其实map函数就是一个增强版的zip函数,与zip函数不同的是,map函数支持传入一个函数参数来处理序列。

如果第一个函数参数不为None,那么返回的结果list的第i个元素,是将该函数作用于每个序列的第i个元素的结果。如果传入的序列的长度不都是相同的,那么结果list的某些元素将会是None.

如果第一个函数参数为None,那么返回的的结果list的第i个元素,是每个序列第i个元素组成的n元组(n为序列的个数),如果每个序列的长度不都是相同的,那么结果list的某些元素将是None.

下面通过一段程序来看map函数的实际用法:

# coding:utf-8

def main():
    a = [1,2,3,4]
    b = [3,5,9]
    c = [8,2,3]
    print map(None,a,b,c)
    # 输出:[(1, 3, 8), (2, 5, 2), (3, 9, 3), (4, None, None)]

    print map(lambda x : x ** 2,a)
    # 输出:[1, 4, 9, 16]

    # print map(lambda x,y : x + y,a)
    # 输出:TypeError <lambda>() takes exactly 2 arguments (1 given)

    print map(lambda x,y : x + y,b,c)
    # 输出:[11, 7, 12]

    # print map(lambda x,y,z : x + y + z,a,b,c)
    # 输出:TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

    print map(lambda x,y : x + y if x is not None and y is not None else None,a,b)
    # 输出:[4, 7, 12, None]

if __name__ == '__main__':
    main()

reduce函数的用法

先看函数文档:

Docstring:
reduce(function, sequence[, initial]) -> value
Apply a function of two arguments cumulatively to the items of a sequence,
from left to right, so as to reduce the sequence to a single value.
For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
((((1+2)+3)+4)+5).  If initial is present, it is placed before the items
of the sequence in the calculation, and serves as a default when the
sequence is empty.

reduce函数接收三个参数:function,seq,init,其中前两个是必选参数,最后一个为可选参数。

reduce函数做了这样一件事情:从左到右遍历seq,将seq[0]和seq[1]传入函数function进行运算(function为一个接收两个参数的函数),得到一个结果值,然后将这个结果值再和seq[2]传入fucntion进行运算再得到一个新的结果值...以此类推。最终得到一个值,就是该函数的返回值。

如果传入了init,那么init和seq[0]会作为第一次传入funciton的参数,如果seq为空,init也会作为reduce的返回值返回。

用法示例如下:

# coding:utf-8

def main():
    lst = [1,2,3]
    f = lambda x,y:x*y
    print reduce(f,lst)
    # 输出:6

    print reduce(f,lst,-1)
    # 输出:-6

    print reduce(f,[],-2)
    # 输出:-2

if __name__ == '__main__':
    main()

base64编解码

# coding:utf-8
# 测试base64编解码
import base64

def main():
    s = '123abc'

    # 编码
    print base64.b64encode(s)
    # 输出:MTIzYWJj

    # 解码
    print base64.b64decode('MTIzYWJj')
    # 输出:123abc

if __name__ == '__main__':
    main()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容