zoukankan      html  css  js  c++  java
  • 函数的定义、作用域、函数递归

    函数分为:

    自定义函数:用户根据自己的需求自己编写的

    预定义的python函数:系统自带的函数,还有一些第三方编写的函数,如其他程序员编写的函数。对于线程的函数用户可以直接拿来使用

     def  函数名(参数列表):

         执行语句

        return (没有返回值时,返回none)

    1、python中,定义一个函数要使用 def 语句,依次写出函数名、括号、括号中的参数、冒号;在缩进块中编写函数体,函数的返回值用 retrun 返回;;如果没有return语句,函数执行完毕后也会返回结果,只是结果问None

      eg:自定义求绝对值my_abs函数:

        def my_abs(x):

          if x>=0:

            return x

          else:

            return -x

    2、空函数:什么也不做的空函数,使用 pass 语句;pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码运行起来,缺少pass代码运行有语法错误

      eg:if age >= 8

          pass

    3、参数检查:调用参数时,如果参数个数不对,python解释器会自动检查出来,并抛出 TypeError;;但是如果参数类型不对,python解释器就无法帮我们检查,若是内置函数,会自动检查;若是自定义的函数,不会自动检查。

      eg:优化my_abs函数,对参数类型做检查,只允许整数和浮点数类型的参数。数据类型检查可以使用内置函数 isinstance 实现

        def my_abs(x):

          if not isinstance(x,(int,float)):

            raise TypeError('bad operand type')

          if x>=0:

            return x

          else:

            return -x

    4、返回多个值:函数可以同时返回多个值,但其实就是一个 tuple 元组

    =============================================================================

    两种基本的变量作用域:

      局部作用域

      全局作用域

    1、全局作用域的作用范围仅限于单个文件,一个文件就是一个大的作用域,如果有两个文件有同样的一个变量;为了避免这两个变量重复导致我们无法准确的使用其中的一个变量,可以根据使用不同文件的作用域来准确定位想要的那个变量

    2、每次函数调用都会生成一个新的本地作用域

    3、在默认情况下,所有函数定义内部的变量名是位于本地作用域内的,如果要在一个函数内部操作一个位于全局的变量名,需要在函数内部个变量名使用 global 声明(把局部变量声明为全局变量)

    =============================================================================

    递归概念:函数包含了对自身的调用,该函数就是递归

    递归目的:如果发现你将要做的事情,就是你现在做的,那么用递归

    1、所有的递归都得确定结束标志

    2、在python中默认的递归限制(1000此左右)函数每次调用,都会生成一个新的作用域,消耗内存资源的;若无限递归下去,对内存消耗比死循环还要严重

    3、递归次数超出时,报RecursionError

    Eg:求和

    方法一:使用while + 切片
    num = 0
    L = [1,2,3]
    while L:
    num = num +L[0]
    L = L[1:]
    print num

    方法二:使用for语句
    num = 0
    L = [1,2,3,4]
    for var in L:
      num = num + var
      print num
    方法三:使用递归函数
    L = [1,2,3,4,5]
    def mysum(L):
    if not L:  
    # L=[]时 not L返回是True,则执行if语句
    print('L[1:0] 取到空列表')
    return 0
    else:
    return (L[0]+mysum(L[1:]))  #1+2+3+4+5+0
    (是return返回的0)
    print(mysum(L))

    函数输出:L[1:0]取到空列表
         15
    输出结果分析:因为函数进栈,先是1,2,3,4,5然后再L[1:0]取到空列表;但当输出取值时,先取上面的;栈先进后出,所以打印结果如上

    Eg:100元每天花一半,一共可以花多少天;使用递归调用;钱小于1块算花完了

    money = 100
    day = 0
    def cost(money):
    global day
    if money < 1:
    print('钱花完了')
    return
    money = money // 2
    # 因为出发精确到小叔,所以使用 // 向下取整标志
    day = day +1
    cost(money)

    cost(money)
    print(day)

    4、思考:有循环为什么还需要用递归

    Eg:求和[1,[2,[3,4],5]6,[7,8]]

    L = [1,[2,[3,4],5],6,[7,8]]
    sum = 0
    def mysum(L):
    global sum
    for var in L: #
    终止条件,用来迭代列表,取出其中的值
    if isinstance(var,list):
    # 若取出的值还是一个列表,继续执行函数,并且把该值当做参数传递
    mysum(var)
    else:
    sum = sum + var #
    取出的是一个值,不是list时,直接求和
    mysum(L)
    print(sum)  #36
  • 相关阅读:
    Python模糊查询本地文件夹去除文件后缀(7行代码)
    Python正则表达式
    python的logging模块
    Python中hashlib模块
    Python的os模块
    项目初始化mysql建库和授权
    Add correct host key in /root/.ssh/known_hosts to get rid of this message
    高中典型的等比数学题
    autoenv的使用方法
    celery任务进程关闭
  • 原文地址:https://www.cnblogs.com/zzfighting/p/5416422.html
Copyright © 2011-2022 走看看