zoukankan      html  css  js  c++  java
  • 二、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)函数改成尾递归方式,也会导致栈溢出。

  • 相关阅读:
    Windows CE Notification API的使用方法
    探讨如何成为技术团队管理者
    Android应用---基于NDK的samples例程hello-jni学习NDK开发
    在eclipse中配置android ndk的自动编译环境builders
    用javah 导出类的头文件, 常见的错误及正确的使用方法
    Android下NDK开发环境搭建
    Android系统修改硬件设备访问权限
    Android调试工具之ADB
    关于前端小白的一点小建议
    Vue.js简单实践
  • 原文地址:https://www.cnblogs.com/likailiche/p/4352198.html
Copyright © 2011-2022 走看看