zoukankan      html  css  js  c++  java
  • python中将函数赋值给变量时需要注意的一些问题

    python中将函数赋值给变量时需要注意的一些问题

    变量赋值是我们在日常开发中经常会遇到的一个问题,本文主要给大家介绍的是关于python将函数赋值给变量时需要注意的一些问题,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:

    见过两种函数赋值给变量的形式,一种是

    a=f

    另一种是    
    a=f()

    这两种形式是有区别的,分别总结一下。

    1.a=f型属于将变量指向函数。

    用代码验证一下:    
    >>> f = abs
    >>> f(-10)
    10

    说明变量f现在已经指向了abs函数本身。直接调用abs()函数和调用变量f()完全相同。这是廖雪峰老师python教程上的例子,现在调用f()和调用abs()是一样的了。

    再举一个工厂函数的例子:    
    def maker(N):
     
      def action(X):
     
        return X**N
     
      return action

    这个嵌套函数的外层返回值为内层函数的函数名,注意没有括号,这里有无括号是有很大区别的。此时调用外部函数:    
    f=maker(2)

    那么如上所述,f便指向了action函数,且限制条件为N=2,可以理解为f为N等于2时的action函数。我们来调用它:    
    >>> f(3)
    9

    证明f和action函数是一样的。

    2.a=f()型属于将f()的返回值赋值给a的过程

    这里的a仅仅接收f()的返回值,如果f()没有返回值,那么a即被赋值为None。这里值得注意的一点是,在a=f()的执行过程中,f()会运行一次,这也是我刚刚搞明白的,如:    
    >>> def add(x,y):
        z=x y
        print(z)
    >>>a=add(3,4)
    7

    这里虽然只有一个赋值语句执行了,但是却输出了结果7,说明赋值过程函数add执行了,然而a的值为None,且只能通过print语句才可以显示。不只是赋值过程函数会执行,写在return语句中也会如此。    
    >>>def log(func):
       def wrapper(*args, **kw):
         print('call %s():' % func.__name__)
         return func(*args, **kw)
       return wrapper
    >>>@log
    >>>def now():
        print('2015-3-25')

    这是廖雪峰老师python教程装饰器一节的例程,刚开始我以为return func(*args,**kw)这个语句是返回了now()函数(即func函数)的返回值,后来发现now函数没有返回值,即为None,所以其实是这个语句在赋值过程,

     func(*args,**kw)执行了,即函数now的print语句执行了。

    下面的习题中,一个变形是要求在函数调用的前后打印出'begin call'和'end call',下面一位网友的程序是这么写的:    
    def wrapper(*args,**kw):
       print(t 'begin call')
       result=func(*args,**kw)
       print(t 'end call')
       return result

    开始不太理解为什么使用result=func(*args,**kw)这句,后来理解后才明白其实赋值本身并没有意义,只是这句话同时使得func函数运行了,所以写成    
    def wrapper(*args,**kw):
       print(t 'begin call')
       func(*args,**kw)
       print(t 'end call')
    结果也是一样的。
    总结
    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助


     

  • 相关阅读:
    Hibernate save, saveOrUpdate, persist, merge, update 区别
    Eclipse下maven使用嵌入式(Embedded)Neo4j创建Hello World项目
    Neo4j批量插入(Batch Insertion)
    嵌入式(Embedded)Neo4j数据库访问方法
    Neo4j 查询已经创建的索引与约束
    Neo4j 两种索引Legacy Index与Schema Index区别
    spring data jpa hibernate jpa 三者之间的关系
    maven web project打包为war包,目录结构的变化
    创建一个maven web project
    Linux下部署solrCloud
  • 原文地址:https://www.cnblogs.com/amengduo/p/9586219.html
Copyright © 2011-2022 走看看