博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数的定义、作用域、函数递归
阅读量:7057 次
发布时间:2019-06-28

本文共 2443 字,大约阅读时间需要 8 分钟。

函数分为:

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

预定义的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

 

转载于:https://www.cnblogs.com/zzfighting/p/5416422.html

你可能感兴趣的文章
实测java 与php运行速度比较
查看>>
『字典树 trie』
查看>>
『The Captain 最短路建图优化』
查看>>
三元运算符判断分数类型
查看>>
通过QC远程运行QTP脚本,QTP自动崩溃关闭的解决方法
查看>>
HTML资源定位器-URL
查看>>
定时器setTimeout()和setInterval()使用心得整理
查看>>
C#学习笔记③——手动调试与错误处理
查看>>
Oracle all_parameters 视图
查看>>
StringBuilder拼接字符串,“,”在前还是在后问题
查看>>
Linux 内核中断内幕【转】
查看>>
Linux内核驱动--mmap设备方法【原创】
查看>>
ELK(elasticsearch+kibana+logstash)搜索引擎(二): elasticsearch基础教程
查看>>
网页中内容的显示问题
查看>>
JAVA编程思想三
查看>>
加密工具类
查看>>
ThinkPHP配置简单的mysql读写分离
查看>>
AngularJS Select(选择框)
查看>>
EXT.NET入门必读
查看>>
数据结构定义
查看>>