函数的定义、作用域、函数递归_weixin_34378922的博客-程序员秘密

技术标签: python  

函数分为:

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34378922/article/details/93206625

智能推荐

TypeScript手册翻译系列10-类型兼容性_weixin_34326429的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

Android 发送邮件以及定时发送邮件的实现_安卓手机 邮箱 定时发送_gaossssss的博客-程序员秘密

Android 发送邮件以及定时发送邮件的实现       本文以腾讯企业邮箱为例,展示如何发送邮件 及相关问题  选择腾讯企业邮箱是因为腾讯企业邮箱一般都是开启了smtp服务        项目地址:https://gitee.com/bimingcong/MySendEmail具体的smtp服务开启方式如下: 设置----》客户端设置----》记住红色框内的发送服务器地址smt...

idea中引入maven坐标无效解决_idea中导入坐标刷新没有用_收藏文章用的博客-程序员秘密

我maven projects已经存在要引入的坐标了本地仓库也下载好了坐标就是无效,特征就是Ctrl+左键点不进去maven reimport没用重导入坐标没用本地库jar包删了没用快一天了结果原因今天公司wifi出了些问题,虽然后面解决了但是idea有缓存,idea  file-invalid cached/retarted好了。。。。。...

树莓派 Retropie 4.4中文版使用说明 含roms资源_retropie界面设置中文_joyist的博客-程序员秘密

漫步云端服务器 http://chdong.top/bbs/ http://www.chdong.top/相关名词RetropieRetropie可以将你的树莓派或者PC变成一台复古游戏机。 Retropie基于完整的操作系统之上,你可以把它装在Raspbian系统上,或者直接刷入完整的镜像然后再添加更多的软件。模拟器一种能使电脑运行其他平台软件的软件。Retropie...

nginx img 403 forbidden问题的解决_Dreamy_wit的博客-程序员秘密

一、问题背景 今天在nginx 服务器上调试代码,发现报了一个图片无法显示的403 错误,如图:二、解决思路 可能是因为logo.png 这张图片的“文件操作权限“被设置成“不可读“。 1,打开终端 2,进入图片路径:cd /usr/local/nginx/html/flyblog/img 3, 显示文件夹内的详细信息: ls -l 证实发现该图片的文件操作权限缺少 r:-rw-r--

随便推点

nodejs session失效跳转登录页_nodejs 登录状态失效_qq_40355543的博客-程序员秘密

**session失效,ajax跳转login页面**问题描述:登录超时之后,点击页面中的所有ajax操作类型的按钮之后无反应,有的出现弹出login弹窗bug。问题环境:nodejs, bootstrap datatables plug-in分页插件,普通ajax。问题查看:超时后点击无效;代码bug修复:req.headers["x-requested-with"] =...

signature=fedb52cdaa1a8c0f80b11375a0fa940b,MacSphere: Recursive Estimation of Driving-Forces from No..._牛岱的博客-程序员秘密

Abstract: We address a functional analysis-based method for the estimation of driving-forces from nonlinear dynamic systems in this thesis. The driving-forces account for the perturbation inputs or th...

HDLBits答案汇总_日拱一卒_未来可期的博客-程序员秘密

前言该博客为本人做HDLBits习题时的心得记录总结,欢迎大家一起交流进步。HDLBits网站链接Verilog LanguageBasicsVectorsModules:HierarchyProceduresMore Verilog FeaturesCircuitsCombinational LogicBasic gatesMultiplexersArithmetic CircuitsKarnaugh Map to CircuitSequential LogicLatche

c语言运算符计算作业题,c语言练习集(含答案)_蓝虫虫的博客-程序员秘密

以下为《c语言练习集(含答案)》的无排版文字预览,完整格式请下载下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。《C语言程序设计》习题集班级:学号:姓名:第1章 C语言概述1.1 基本知识点(C语言的特点(C程序基本结构(C程序的运行过程(C程序的语法规则(C程序的开发过程1.2 练习题1及参考答案1. 单项选择题(1)以下并非C语言的特点的是 ...

使用python3+selenium自动化 弹窗确定报错 no such alert_python 自动化 确认框 没法确认_宋祖儿的博客-程序员秘密

在网上摘抄了一个简单的小例子使用driver.switch_to_alert.accept()alert.accept()控制页面弹出的alert在 pycharm 跑了一次 出现以下错误:NO SUCH ALERT后面看了很多资料参考https://stackoverflow.com/questions/33466853/switch-to-alert-text-not-worki...

2021最新Java面试真题解析!【程序猿历程(4)_第1关:使用前后置通知统计所有方法的执行时间_m0_60388117的博客-程序员秘密

序号书名开始时间结束时间进度备注1深入理解java虚拟机2020-1-12020-2-15未完成215/4032Spring实战2020-2-162020-3-15未完成100/5773java编程思想2020-3-16&nbsp;未完待续158/8554软技能&nbsp; 代码之外的生存指南2020-3-23&nbsp;未完待续41/370读书完成情况较差,读书领悟方面较2019年有所进步,感觉看视频比读书强,一个阶段一个想法吧!视频篇:序号视频开始时间结束时间进度备注1SSH 尚硅谷2020-1-

推荐文章

热门文章

相关标签