列表表达式

[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]不可能为假,至少有一个元素
''
>>>
原文地址:https://www.cnblogs.com/jijizhazha/p/5866384.html