youlp 发表于 2015-12-1 11:08:24

二、python 函数

  1.定义函数



defmax(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()#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= ,再把list参数作为可变参数传进去,此时运用可变参数调用时,需要这么写calc(*num)
  或者 calc(num,num,num,num)
  
  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尾递归优化递归函数
   目的是为了防止栈溢出



deffact(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)函数改成尾递归方式,也会导致栈溢出。
页: [1]
查看完整版本: 二、python 函数