1、Python函数参数
函数默认参数必须是不变对象
def my_function(L=[]):
L.append('end')
return L
因为默认参数L
也是一个变量,它指向对象[]
,每次调用该函数,如果改变了L
的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]
了。
所以定义默认参数应该使用不变对象
def my_function(L=None):
if L is None:
L = []
L.append('end')
return L
#可变参数(传入参数的个数是可变的)
def my_sum1(*num):
sum = 0
for i in num:
sum = sum + i
return sum
print my_sum1(*num1)
#关键字参数
def person(name,age,**kw):
print 'name:',name,'age:',age,'other:',kw
di = {'city':'hunan','university':'shang'}
person('lshen',20,city='beijing',height=170)
person('mark',22,**di)
2、使用自定义函数
导入Python文件夹中的test.py文件
>>> import os
>>> os.chdir('/Users/XXX/Documents/Code/Python')
>>> import test
注意这个路径不能有中文,路径是文件夹,import不带.py然后就可以直接调用test.py文件中的cal()函数。
>>> import test
>>> a = [1,2,3,4,5]
>>> test.cal(*a)
55
如果源文件有修改,需要
>>> import imp
>>> imp.reload(test)
3、递归函数优化--尾递归
当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在栈中去创建一个新的。编译器可以做到这点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时栈帧中并没有其他事情可做,因此也就没有保存栈帧的必要了。通过覆盖当前的栈帧而不是在其之上重新添加一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得更高。
def fact_iter(num,product=1):
if num == 1:
return product
return fact_iter(num-1,num*product)
4、切片
# 语法,start 和 stop 是列表下标,包含 start 下标的元素,不包含 stop 下标的元素,step 是步进,即每次取元素的步长,默认值是 1
L[start:stop:step]