[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。

时间: 2024-10-05 06:00:43

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

Python计算斐波那契数列

利用Python计算第一个达到一百万位数的斐波那契数列各位数之和 结果为4501552 以下是我用到的代码,不是中间需要一些人工操作来加快收敛性,有兴趣读者可以写代码加快收敛 首先执行这个,可以大致确定一百万个数所在斐波那契序列的位置 i=1 j=1 k=i+j count=3 while count<4850000: i=j j=k k=i+j count+=1 result=str(k) print('k长度') k_len=len(result) print(k_len) sum=0 fo

数学之路-python计算实战(18)-机器视觉-滤波去噪(双边滤波与高斯滤波 )

高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到.高斯滤波的具体操作是:用一个模板(或称卷积.掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值. #滤波去噪 lbimg=cv2.GaussianBlur(newimg,(3,3),1.8) cv2.imshow('src',newimg) cv2.imshow('dst',lbimg) cv2.waitKey() cv2.destroyAllW

数学之路-python计算实战(16)-机器视觉-滤波去噪(邻域平均法滤波)

# -*- coding: utf-8 -*- #code:[email protected] #邻域平均法滤波,半径为2 import cv2 import numpy as np fn="test3.jpg" myimg=cv2.imread(fn) img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY) #加上椒盐噪声 param=20 #灰阶范围 w=img.shape[1] h=img.shape[0] newimg=np.array(img)

python计算均值方差

用Python求均值与方差,可以自己写,也可以借助于numpy,不过到底哪个快一点呢? 我做了个实验,首先生成9百万个样本: ? 1 2 3 nlist=range(0,9000000) nlist=[float(i)/1000000 for i in nlist] N=len(nlist) 第二行是为了让样本小一点,否则从1加到9百万会溢出的. 自己实现,遍历数组来求均值方差: ? 1 2 3 4 5 6 7 sum1=0.0 sum2=0.0 for i in range(N):     s

python计算auc指标

本文和大家分享的主要是python计算auc指标相关内容,一起来看看吧,希望对大家学习python有所帮助. 1.安装scikit-learn 1.1Scikit-learn 依赖 · Python (>= 2.6 or >= 3.3), · NumPy (>= 1.6.1), · SciPy (>= 0.9). 分别查看上述三个依赖的版本, python -V        结果:Python 2.7.3 python -c 'import scipy; print scipy.

计算闰年_winform

新建窗体应用程序(如下),新建控件label1,label2,label3,textBOX1,button1,button2 label1的Text属性改为“计算闰年演示” label2的Text属性改为“输入年份” button1的Text属性改为“确定” button1的Text属性改为“退出” 完整代码: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using Sy

python 计算校验和

校验和是经常使用的,这里简单的列了一个针对按字节计算累加和的代码片段.其实,这种累加和的计算,将字节翻译为无符号整数和带符号整数,结果是一样的. 使用python计算校验和时记住做截断就可以了. 这里仅仅是作为一个代码样本,权作标记,直接上代码 ''' Created on 2014年9月4日 @author: lenovo ''' import random ''' 实际计算校验和时,解释为无符号整数还是带符号整数,结果必然是一样的.因为基于补码方式存储,计算加法时都是按位加,然后该进位的就进

数学之路-python计算实战(21)-机器视觉-拉普拉斯线性滤波

拉普拉斯线性滤波,.边缘检测   Laplacian Calculates the Laplacian of an image. C++: void Laplacian(InputArray src, OutputArray dst, int ddepth, int ksize=1, double scale=1, double delta=0, int borderType=BORDER_DEFAULT ) Python: cv2.Laplacian(src, ddepth[, dst[, k

数学之路-python计算实战(22)-机器视觉-sobel非线性滤波

sobel非线性滤波,采用梯度模的近似方式 Sobel Calculates the first, second, third, or mixed image derivatives using an extended Sobel operator. C++: void Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, intksize=3, double scale=1, double delta=0, int