安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

Python其实很简单第十二章函数与变量的作用域

9月21日 飞虹谷投稿
  在前面已经多次提到函数这个概念,之所以没有解释什么是函数,是因为程序中的函数和数学中的函数差不多,如input()、range()等都是函数,这些都是Python的标准函数,直接使用就可以了。根据需要,用户也可以自定义函数。
  12。1函数
  函数的结构:
  def函数名(参数):
  函数体
  return返回值
  例如:数学中的函数f(x)2x5在Python中可以定义如下:
  deff(x):
  y2x5
  return(y)
  如果x取值为3,可以使用如下语句调用函数:
  f(3)
  下面给出完整的程序代码:
  deff(x):
  y2x5
  return(y)
  resf(3)
  print(res)
  运行结果:11
  如上例中的x是函数f(x)的参数,有时也被称为形式参数(简称形参),在函数被调用时,x被具体的值3替换y就是函数的返回值,这个值3也被称为实际参数(简称实参)。
  上例中的y是函数f(x)的返回值。并不是所有的函数都有参数和返回值。如下面的函数:
  deffunc():
  print(此为无参数传递、无返回值的函数)
  func()
  输出结果:此为无参数传递、无返回值的函数
  可以看出,该函数func()无参数,故调用时不用赋给参数值。
  函数也可以有多个参数,如f(x,y)xy,可用Python语言定义如下:
  deff(x,y):
  zx2y2
  returnz
  print(f(2,3))调用函数f(x,y)
  输出结果:13
  也可以通过直接给参数列表中的参数赋值的方法,为参数添加默认值,如果用户赋予参数值,则按照用户赋值执行,否则使用默认值。例如:
  deff(x,y3):
  zx2y2
  returnz
  若调用时参数列表为(2,1),即x赋值为2,y赋值为1:
  print(f(2,1))
  输出结果为:5
  若调用时参数列表为(2),即x赋值为2,y赋值省缺,则y使用默认值:
  print(f(2))
  输出结果为:13
  回调函数,又称函数回调,是将函数作为另一函数的参数。
  例如:
  deffunc(fun,m,n):
  fun(m,n)
  deffadd(m,n):
  print(mn,mn)
  deffmult(m,n):
  print(mn,mn)
  func(fadd,2,3)
  func(fmult,2,3)
  输出结果:
  mn5
  mn6
  在fadd(m,n)和fmult(m,n)被定义前,func(fun,m,n)中的fun(m,n)就已经调用了这两个函数,即先调用后定义,这也是回调函数的特点。
  如果无法预知参数的个数,可以在参数前面加上号,这种参数实际上对应元组类型。譬如,参会的人数事先不能确定,只能根据与会人员名单输入:
  deffunc(names):
  print(今天与会人员有:)
  fornameinnames:
  print(name)
  func(张小兵,陈晓梅,李大海,王长江)
  运行后,输出结果为:
  今天与会人员有:
  张小兵
  陈晓梅
  李大海
  王长江
  参数为字典类型,需要在参数前面加上号。
  deffunc(kwargs):
  foriinkwargs:
  print(i,kwargs〔i〕)
  func(aa1,bb1,cc1)
  输出结果为:
  aa1
  bb1
  cc1
  一个有趣的实例:
  deffunc(x,y,z,args,kwargs):
  print(x,y,z)
  print(args)
  print(kwargs)
  func(a,b,c,Python,iseasy,pypython,jjava,phphp)
  输出结果:
  abc前三个实参赋给前三个形参
  (Python,iseasy)args接收元组数据
  {py:python,j:java,ph:php}kwargs接收字典数据
  12。2变量的作用域
  变量的作用域即变量的有效范围,可分为全局变量和局部变量。
  局部变量
  在函数中定义的变量就是局部变量,局部变量的作用域仅限于函数内部使用。
  全局变量
  在主程序中定义的变量就是全局变量,但在函数中用关键字global修饰的变量也可以当做全局变量来使用。
  全局变量的作用域是整个程序,也就是说,全局变量可以在整个程序中可以访问。
  下面通过实例去讨论:
  程序1:
  a1a为全局变量
  defaadd():
  print(a的初值:,a)在函数中读取a的值
  aadd()调用函数aadd()
  a1主程序语句,a增加1
  print(a现在的值是:,a)主程序语句,读取a的值
  运行结果:
  a的初值:1
  a现在的值是:2
  这个结果和我们想象的一样,全局变量a既可以在主程序中读取,也可以在子程序(函数)中读取。
  程序2:
  a1
  defaadd():
  a1
  print(a的初值:,a)
  aadd()
  print(a现在的值是:,a)
  运行程序1时出现如下错误提示:
  UnboundLocalError:localvariableareferencedbeforeassignment
  意思是:局部变量a在赋值之前被引用。
  从语法上来讲,该程序没有错误。首先定义了一个全局变量a并赋值为1,又定义了一个函数aadd(),函数内的语句a1就是出错的根源,虽然我们的初衷是想让全局变量a的值增加1,但从错误提示看,这个语句中的a并不是全局变量,而是局部变量。看来,在函数中读取全局变量的值是没有问题的(在程序1中已经得到了验证),但要在函数中改变全局变量的值是不行的(在程序2的错误提示a1中的a是局部变量,而非全局变量)。
  怎样解决这个问题?
  程序3:
  a1
  defaadd(x):
  x1
  returnx
  print(a的初值:,a)
  aaadd(a)
  print(a现在的值是:,a)
  运行结果:
  a的初值:1
  a现在的值是:2
  结果的确是正确的,但在函数aadd(x)中没有调用变量a(没有出现变量a)。
  程序4:
  a1
  defaadd(a):
  a1
  returna
  print(a的初值:,a)
  aaadd(a)
  print(a现在的值是:,a)
  运行结果:
  a的初值:1
  a现在的值是:2
  对比程序4和程序3不难发现,其实程序4只是简单的把函数的参数x变成了a,这个a的实质和程序3中的x还是一样的。这进一步证实,函数中的a是局部变量,与主程序的全局变量a有着本质的区别。
  程序5:
  a1
  defaadd():
  globala
  a1
  print(a的初值:,a)
  aadd()
  print(a现在的值是:,a)
  运行结果:
  a的初值:1
  a现在的值是:2
  程序5和程序2相比较,仅仅是在函数中添加了一个定义globala,此时的局部变量a就可以当做全局变量使用,由于它和全局变量a同名,自然也就不用区分a究竟是全局变量还是局部变量了,在主程序和该函数内都可以访问、修改变量a的值了。
  虽然使用global可使变量使用起来非常方便,但也容易引起混淆,故在使用过程中还是谨慎为好。
  12。3函数的递归与嵌套
  递归,就是函数调用它自身。递归必须设置停止条件,否则函数将无法终止,形成死循环。
  以计算阶乘为例:
  deffunc(n):
  ifn1:
  return1
  else:
  returnnfunc(n1)func()调用func()
  print(func(5))
  运行结果为:120
  嵌套,指在函数中调用另外的函数。这是程序中常见的一种结构,在此不再赘述。
  匿名函数
  Python中可以在参数前加上关键字lambda定义一个匿名函数,这样的函数一般都属于一次性的。
  例如:
  程序1:这是一个常规的函数定义和调用。
  deffadd(x,y):
  returnxy
  print(fadd(2,3))
  输出结果:5
  程序2:使用lambda定义匿名函数。
  faddlambdax,y:xy
  print(fadd(2,3))
  输出结果:5
  从上面的代码可以看出,使用lambda仅仅减少了一行代码。faddlambdax,y:xy中的fadd不是变量名,而是函数名。程序1和程序2的print()语句中的参数都是一样的调用函数fadd()。所以,匿名函数并没有太多的优点。
