在学习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- 浅拷贝、深拷贝
- 非容器类型(比如数字、字符串和其他“原子”类型的对象,像代码、类型和xrangge对象等)没有被拷贝一说,浅拷贝是完全切片操作来完成的。
- 如果元组变量只包含原子类型对象,对它的深拷贝将不会进行。
-函数参数
必选参数、默认参数、可变参数、关键字参数
在定义参数的时候,使用如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语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。