#Python作用域:
• 定义:Python程序的一块文本区域,是变量或函数访问的时候查找名称的范围空间
• 分类:
 局部作用域(函数内)local  L;
 外部嵌套函数作用域  Enclosing function locals   E
 函数定义所在模块(文本)的作用域  Global(Module)G
 Python内置模块的作用域   built-in python  B• 展示4个作用域

 """
 展示4个作用域    __doc__
 """
 v = 100    #全局作用域G
 def fun1():
       v = 200    #外部嵌套函数作用域E
       print("fun1.v=",v)
       def fun2():
             v = 300         #局部作用域L
             print("fun2.v=",v)
       fun2()
 fun1()
 print("v=",v)

 print(__doc__)         #__doc__是内建作用域的变量,打印注释的内容。• 变量名的查找规则:
 访问变量时,先本地,后嵌套函数,之后是全局,最后是内置
 L-->E-->G-->B• 全局和局部作用域:
 v = 100
 def fn():
       v = 200
       print(v)        #v=200
 fn()
 print(v)    #v=100• 全局声明 global
 v=100
 def fn(v):
       global v       #error ,v出现在了参数列表里
       print(v)
 fn(200)• global 说明:
 1,全局变量在函数内部被赋值时,则必须经过全局声明,否则被认为是局部变量
 2,全局变量在函数内部不经过声明就可以直接读取访问(前提是变量已经存在)
 3,不能先声明局部变量,再用global声明为全局变量,此做法不符合语法规则
 4,global变量列表里的变量名不能出现在此作用域的参数列表里,for循环控制目标,类定义,函数定义及import导入名字中。• 函数嵌套 
 内部函数为类的成员方法• nonlocal语句
 1,作用:告诉解释器,nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量
 2,语法:nonlocal var1,var2,....
 var = 100
 def outer():
      var = 200
      def inner():
           nonlocal var
           #global var
           var+=1
           print("inner.var=",var)
      inner()
 print("outer.var=",var)
 outer()• globals()/locals()函数
 globals(),返回当前全局作用域内的变量的字典
 locals(),     返回当前局局作用域内的变量的字典#函数式编程思想
• 函数式编程的定义
• 有边界效应的函数:(不可重入的函数)
 使用了全局变量,静态变量,或者处理的数据不全是来自函数的输入(比如来自硬件)的。• 纯函数式:(可重入的函数)
 类似数学函数的映射,给定输入,就会得到指定输出,没有任何副作用的。• 函数式编程的好处:
 *逻辑可证:逻辑上证明程序是正确的(而不是通过测试)
 *模块化:一个函数做一个事,将大的功能拆分成尽可能小的模块。小的函数更易于阅读和检查错误。
 *组件化:小的函数更容易加以组合形成新的功能。
 *易于混淆:细化的、定义清晰的函数,使得调试更加简单。
 *易于测试:不依赖于系统状态的函数无须在测试前构造测试桩,使得编写单元测试更加容易。
 *更高的生产率#函数式编程的基础风格特征
• 函数是一等公民:函数能作为参数传递,或者是作为返回值返回。
• 函数变量:函数名是变量,他在创建函数时绑定一个函数对象。
 def fn():
      print("hello,world") 
 f1 = fn()      #"hello,world" 被浅拷贝
 f1()         #等同于调用fn()• 高阶函数
 什么是高阶函数:满足以下任意一条
 1,函数接受一个或多个函数作为参数传入
 2,函数返回一个函数
 def getfn():
      def print_hello():
            print("hello")
      return print_hello
 fn = getfun()
 fn()


 def tab(x,y):
      return "|"+x.center(13)+\
      "|"+y.center(13)+"|"
 def string(x,y):
      return "name:"+x+"age:"+y
 def myprint(fx,x,y):
      s = fx(x,y)
      print(s)

 myprint(tab,"midu","15")
 myprint(tab,"张三","18")• 偏函数:
 函数有很多参数时,如果固定住某些参数,可以利用functools模块Partial得到一个偏函数,方便以后的使用。
 >>>int("1234")
 1234
 >>>int("12345",base=8)
 5349
 >>>int("12345",16)
 74565

 >>> import functools
 >>> int2 = functools.partial(int,base=2)
 >>> int2("111")• 迭代器,后面讲
 可以用for循环变量的可迭代对象• 生成器,同上
 生成器(generator)是一种创建迭代器的方法• 封装控制结构内置模板函数
 Python中内置(builtins)的高阶函数
     map,filter,reduce,sorted• map函数:
 map(func,*iterable)  用函数func和可迭代对象iterable中的每个元素作为参数计算出新的可迭代对象,当最短的一个可迭代对象完成迭代后,此迭代生成结束。• reduce函数:
 reduce(function,iterable[,initializer])
 对参数序列中元素进行累积。函数将一个数据集合(链表、元组等)中的所有数据进行下列操作:用传给reduce中的函数function(有两个参数)先对集合中的第1,2个元素进行操作,得到的结果再与第三个数据用function函数运算,最后得到一个结果。
 >>>def add(x,y):
             return x+y
 >>>reduce(add,[1,2,3,4,5]) 
 15• filter函数
 filter(function or None,iterable)
 作用:筛选iterable中的数据,返回一个可迭代对象,此迭代对象将对iterable进行筛选。
 说明:function将对iterable中的每个元素进行求值,返回false则将此数据丢弃,返回True,则保留该数据。
 实例:
 def is_odd(n):
       return n%2 == 1
 newlist = filter(is_odd,[1,2,3,4,5,6,7,8,9,10])
 pirnt(newlist)• sorted 函数
 作用:将原可迭代对象的数据进行排序,生成排序后的列表
 格式:sorted(iterable,key = None,reverse=False)
 说明:key函数用来提供一个值,这个值作为排序的依据。
 实例:
 L=[-5,2,-3,-1,6]
 L2 = sorted(L,reverse=True)     #[6,2,.....]
 L3 = sorted(L,key=abs)             #[1,2,3,5,6]• lambda表达式(匿名函数)
 作用:创建一个匿名函数对象
            同def类似,但不提供函数名
 语法:
 lambda[参数1,参数2,....]:表达式      注:[]内的部分可以省略
 实例:
 def myadd(x,y):
       return x+y
 可以改写为:
 myadd = lambda x,y:x+y
 print("20+30=",myadd(20,30))