投诉 评论

巨咖BATTLE秀炫酷开幕悦享精彩嗨不停北京U5PLUS咖位9月23日,巨咖BATTLE秀北京U5PLUS天团直播大会在抖音平台炫酷开场,7万级悦享生活家轿北京U5PLUS咖位出道,售价6。99万元10。09万元,将以7万元价格回馈用户……病毒都去哪儿了?为什么你的电脑现在很少中病毒了?过去病毒是打砸抢的土匪,搞的用户电脑无法正常运行;现在的病毒是小偷,偷偷拿走你的东西还要让你不知道,所以你就感觉现在很少有病毒了杀毒软件免费了〔捂脸〕〔捂脸〕蛇鼠一……网络对柳传志褒贬不一你认为他是好人还是坏人?历史会证明:柳传志就是历史罪人,一个披着民族企业的外衣,其实就是彻头彻尾的美国企业,为美军免费送电脑,公开资敌,投敌叛国,把全资国有企业通过自己诡异的骚操作,把联想改成自己的企……余承东和前华为太子李一男,哪个人对华为的贡献更大?李一男带着华为短短七年从销售额一亿做到到一百亿,可以说没有李一男就没有华为,华为的第一桶金CC08机和万门机都是李一男研发出来的,没有余大嘴华为手机一样成功,没有李一男华为早倒……Python其实很简单第十二章函数与变量的作用域在前面已经多次提到函数这个概念,之所以没有解释什么是函数,是因为程序中的函数和数学中的函数差不多,如input()、range()等都是函数,这些都是Python的标准函数,直……抗衰老科技初创公司AltosLabs获贝索斯等投资30亿美元据《泰晤士报》近日报道,亚马逊创始人杰夫贝索斯等已向细胞再生初创公司AltosLabs投资30亿美元。AltosLabs将开发生物技术,以恢复细胞的健康及它们对疾病、伤害甚至残……数科日报丨微博注册多项微博电商商标小鹏汽车回应因侵权被罚01丨瑞幸正式完成债务重组4月11日,瑞幸咖啡在官网发布公告称,公司完成金融债务重组,未来在任何司法管辖区不再受到破产或破产程序的约束。公告显示,瑞幸于3月4日向纽约南区……互联网经营到底如何?网传的大裁员时代是真的么?一直以来,互联网企业的程序员都是大家羡慕的对象,收入高是出了名的。不过这几年,陆续有35岁危机的说法,各种裁员的传闻也是屡见不鲜。随着去年下半年到今年中概股的大跌,限制资本无限……46940元起售,全球限量19台!iPhone13Pro乔布俄罗斯奢侈品制造商Caviar是我们的老朋友,时不时开始整活引发大量关注,例如推出定制版本的华为、三星等众多品牌手机,最多当然还是iPhone系列产品。Caviar最新推出定制……Java后端开发规范Java后端开发规范一、技术栈规约二、命名规范三、Java代码规范(注释规范、异常与日志、代码逻辑规范)四、Mybatis与SQL规范五、结果检查……捷报!华为发布业内首个5G路由器速度达4G的21倍!世界移动通信大会简称MWC,是全球移动通信系统协会组织举办的一场移动通信业的大会,来自世界各地的手机厂商、软件公司、设备提供商和其他行业的科技公司每年都会在MWC上推出自家的新……新能源光环褪色基金经理激辩风格转换新年以来,新能源板块连续两个交易日大幅下跌,中证内地新能源主题指数累计跌幅达7。29。与此同时,资金也在加速流出新能源板块。市场人士认为,新能源板块表现疲弱的背后存在机构调仓的……
格力空调和美的空调哪个质量好?有对比更显高性价比新能源电力市场交易和海上风电投资机会解读纪要一个差评扣200到300元!现在改了!美团外卖试点骑手柔性考财经辣评用户过亿的美图,摆脱广告依赖真能有戏吗回收系统开发开发一个APP所需要的成本我今天才下载的今日头条,请问你们觉得抖音好些还是今日头条好呢从名医主刀到名医主导,互联网医疗进入4。0时代家用电脑硬盘,选蓝盘还是黑盘,哪个好用稳定?大家帮推荐一下几款性价比高的,DAC解码器?助听器会影响老人身体健康吗?Springboot下的RabbitMQ消息监听源码解读6码是多大的鞋春节去哪里旅游比较好春节亲子游去哪好金鹰女神战袍首曝光,设计被嘲像铠甲勇士,谭松韵或许已被出局如何帮孩子度过婚姻敏感期淘宝闯入微信!超主播斩首!破天荒事件不断产后饮食哺乳期能吃雪糕吗肖战被曝出演特工任务,或合作这街4队长,导演名气很大自动晾衣架升降不了怎么办地暖如何放气放水呢浅谈对比语言学与翻译的关系死亡诗社观后感字三篇有阳光真好半命题作文

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利