• [Python]计算闰年时候出现的and和or优先级的问题以及短路逻辑


    好吧题目非常easy。可是有些细节还是挺有意思的。


    题目是:计算今年是否是闰年,推断闰年条件,满足年份模400为0,或者模4为0可是模100不为0


    答案是这种:

    import time
    
    #计算今年是否是闰年,推断闰年条件,满足年份模400为0。或者模4为0可是模100不为0
    
    
    thisyear = time.localtime()[0] #获取年份
    
    if thisyear%400==0 or thisyear%4==0 and thisyear%100<>0:
    	print 'this year is a leap year'
    else:
    	print 'this yeat is not a leap year'

    非常easy的源代码。在此来记录当中的一些细节。


    先回想一下Python中的数组,Python的数组分三种类型:
    (1) list 普通的链表,初始化后能够通过特定方法动态添加元素。
    定义方式:arr = [元素]

    (2) Tuple 固定的数组,一旦定义后,其元素个数是不能再改变的。
    定义方式:arr = (元素)

    (2) Dictionary 词典类型。 即是Hash数组。


    定义方式:arr = {元素k:v}


    接下来看看源代码。


    首先是time模块。localtime()返回的是一个tuple,也就是一个固定大小的数组,数组里是当前时间的一些数据 :

    localtime([seconds]) -> (tm_year,tm_mon,tm_day,tm_hour,tm_min,tm_sec,tm_wday,tm_yday,tm_isdst)


    然后是if推断里面的 or 和 and 。

    Python的逻辑运算符里没有“!(非),&&(与),||(或)“。

    这三个表示符号(全然是英文上的表示)。即 not,and,or。


    可是看源代码。推断是否闰年应该是:

    1.假设被400整除那就是闰年

    2.假设能被4整除且不能被100整除


    那if推断不应该是:

    if thisyear%400==0 or (thisyear%4==0 and thisyear%100<>0):

    这种吗?


    实际上确实是这种,可是在Python中,and的优先级要高于or。


    我们能够来看一个小样例:

    >>> if 1 or 1 and not 1:
    ...     print 'OK'
    ...
    OK

    假设优先级相等应该是不会输出。事实上上面的推断相当于:

    if 1 or (1 and not 1):
    也就是说,

    True or True and not True  仅仅表示  (True) or (True and False)



    讲到这里能够再看一个有意思的东西。来看看Python里面的短路机制:

    def a():
        print 'this is A!'
        return 1
    
    def b():
        print 'this is B!'
        return 1
    
    def c():
        print 'this is C!'
        return 1
    
    if a() or b() and not c():
        print 'OK!'

    假设说and的优先级要高于or。那么岂不是应该先B再C再A,怎么直接就输出了A呢?


    事实上在其它语言中也有这种情况,仅仅是当时没有在意,这是布尔运算符的一个有趣的特性。


    布尔运算符有个有趣的特性:仅仅有在须要求值时才进行求值。

    举例来说,表达式x and y须要两个变量都为真时才为真。

    所以假设x为假,表达式就会立马返回false,而无论y的值(事实上各个语言都有这个特性)。

    实际上,假设x为假。表达式会返回x得值----否则它就返回y的值。

    这种行为被称为短路逻辑(short-circuit logic)或惰性求值(lazy evaluaion):

    布尔运算符通常被称为逻辑运算符。就像你看到的那样第2个值有时“被短路了”。

    这种行为对于or来说也相同适用。

    在表达式x or y中。x为真时,它直接返回x的值,否则返回y值。

    注意。这意味着在布尔运算符之后的全部代码都不会运行。



    再看看刚刚的那个样例。and优先级高。表明最靠近它两边的表达式是与的关系,这种组合是优先的。

    非常明显。遇到第一个True,就不是必需再计算or后面的东西了,结果已经是True了。



    在Python中运用and 和 or能够实现三元运算。比方在JS中的一个函数:

    function trans(v) {  
        return (v==0)?1:v;  
    } 

    在Python中能够有下面两种替换方案:

    def trans(v):  
            return 1 if v==0 else v 

    或者:

    def trans(v):  
            return v==0 and 1 or v  

    解释一下:

    假设v等于0,则跟1做与运算。为true,则不进行后面的或运算,直接返回1。

    假设v等于0为false,则跟1做与运算。为false,继续进行或运算。返回v。




  • 相关阅读:
    软件性能测试
    我为何转来博客园
    【5】查询练习:DISTINCT、Between...and...、in、order by、count
    第5章:pandas入门【3】汇总和计算描述
    【4】建点表,填点数
    【3】数据库三大设计范式
    【2】约束
    【1】基本操作
    第5章:pandas入门【2】基本功能
    第5章:pandas入门【1】Series与DataFrame
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6752796.html
Copyright © 2020-2023  润新知