python可变参数与标准输出的重定位

用python的内置函数print时,大家会发现它是支持任意多个参数,也就是说,print的调用参数是不固定的。例如:

print "你好"
print "我是",name
print "现在是", time , " 你在干什么呢", name , "!"

 

 这得益与python的“可变参数”,在Python里,可以使用*和**来设置可变参数,它们的区别是*传递一个参数元组,**传递一个参数字典,二者可以同时混合使用。混合使用时要加些小心,因为python中他们的次序是重要的。参数归为4类,不是所有的类别都需要。他们必须按下面的次序定义,不用的可以跳过。
    1)必须的参数
    2)可选的参数
    3)过量的位置参数
    4)过量的关键字参数

def funName(a, b=None, *c, **d):

 

    这个次序是必须的,因为*args和**kwargs只接受那些没有放进来的其他任何参数。没有这个次序,当你调用一个带有位置参数的函数,python就不知道哪个值是已声明参数想要的,也不知道哪个被作为过量参数对待。
    也要注意的是,当函数能接受许多必须的参数和可选的参数,那它只要定义一个过量的参数类型即可。看下面的例子:

 代码如下 复制代码

    def add(a, b, c):
        return a + b + c
    >>> add(1, 2, 3)
    6
    >>> add(a=4, b=5, c=6)
    15
    >>> args = (2, 3)
    >>> add(1, *args)
    6
    >>> kwargs={'b': 8, 'c': 9}
    >>> add(a=7, **kwargs)
    24
    >>> add(a=7, *args)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: add() got multiple values for keyword argument 'a'
    >>> add(1, 2, a=7)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: add() got multiple values for keyword argument 'a'

    注意这个例子的最后几行,特别留意当传递一个元组作为可变参数时,是否要显式的传递关键字参数。因为python使用次序规则来扩展过量的参数,那位置参数要放在前面。这个例子中,最后两个调用是相同的,python不能决定那个值是给a的。

    下面举一个例子来模仿print的实现:

 代码如下 复制代码

    >>> import sys
    >>> def myprint(*argv):
        sys.stdout.write(" ".join([str(i) for i in argv]) + "n")
    >>> print "I believe", 2012, "is the end of the world."
    I believe 2012 is the end of the world.
    >>> myprint("I believe", 2012, "is the end of the world.")
    I believe 2012 is the end of the world.
    >>> print "tuple:", (1, 2, 3), "list:", [1, 2, 3], "dict:", {"begin":-2012, "end":2012}
    tuple: (1, 2, 3) list: [1, 2, 3] dict: {'begin': -2012, 'end': 2012}
    >>> myprint("tuple:", (1, 2, 3), "list:", [1, 2, 3], "dict:", {"begin":-2012, "end":2012})
    tuple: (1, 2, 3) list: [1, 2, 3] dict: {'begin': -2012, 'end': 2012}

    print默认是输出到stdout中,在终端运行的程序,无重定向的情况下,print输出到控制台。如果要做代码里实现把print的输出写入到log文件中,可以通过修改stdout的文件对象来实现。同理,重定位标准输入和标准错误输出分别修改stdin和stderr的文件对象即可。
    下面的例子捕捉所有print的输出,让输出的每一行前增加一个时间的显示:

 代码如下 复制代码

 

    import sys, time
    class MyOutput():
        def __init__(self, fd):
            self.formatTime()
            self.out = fd
            self.newLine = True
        def formatTime(self):
            return time.strftime("%H:%M:%S  ", time.localtime())
        def write(self, s):
            if self.newLine:
                self.out.write(self.formatTime())
                self.newLine = False
            self.out.write(s)
            if s.endswith("n"):
                self.newLine = True
        def flush(self):
            self.out.flush()
    sys.stdout = MyOutput(sys.stdout)
    print "Program begin."
    mylist = [5, 4, 3, 2, 1]
    print "prev:  ", mylist
    mylist.sort()
    print "after: ", mylist
    time.sleep(3)
    print "Program end."

时间: 2024-09-12 20:52:02

python可变参数与标准输出的重定位的相关文章

简单谈谈Python中函数的可变参数_python

