设为首页 收藏本站
查看: 1008|回复: 0

[经验分享] 【12】Python函数学习(中)

[复制链接]

尚未签到

发表于 2018-8-8 08:00:44 | 显示全部楼层 |阅读模式
  作用域、局部和全局变量
  前向引用:
  def test(name,age=18,*args,**kwargs):
  print(name)
  print(age,args,kwargs)
  school("Test")   #程序执行从上到下的,这里的school还没定义,所以执行报错。
  test('alex',age=20,flag="F",water=1.5)
  def school(source):
  print(source)
  运行结果:
  报错NameError: name 'school' is not defined
  正确写法:
  def test(name,age=18,*args,**kwargs):
  print(name)
  print(age,args,kwargs)
  school("Test")
  def school(source):
  print(source)
  test('alex',age=20,flag="F",water=1.5)
  运行结果:
  alex
  20 () {'flag': 'F', 'water': 1.5}
  Test
  局部变量(只在函数里生效,这个函数就是这个变量的作用域)
  def logers(name):
  print('before change:',name)
  name='ALEX'
  print('after change:',name)
  age=23
  name='alex'
  logers(name)
  print(name)
  print(age)  #这里报错,NameError: name 'age' is not defined,,age属于局部变量,只能在局部生效。
  运行结果:
  before change: alex
  after change: ALEX
  alex
  全局变量(在顶层,第一级定义的变量都是全局变量)
  school='Oldboy'#顶层定义全局变量
  def logers(name):
  school="Mage"#局部变量
  print('before change:',name,school)
  name='ALEX'
  print('after change:',name)
  age=23
  name='alex'
  logers(name)
  print(name)
  #print(age)
  print(school)
  运行结果:
  before change: alex Mage  #局部变量优先,虽然内部变了,但是全局变量还是没变。
  after change: ALEX
  alex
  Oldboy  #全局变量
  改全局变量
  不要这么用1:
  school='Oldboy'
  def logers(name):
  global school  #我要把函数的全局变量改了
  school="Mage"
  print('before change:',name,school)
  name='ALEX'
  print('after change:',name)
  age=23
  name='alex'
  logers(name)
  print(name)
  #print(age)
  print(school)
  运行结果:
  before change: alex Mage
  after change: ALEX
  alex
  Mage
  总结:

  •   局部变量的作用域只在子程序(函数)中有效
      2、全局变量的作用域在整个程序
      3、全局变量配置在程序最顶层
      4、需要把全局变量改为局部变量那就用global 变量名(不要那么用)
      不要这么用2:(作死)
  def student():
  global name  #这个作用是把 name定义为全局变量
  name='alex'
  
  student()
  print(name)
  为啥:容易混乱程序(找bug找死你)
  递归:(在函数内部可以调用自己)
  1.必须要有明确的结束条件
  2.每次进入更深一层的时候,问题规模应该比上一层要小
  3.递归效率不高,递归层次过多会导致栈溢出。(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减少一层栈帧。由于栈的大小不是无限的,所以递归次数过多会导致栈溢出。)
  def calc(n):   #程序开始,取calc实参
  print(n)  #打印判断结果
  if int(n/2) >0 :
  return calc(int(n/2)) #递归
  print('>>>',n)
  calc(10)
  运行结果:
  10
  5
  2
  1
  >>> 1
  函数式编程介绍:
  函数式编程是一种抽象程度很高的编程范式,纯粹的函数式编程语言的编写没有变量。因此,任意一个函数,只要输入确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此这种函数是有副作用的。
  函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
  Python对函数式编程提供部分支持,由于python允许使用变量,因此,python不是纯函数式编程语言。
  想学函数式编程可以学lisp、hashshell、erlang
  高阶函数:
  变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就叫做高阶函数。
  def add(a,b,f):
  return f(a)+f(b)
  res=add(3,-6,abs)  #abs 绝对值的意思
  print(res)
  结果:
  9

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-548403-1-1.html 上篇帖子: python使用选择结构鉴别合法日期 下篇帖子: python-字典与列表学习
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表