二、python 函数

1.定义函数

def  max(x,y):
  if x>y:
   return x
  else:
    return y

如果定义空函数(函数还没想好怎么编写,只是为了让整个代码能够运行起来)

def max(x,y):
  pass

2.函数的参数

2.1可变参数

顾名思义参数是可变的,既可以是1个参数,也可以是多个参数

例:请计算a^2+ b^2 + c^2 + ……,其中a,b,c.....个数不确定,所以我们将参数用一个list或tuple传进去

def calc(numbers):
  sum =0
  for i in numbers:
    sum = sum + i*i
  return sum

调用时

calc([1,2,3])  #list作为输入,输出为14

calc((1,2,4))  #tuple作为输入,输出为21

如果想将list或者tuple的参数,改为可变参数,代码如下:

def calc(*numbers):  #只需要在numbers前面加*
  sum =0
  for i in numbers:
    sum = sum + i*i
  return sum

调用时 calc(1,2,3)   #输出14

与前面的定义只是多了个*,可变参数numbers在函数内封装成tuple类型。

也可以先组建一个list,num=[1,9,10,4] ,再把list参数作为可变参数传进去,此时运用可变参数调用时,需要这么写calc(*num)

或者 calc(num[0],num[1],num[2],num[3])

2.2关键字参数

关键字参数,在函数内部封装成dict类型,定义时会用**标记

例如:

def one(name,sex,**kw):
  print 'name:',name,'sex:',sex,'other:',kw # , 表示输出一个空格,注:python的单引号与双引号使用没什么区别。

小技巧:str='my name is "boy" '   或者   str="my name is 'boy' "

调用时:

one(Tom,boy,city='beijing')    输出为name: Tom sex: boy others: {'city':'beijing'}

one(Tom,boy,city='beijing',job='teacher')  输出    name: Tom sex: boy others: {'city':'beijing','job':'teacher'}

和可变参数类似,也可以先组建一个dict,再把dict转换为关键字参数传进去,例:

dict={'city':'beijing','job':'teacher'}  调用时用法为one(Tom,boy,**dict); 或者  one(Tom,boy,city=dict['city'],job=dict['job'])

3.递归函数

3.1递归举例

例子,计算n!

def fact(n):
  if n =0:
    return 1
  return n*fact(n-1)

递归函数的优点是定义简单,逻辑清晰,但是容易出现栈溢出,在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减少一层栈帧,由于栈的大小不是无限的,所以递归次数过多,会导致栈溢出

3.2尾递归优化递归函数

目的是为了防止栈溢出

def  fact(n):
  return fact_iter(1,1,n)
def fact_iter(pro,count,max):
  if count>max :
    return pro
  return fact_iter(pro*count,count+1,max)

尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。遗憾的是,大多数编程语言没有针对尾递归做优化,python解释器也没有做优化,所以,即使上面的fact(n)函数改成尾递归方式,也会导致栈溢出。

上一篇:分布式:2PC,3PC,Paxos,Raft,ISR [转]


下一篇:CSS3中的px,em,rem,vh,vw