zoukankan      html  css  js  c++  java
  • (转)函数作用域,匿名函数,函数式编程,面向过程,面向对象

    函数作用域  

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def first():
        name = 'Wangben'
        def second():
            name = 'Mengtian'
            def third():
                print(name)
            return third
        return second
     
    first()()()    #打印输出Mengtian,每一个()相当于一个函数调用
    """
    运行程序:
      r1 = foo()
      print(r1)
      r2 = foo()()
      print(r2)
      r3 = foo()()()
      print(r3)
    输出结果:
      <function foo.<locals>.bar at 0x0000017F85725AE8>        只返回地址
      <function foo.<locals>.bar.<locals>.tt at 0x0000017F857371E0>
      wopeiqi
      None
    """

    匿名函数:

    复制代码
     1 """ 用 lambda 关键字定义 """
     2 
     3 lambda x:x+1        """x 为函数的形参,x+1 为函数的返回值 """
     4 
     5 """ 相当于"""
     6 def plus(x):
     7     return x+1
    复制代码

     

    复制代码
     1 """ 在没有把lambda赋给其他变量的情况下,其本身不知如何使用"""
     2 """ 因此一般与其他函数结合使用,要使用时要赋给其他变量"""
     3 
     4 name = 'zhizhi'
     5 
     6 func = lambda x:x + '_celebrate'
     7 
     8 print(func(name))
     9 
    10 """得到""   
    11     zhizhi_celebrate
    复制代码
    复制代码
    1 """ 要返回多个值需要加 ()"""
    2 
    3 func = lambda x,y,z :( x+2,y**x,z/2)
    4 
    5 print(func(2,6,8))
    6 
    7 """ 得到 """
    8     (4, 36, 9.0)
    复制代码

    函数式编程,面向过程,面向对象:

      egon09.blog.51cto.com/9161406/1842475  该文章已经被博主隐藏 --_-- 伤心。。。

      以下为原文(看着视频敲出来的,原文作者linhaifeng老师):

      介绍:

        当下主流的编程方法有三种:函数式、面向过程、面向对象,三者相当于编程界的三大门派,每个门派有自己的独门秘籍,都是用来解决问题的。三种流派都是一种编程方法论,只不过是各自的风格不同,在不同的应用场景下也各显优势。

        一、函数式编程:函数式=编程语言定义的函数+数学意义的函数

          通俗来讲,函数式就是用编程语言去实现数学函数。这种函数内对象式永恒不变的,要么参数式函数,要么返回值是函数,没有for和while循环,所有的循环都由递归去实现,无变量的赋值(即不用变量去保存状态),无赋值即不改变。

        PART 1特征:

          1. 不可变数据

          2. 第一类对象

          3. 尾调用优化(尾递归)

        例一:不可变:不用变量保存状态,不修改变量

        

    复制代码
     1 #非函数式
     2 a = 1
     3 def incr_test1():
     4     global a
     5     a +=1
     6     return a 
     7 incr_test1()
     8 print(a)               #---->得到 2
     9 
    10 #函数式
    11 n = 1
    12 def incr_test2(n):
    13     return n+1
    14 
    15 print(incr_test2(2))    #---->得到 3
    16 
    17 print(n)             #---->得到 1
    复制代码

        例二:第一类对象:函数即“变量”

          1.函数名可以当作参数传递

          2.返回值可以是函数名

        高阶函数:

          1.函数接受的参数是一个函数名(把函数当作参数传给另外一个函数)

          2.返回值中包含函数

    复制代码
     1 #把函数当作参数传给另外一个函数
     2 
     3 def foo(n):
     4     print(n)
     5 
     6 def bar(name):
     7     print('my name is %s' %name)
     8 
     9 foo(2)        #----->2
    10 foo(bar)     #-----><function bar at 0x0000018A7F895D90> 返回地址,因为不是运行函数
    11 foo(bar('风云'))    #----> my name is 风云
    复制代码
    复制代码
     1 #返回值中包含函数
     2 
     3 def bar():
     4     print('from')
     5 def foo():
     6     print('from foo')
     7     return bar
     8 n = foo()
     9 n()
    10 
    11 #得到
    12     from foo
    13     from bar
    14 #n()相当于foo()(),即运行了foo函数之后,返回的时bar函数,运行bar函数
    15 
    16 def test1():
    17     print('from test1')
    18 def test2():
    19     print('from handle')
    20     return test1()    #----->直接运行test1,相当于test1()
    21 
    22 
    23 #得到
    24     from handle
    25     from test1
    复制代码

        例三:

          尾调用:在函数的最后一步调用另外一个函数(最后一行不一定是函数的最后一步)

          

    复制代码
    #函数bar在foo内为尾调用
    def bar(n):
        return n
    def foo(x):
        return bar(x)
    """"""
    a = foo(8)
    print(a)    #---->得到 8
    

    #函数bar和bar2在foo内均为尾调用,二者在if判断条件不同的情况下都有可能作为函数的最后一步
    def bar1(n):
    return n

    def bar2(n):
    return n+1
    def foo(x):
    if type(x) is str:
    return bar1(x)
    elif type(x) is int:
    return bar2(x)

    #函数bar在foo内为非尾调用
    def bar(n):
    return n

    def foo(x):
    y
    = bar(x)
    return y

    #函数bar在foo内为非尾调用
    def bar(n):
    return n
    def foo(x):
    return bar(x)+1

    复制代码

    转自:
    Python 学习 --day-16 - UMRzg - 博客园
    http://www.cnblogs.com/qinzheg/articles/9394420.html

  • 相关阅读:
    python之函数名,闭包、迭代器
    python-函数进阶-动态传参,名称空间,作用域的问题
    python之初识函数
    python之文件处理
    重新执笔,已是大三!Jekyll自定义主题开发
    HDU -2674 N!Again(小技巧)
    HDU -2546饭卡(01背包+贪心)
    NYOJ 1091 超大01背包(折半枚举)
    HDU 5144 NPY and shot(三分法)
    printf用法之打印2进制,八进制,十进制,十六进制
  • 原文地址:https://www.cnblogs.com/jyfootprint/p/9468336.html
Copyright © 2011-2022 走看看