mrbear 发表于 2018-8-13 09:42:44

Python15 作用域、局部与全局变量

1.
  

def test(name):  

  print ('before',name)
  

  name = '22'             #该name变量属于局部变量,只在该函数中生效;该局部就相当于一个作用域
  

  print ('after',name)    #name引用的是局部变量的name
  

  
name = 11      #全局变量:函数外面的变量就是全局变量;全局变量在整个程序中都生效。
  

  
test(name)      #赋值给test函数的name参数,这个值引用的是全局变量的name
  

  
print (name)   #引用的是全局变量
  




  可以看到函数中的局部变量不会影响 全局的变量。


  可以通过global的方式在函数中把变量变成全局变量(不是引用全局变量),然后就可以对全局变量进行修改了。


  可以看到全局没有变量,在函数中使用global也是可以的;
  不过在实际编程中不建议使用global,不要在函数中修改全局变量,因为编程时一个函数可能会被多次调用,当一个程序写的比较复杂时,且函数被调用多次,会很难找到一个变量到底在哪里被修改,会造成非常混乱的情况。这样情况出错很难调试。

2.


  函数中的局部变量不能修改全局变量,也只限于简单的字符串和整数


  稍微复杂点形式的变量,比如列表,是可以被修改的。 列表、字典、集合、类等都可以被修改,元组本身就是不可变的,所以不能修改。

3.递归
  函数可以调用其他的函数,函数调用自身就叫做递归。


  最多可以调用999次(999层),这是python的保护几次,防止无限调用下去,导致机器卡死。
  但是自身循环999次没有任何意义,所以必须要有一个明确的结束条件

  设立结束条件 n/2 >0,递归不断的除以2

  小数点也大于0,所以会一直除以2
  2.3891548633682403e-298   最后会计算成这样的数字,这数字e后面的多少是十的负几次幂,也属于小数点。


  int将数字变成整数就不会出现小数点了,然后就可以整除了。

  效果与使用int一样,不能有小数点,必须是整数来整除
  递归特性:


[*]  必须有一个明确的结束条件

[*]  每次进入更深一层递归时,问题规模相比上次递归都应有所减少 (比如第一层列表是10个,下一次,也就是下一次调用自身列表中的元素就要比10要少)

[*]递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
4.函数式编程
  此函数非非彼函数,之前学的函数是函数中编写一些代码,而这里要将的函数是指数学中的函数运算。
  函数式编程,只要输入是确定的,输出就是确定的。
  对于计算机来说越抽象,计算效率就越低,python就属于这种,所以python语言不适合做函数式编程。
  适合函数式编程的语言有lisp、hashshell、erlang

5.高阶函数
  变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
  

def add(a,b,f):  return f(a)+f(b)
  

  
res = add(3,-6,abs)
  

  #abs是python自带的一个函数,将数字变成绝对值,也就是会将负数6变成正数6,这里就相当于3+6=9
  
print (res)
  

页: [1]
查看完整版本: Python15 作用域、局部与全局变量