好吧题目非常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。

[Python]计算闰年时候出现的and和or优先级的问题以及短路逻辑的更多相关文章

  1. python中 and 和 or 运算的核心思想 ——— 短路逻辑

    python中 and 和 or 运算的核心思想 --- 短路逻辑 1. 包含一个逻辑运算符 首先从基本的概念着手,python中哪些对象会被当成 False 呢?而哪些又是 True 呢? 在Pyt ...

  2. Python中三目计算符的正确用法及短路逻辑

    今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘. 短路逻辑 Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...

  3. [转载] python 计算字符串长度

    本文转载自: http://www.sharejs.com/codes/python/4843 python 计算字符串长度,一个中文算两个字符,先转换成utf8,然后通过计算utf8的长度和len函 ...

  4. Python计算斗牛游戏的概率

    Python计算斗牛游戏的概率 过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛.在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率). ...

  5. 计算闰年_winform

    新建窗体应用程序(如下),新建控件label1,label2,label3,textBOX1,button1,button2 label1的Text属性改为“计算闰年演示” label2的Text属性 ...

  6. 利用Python计算π的值,并显示进度条

    利用Python计算π的值,并显示进度条  第一步:下载tqdm 第二步;编写代码 from math import * from tqdm import tqdm from time import ...

  7. 用Python计算幂的两种方法,非递归和递归法

    用Python计算幂的两种方法: #coding:utf-8 #计算幂的两种方法.py #1.常规方法利用函数 #不使用递归计算幂的方法 """ def power(x, ...

  8. Python计算分位数

    Python计算分位数    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/gdkyxy2013/article/details/80911514 ...

  9. python 计算校验和

    校验和是经常使用的,这里简单的列了一个针对按字节计算累加和的代码片段.其实,这种累加和的计算,将字节翻译为无符号整数和带符号整数,结果是一样的. 使用python计算校验和时记住做截断就可以了. 这里 ...

随机推荐

  1. Python学习:python网址收集

    Python学习网址收集: 语法学习:http://www.cnblogs.com/hongten/tag/python/             http://www.liaoxuefeng.com ...

  2. socket何时处于”读就绪状态“?---通过“应用程序大爷&quot;和&quot;内核孙子&quot;对话再看重要的select函数的使用方法

    前面. 我已经陆续介绍过select函数的一些零碎知识, 在本文中,我们来讨论这样一个问题:socket何时处于读就绪状态? 事实上主要讨论select函数, 毕竟socket的读就绪状态会导致sel ...

  3. java中Xml、json之间的相互转换

    旁白: 最近关于xml与json之间的转换都搞蒙了,这里写一个demo,以后备用. 正题: project格式是: jar包是一个一个检出来的,还算干净了. 代码: 工具类: package exer ...

  4. 利用jspx解决jsp后缀被限制拿shell

    有些struts2的站在web.xml里面设置url是jsp的格式就自动跳转主页的action,转换jsp后缀大小写还不解析.查了查有Tomcat默认jspx可以解析.看了看jspx的手册,那就好说了 ...

  5. 在EXCEL中如何让一列数字变成文本格式?就是想让单元格的左上角变一个绿绿的?

    如何在EXCEL中如何让一列数字变成文本格式?就是想让单元格的左上角变一个绿绿的? 解决方案:将整列单元格格式设为文本,然后,选中该列,数据--分列--完成 详细步骤: (1)选中1行或者1列,再单击 ...

  6. Building Vim from source(转)

    Compiling Vim from source is actually not that difficult. Here's what you should do: First, install ...

  7. CentOS 6.4 编译安装 gcc 4.8.1(转)

    今天在isocpp上看到“GCC 4.8.1 released, C++11 feature complete”这个消息,非常兴奋.终于有一个全面支持C++11语言特性的编译器了! 当然了,gcc仅仅 ...

  8. 08-hibernate注解-多对多单向外键关联

    多对多单向外键 1,学生和教师构成多对多的关联关系 2,其中一个多方持有另一个多方的集合对象(学生持有教室的集合) 3,通过注解@JoinTable,创建中间表(作为多对多的载体,用来确定学生和教师的 ...

  9. 反射与annotation

    1,可以通过反射取得使用的全部annotation 2,可以通过反射取得指定的annotation. 一个annotation要想变得有意义, 必须结合反射机制取得annotation中设置的全部内容 ...

  10. spring中添加redis缓存

    1.单机版的添加 spring里面配置 <bean id="redisClient" class="redis.clients.jedis.JedisPool&qu ...