• devi into python 笔记(三)callable getattr lambda表达式


    常用的函数:
    callable():如果所给参数是可调用的,返回True 不可调用返回Fasle。这里指的是否能调用说的是方法、类方法等有doc string的东西,一个单纯的字符串等就不算了。

    import string
    
    #之前用过的join方法
    #punctuation给出了可用的标点符号,他实际上就是一个字符串,里面给出了有效可用的标点符号。
    print string.punctuation
    print callable(string.join), callable(string.punctuation)

    getattr():比较另类也很强大的一个函数,返回的是一个函数的引用

    l = [1, 2, 3]
    #返回引用
    print getattr(l, 'pop') == l.pop
    #加上括号就可以当作函数用了,另外pop()是删除list的最后一个元素然后将这个元素返回。
    print getattr(l, 'pop')() == l.pop()
    
    #或者是getattr(模块名,'方法名/属性名'),这样也可以
    
    #根据getattr的特点,他很适合做分发器
    #根据传入的方法名不同调用不同函数,执行不同工作。
    #如果传入的方法名不合法,可以这样做
    getattr(model, 'somefunction', model.default_function)
    #这样做的意思是:如果model中没有somefunc方法的话,就调用model.default_func

    =======================
    and  or:返回的不是具体True或False,而是返回运算的值。思路是:返回能决定运算结果的那个值。比如 1 or 2 ,1已经决定了运算结果是真,所以直接返回1。

    #先看and
    print 1 and 2#单单看1的话不能确定运算结果,具体要看第二个值的真假,所以这次结果应该返回2
    
    print 0 and 2#这里看到0,那结果肯定是False,所以直接返回能决定结果的那个值,也就是0
    
    #or和and技巧一样的
    print 1 or 2#看到了1,那就确定了结果肯定是True,所以不用看第二个值直接返回1
    
    print 0 or 2#这里看到的是0,但是不能确定最终结果是真假,所以是第二个值决定了最终结果,所以返回2

    记得C一类语言的三元运算符么:bool?a:b,python虽然没有三元运算符,但是可以根据and or的返回值特点这样做:

    #格式:(bool and [a] or [b])[0]
    a = 'this is a'
    b = 'this is b'
    
    #你会发现当bool为真时打印出的是a,反之则打印b,这跟c的三元运算符是一个效果
    print (1 and [a] or [b])[0]
    print (0 and [a] or [b])[0]
    
    """
    首先我们根据我们的需要(模拟一个三元运算符),我们知道:
    整个表达式的结果,应该取决于前面的bool值的真假,而跟a b的真假无关
    所以这里要把a和b的真假屏蔽起来,都处理成list,使[a]、[b]永远是真
    这样一来再根据上面说的and or 规则就可以模拟一个三元运算符了
    但是返回的是[a]或[b],所以最后加上一个数值索引[0],返回的就是a b了
    """

    =============================

    lambda:生成函数的简便写法,返回值是函数的引用(类似getattr()),值永远是真。

    #格式:lambda input : output
    def func(a):
        return a + 1
    
    print func(1)
    
    #用lambda表达式实现
    func2 = lambda a : a + 1
    
    print func2(1)
    
    #因为lambda返回的是函数的引用,所以你甚至可以这样写:
    print (lambda a : a + 1)(1)
  • 相关阅读:
    腾讯QQ家族任意支付QB+修改资料csrf
    腾讯QQ积分CSRF导致积分任意挥霍(我的积分为什么少了)
    腾讯大湘网某处csrf(city.hn.qq.com)可投诉刷留言
    路由器下再连接一台路由器
    PHP安全之临时文件的安全
    通过NAT转发实现私网对外发布信息
    asp adodb.stream读取文件和写文件
    解决:ADODB.Stream 错误 '800a0bbc' 写入文件失败
    笑话一则
    spring-boot-2.0.3源码篇
  • 原文地址:https://www.cnblogs.com/lipijin/p/3163778.html
Copyright © 2020-2023  润新知