前言 在Python中定义函数,可以用必选参数.默认参数.可变参数和关键字参数,这4种参数都可以一起使用,或者只用其中某些,但是请注意,参数定义的顺序必须是:必选参数.默认参数.可变参数和关键字参数. 可变参数( * ) 可变参数,顾名思义,它的参数是可变的,比如列表.字典等.如果我们需要函数处理可变数量参数的时候,就可以使用可变参数. 我们在查看很多Python源码时,经常会看到 某函数(*参数1, **参数2)这样的函数定义,这个*参数和**参数就是可变参数,一时会让人有点费解.其实只要把函

Python中的关键字参数与非关键字参数(可变参数)详解

学过php或者其他语言的同学都知道,php里面的参数不是个数不是可变的(只是很多时候是可以省略的,因为在函数定义的时候为参数设置了默认值).但是在python里却不是这样,python里面运行可变参数的出现,参数中出现(*arg,**arg2)的形式. 今天我们来详解一下这种用法: 例如: def foo1(arg1,arg2,key1=1,key2=2,*arg,**keywords): print "arg1 parameters is ",arg1 print "arg

Python中函数的参数定义和可变参数用法实例分析

  本文实例讲述了Python中函数的参数定义和可变参数用法.分享给大家供大家参考.具体如下: 刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解.其实只要把函数参数定义搞清楚了,就不难理解了. 先说说函数定义,我们都知道,下面的代码定义了一个函数funcA ? 1 2 def funcA(): pass 显然,函数funcA没有参数(同时啥也不干:D). 下面这个函数funcB就有两个参数了, ? 1

Python函数可变参数定义及其参数传递方式实例详解

  本文实例讲述了Python函数可变参数定义及其参数传递方式.分享给大家供大家参考.具体分析如下: python中 函数不定参数的定义形式如下: 1.func(*args) 传入的参数为以元组形式存在args中,如: ? 1 2 3 4 5 6 def func(*args): print args >>> func(1,2,3) (1, 2, 3) >>> func(*[1,2,3]) #这个方式可以直接将一个列表的所有元素当作不定参数 传入(1, 2, 3) 2.

理解 Python 中s可变参数的 *args 和 **kwargs

使用默认参数的可变参数 Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def test_defargs(one, two = 2): print 'Required argument: ', one print 'Optional argument: ', two test_defargs(1) # result: # Required argument: 1 # Optional argument: 2 test_defargs(1, 3) # result: # Re

PYTHON的可变参数*ARGS,**KWARGS及区别

在Python的函数参数中经常可以看到*args和**kwargs这样的写法,这是Python的魔法参数,也就是可变参数,它支持传入多个参数,下面看看它们的区别. *args表示任何多个无名参数,它是一个tuple:**kwargs表示关键字参数,它是一个 dict.并且同时使用*args和**kwargs时,必须*args参数列要在**kwargs前,像foo(a=1, b='2′, c=3, a', 1, None, )这样调用的话,会提示语法错误"SyntaxError: non-keyw

Python入门(四)——函数概述,参数,可变参数,关键字参数,组合参数,递归函数

Python入门(四)--函数概述,参数,可变参数,关键字参数,组合参数,递归函数 Hello,各位,我们继续来学习python 一.函数概述 函数,就是方法嘛,其实在我们之前就已经接触过了,看一下代码 #求长度 print len(["xx", "yy"]) #求绝对值 print abs(-2) 在这段代码中,这个len()和abs()就是函数 而且有意思的是,函数可以赋值 a = abs print a(-2) 这也是可以的 二.函数参数 那我们会使用了,我们

C语言可变参数

一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数.这也是c功能强大的一个方面,例如我们经常用到的标准输入scanf和标准输出printf函数,函数原型如下: int scanf(const char *format, ...); int printf(const char *format, ...); 它的第一个参数是format,属于固定参数,后面跟的参数的个数和类

c/c++支持可变参数的函数

一.为什么要使用可变参数的函数? 一般我们编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定,因此c语言引入可变参数函数.这也是c功能强大的一个方面,其它某些语言,比如fortran就没有这个功能. 典型的可变参数函数的例子有大家熟悉的printf().scanf()等. 二.c/c++如何实现可变参数的函数? 为了支持可变参数函数,C语言引入新的调用协议, 即C语言调用约定 __cdecl . 采用C/