Python学习笔记(二)

作者: tcxurun 分类: Python 发布时间: 2014-11-15 12:24 ė 6 没有评论

在学习Python的过程中,记录的一些知识点。

– enumerate()函数

这个函数可以同时循环索引及元素

foo = 'abc'
for i, ch in enumerate(foo):
    print ch, '(%d)' %i

输出结果如下:

    a (0)
    b (1)
    c (2)

– 列表解析式

squared = [x **2 for in range(8) if not x  % 2]
for i in squared :
    print i

输出结果如下:

0
4
16
36

– 浅拷贝、深拷贝

  1. 非容器类型(比如数字、字符串和其他“原子”类型的对象,像代码、类型和xrangge对象等)没有被拷贝一说,浅拷贝是完全切片操作来完成的。
  2. 如果元组变量只包含原子类型对象,对它的深拷贝将不会进行。

-函数参数

必选参数、默认参数、可变参数、关键字参数
在定义参数的时候,使用如a=1的方式,可以给参数赋予默认值。如果该参数没有被传递值,将使用这个默认值。如果传递值,那就使用传递值。

默认参数一定要用不可变对象,如果是可变对象,运行会有逻辑错误!

定义可变参数仅仅在参数前面加一个*号,如*args。在函数内部,参数接收到的是一个元组(tuple)。另外Python允许在list或tuple前面加一个*号,把list或者tuple的元素变成可变参数传进去。

关键字参数要在参数前面加两个**号,如**kw。可变参数允许传入0个任意个参数,关键字参数允许传入0个或任意个 含参数名的参数,这些关键字参数在函数内部自动组装成一个dict。

在定义函数时,四种参数可以一起使用,需要注意的是参数定义的顺序必须是:必选参数、默认参数、可变参数和关键字参数。

def func(a, b, c=0, *args, **kw):
    print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw

最神奇的是通过一个tuple和dict,你也可以调用该函数:

args = (1, 2, 3, 4)
 kw = {'x': 99}
 func(*args, **kw)
</pre></pre>
输出如下:
<pre><pre class="inline:true decode:1 " >

a = 1 b = 2 c = 3 args = (4,) kw = {'x': 99}`

所以,对于任意函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

– 递归函数

递归函数不用多说,但是在Python中,需要注意防止栈溢出,解决递归调用栈溢出的方法是通过尾递归优化。

尾递归是指:在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

本文出自天一直很蓝,转载时请注明出处及相应链接。

本文永久链接: http://www.tcxurun.cn/archives/311

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Ɣ回顶部