python中是没有三目的,一般但是有替代的方法
print('True' if True else 'False')
print(True and 'True' or 'False')
但是这两个关键词并不是必须要联合使用的
print(True and 'True')
这就颠倒实现了类似Ruby中的if用法
puts 'True' if true
这种相当于if的半句用法,在很多场景下可以极大的简化代码
def isPerson(obj):
return obj.__class__ is Person and True
return False
但是,作为逻辑操作符,它的返回值却保留了原本的对象,没有转换成Boolean
print(1 and 5 and 3)
其实多次验证可以发现 and 和 or 的一些特点
1.顺序执行:两种都属于双目运算符,同时,结合规律也是从左到右依次执行的
2. 保留对象:经过这两种符号进行的逻辑判断,并没有转换成布尔值,而是保留了对象原来的属性
3. 条件查找:and查找真值为False的对象时中断查找,or查找到真值为True的对象时中断查找,返回的都是查找结束的前一个对象
4.连接特性:能够将两部分的操作语句连接起来,不用添加多余的修饰
所以我们一般用的类三目运算,可以这样理解
result = a and b or c
1. a的真值为False:and 操作符查找到真值为False的对象直接结束 and 操作,进入or操作,不论c真值如何,c都是连接语句查找的最后对象,必定返回c
2. a的真值为True:and 连接符查找真值为 False 的对象,因此继续查找b
3. b的真值为False:如果是False就会中断查找,进入or操作,or马上查找到真值,中断操作,直接返回b
4. b的真值为True:and未找到真值,进入or操作,不论c的真值如何,最后一个查找到的都是c,必定返回对象c
连接符使用过程中,遵循以上四点规律,从左到右的结合,自身的查找和中断,然后返回的依旧是原本的对象
然后我想起了not
print(not 1)
这个操作会进行对象的强转成布尔类型的操作,并进行反转,这个操作返回的对象必定是布尔值
同样的,if操作也会有这样的隐含功效
if obj:
pass
在判断进行的时候,都会进行对象转换布尔的操作
if 会直接利用了返回布尔值,不改变原来的对象属性,not 只进行变换转换布尔值,本身却不会直接利用,两者转换方式相反
然后我继续考量了 in ,和 可以连用的 for...in 操作
a = print(1) in (print(2),print(3),print(4))
发现在没有进行打印操作的时候,依旧打印出了数字
同样,for...in 也有这个现象
for value in (print(1),print(2),print(3)):
pass
同样的打印了数字,于是我多加了一个步骤
for value in (print(1),print(2),print(3)):
print(value)
这次多打印了三个None
实验证明
1. 在for语句准备执行的时候,元组当中的语句已经执行了
2. 执行for语句时,元组中取出来的的是经过运行后的结果对象
结合之前总结的 and 和 or 的特性,我们可以发现,在真正进入操作的时候,方法传入或是存储的东西,都必定是一个对象
也就是说
1. 在利用and 和 or 操作的时候,我们条件的真值是已经执行过条件判断之后返回的对象
2. 在存入元组当中时,我们的语句也已经得到了执行,存储的是语句执行之后的对象
总结起来,就是说进行操作的必定是对象,不是对象会将语句执行完毕然后获取执行返回值,无返回值返回None
所以:
1. 对象是python程序中的方法执行的开端,也是结束
2. 操作语句只能够存在于过程当中,没成为对象之前,不能够进行传参,返回和存储
在语句没有编译成对象的情况下,唯一能够执行操作的就是方法,或者成为方法对象了
而且操作语句编译也显得繁复,所以这才是方法对象繁荣发张以至于无处不在,功用无线的根本原因吧
注:for和in中间的那个,只能定义成变量,语句定义的话会出错