• 列表表达式

    [expression for item1 in iterable1 if condition1
                for item2 in iterable2 if condition2
                for item3 in iterable3 if condition3
                ....
                for itemN in iterableN if conditionN
     ]
    
    等价于:
    s = []
    for item1 in iteration1:
        if condition1:
            for item2 in iteration2:
                if condition2:
                    ...
                    for itemN in iterableN:
                        if conditionN:
                            s.append(expression)
    View Code

    生成器表达式

    (expression for item1 in iterable1 if condition1
                for item2 in iterable2 if condition2
                for item3 in iterable3 if condition3
                ....
                for itemN in iterableN if conditionN
     )
    #生成一个生成器对象
    eval和exec类似 执行一个字符串表达式,并返回结果
    他们会在调用者的命名空间执行。他们接受1到2个参数分别用作函数执行的全局和局部命名空间
    如果省略一个或两个命名空间,那么函数就会使用全局或局部空间的当前值。 (如下代码是同时存在的) x
    = 7 y = 10 a = exec('print(x,y)') #7 10 globals={ 'x':1,'y':2} a = exec('print(x,y)',globals) #1 2 globals={ 'x':1,'y':2} locals = {'x':4,'y':5} a = eval('print(x,y)',globals,locals) #4 5

    在给exec()或者是eval()函数传递字符串时,解析器首先会将这个字符串编译为字节码,这个过程非常消耗资源,所以如果代码要反复执行,最好先编译,再执行。

    compile(str,filename,kind)

    str 需要编译的字符串,或者说:需要执行的字符串。

    filename 定义该字符串的文件

    kind 编译代码的类型 single 代表一条语句。exec 代表一组语句。 eval 代表一个表达式

    可以将compile函数返回的代码传递给eval()或者是exec()

    s = 'print("hello")'
    c = compile(s,'','single')
    exec(c)  #hello
    eval(c)   #hello
    
    s = '3*5+4*7'
    c = compile(s,'','eval')
    a = eval(c)
    print(a)  #43
    
    
    s = "for i in range(3):print(i)"
    c = compile(s,'','exec')
    eval(c)  #0 1 2

    抽象基类

    定义抽象基类需要使用abc模块该模块定义了一个元类(ABCMeta)和一组装饰器(

    abstractmethod,abstractproperty,abstractstaticmethod,abstractclassmethod

    要定义抽象类,需要将元类设置为ABCMeta,因为抽象类的实现离不开元类。四个装饰器的作用是指定抽象类的子类必须要实现的方法、属性、静态方法、类方法。

    抽象类不可以实例化,否则会引发 TypeError错误

    from abc import ABCMeta,abstractmethod,abstractproperty,abstractstaticmethod,abstractclassmethod
    class Foo(metaclass = ABCMeta):
        @abstractmethod
        def name(self,x):  #子类必须实现该方法,但是子类参数可以不是 x,
            pass
    
        @abstractproperty 
        def age(self):    #子类必须实现该属性
            pass
    
        
        def sex(self):  #子类不强制实现
            pass
     
    
    
    foo = Foo() #TypeError: Can't instantiate abstract class Foo with abstract methods age, name #实例化抽象类报错
    
    
    class Stup(Foo):
        def cla(self):
            print('cla')

    @property
    def age(self): print('hello')
    def name(self,name1): # 抽象类不会对参数进行一致性检查,抽象类用的是x,子类用的是 name1 print('bye',name1) 子类如果没有实现 age 和name ,那么报错和上面那个错误一样。但是如果 没有实现sex 则没问题 fool = Stup() fool.cla() #'cla' fool.age #'hello' fool.name('liming') #'bye liming' 已有类注册, 已有类注册抽象类不会对已有类进行方法属性等之类的限定。用处只是在进行类型检查(isinstance和issubclass) class Bea: def beat(self): print('bea') Foo.register(Bea) b = Bea() b.beat() #'bea' print(isinstance(b,Foo)) #True print(issubclass(Bea,Foo)) #True

    python 中的and从左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个假值。

    or也是从左到有计算表达式,返回第一个为真的值。
    IDLE 1.2.4
    >>>'a'and'b'
    'b'
    >>>''and'b'
    ''
    >>>'a'or'b'
    'a'
    >>>''or'b'
    'b'
    类似三目表达式的用法:bool? a : b
    >>> a ='first'
    >>> b ='second'
    >>>1and a or b # 等价于 bool = true时的情况
    'first'
    >>>0and a or b # 等价于 bool = false时的情况
    'second'
    >>> a =''
    >>>1and a or b # a为假时,则出现问题
    'second'
    >>>(1and[a]or[b])[0]# 安全用法,因为[a]不可能为假,至少有一个元素
    ''
    >>>
  • 相关阅读:
    20145109 《Java实验报告1》
    20145109 《Java程序设计》第五周学习总结
    20145109 《Java程序设计》第四周学习总结
    20145109 《Java程序设计》第三周学习总结
    20145109《Java程序设计》第二周学习总结
    20165322 第十周课下补做
    20165322 实验三 敏捷开发与XP实践
    20165322 第九周学习总结
    20165322 第二周结队编程-四则运算
    20165322 第八周学习总结
  • 原文地址:https://www.cnblogs.com/jijizhazha/p/5866384.html
Copyright © 2020-2023  润新知