www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

0中的高端运算符有哪些,python怎么着让类帮忙比

2019-06-01 12:34 来源:未知

本文实例为大家分享了python类支持比较运算的具体代码,供大家参考,具体内容如下

python如何让类支持比较运算,python比较运算

本文实例为大家分享了python类支持比较运算的具体代码,供大家参考,具体内容如下

案例:

  有时我们希望自定义的类,实例间可以使用比较运算符进行比较,我们自定义比较的行为。

  需求:

    有一个矩形的类,我们希望比较两个矩形的实例时,比较的是他们的面积

如何解决这个问题?

在类中重新定义比较运算符,所有的比较运算可以简化为两个基本的比较运算,小于和等于比较

单个类比较

#!/usr/bin/python3

from math import pi


class Circle(object):
  def __init__(self, radius):
    self.radius = radius

  def get_area(self):
    return round(pow(self.radius, 2) * pi, 2)

  # 重定义小于比较
  def __lt__(self, other):
    return self.get_area() < other.get_area()

  # 重定义等于比较
  def __eq__(self, other):
    return self.get_area() == other.get_area()

if __name__ == '__main__':
  c1 = Circle(3.0)
  c2 = Circle(5.0)

  print(c1 < c2)   # c1.__le__(c2)
  print(c1 == c2)   # c1.__eq__(c2)  

两个类比较

#!/usr/bin/python3

from math import pi


class Circle(object):
  def __init__(self, radius):
    self.radius = radius

  def get_area(self):
    return round(pow(self.radius, 2) * pi, 2)

  # 重定义小于比较
  def __lt__(self, other):
    return self.get_area() < other.get_area()

  # 重定义等于比较
  def __eq__(self, other):
    return self.get_area() == other.get_area()

if __name__ == '__main__':
  c1 = Circle(3.0)
  c2 = Circle(5.0)

  print(c1 < c2)   # c1.__le__(c2)
  print(c1 == c2)   # c1.__eq__(c2)


# !/usr/bin/python3

from math import pi


class Circle(object):
  def __init__(self, radius):
    self.radius = radius

  def get_area(self):
    return round(pow(self.radius, 2) * pi, 2)

  # 重定义小于比较
  def __lt__(self, other):
    return self.get_area() < other.get_area()

  # 重定义等于比较
  def __eq__(self, other):
    return self.get_area() == other.get_area()


class Rectangle(object):
  def __init__(self, width, height):
    self.width = width
    self.height = height

  def get_area(self):
    return self.width * self.height

  # 重定义小于比较
  def __lt__(self, other):
    return self.get_area() < other.get_area()

  # 重定义等于比较
  def __eq__(self, other):
    return self.get_area() == other.get_area()


if __name__ == '__main__':
  c1 = Circle(5.0)
  R1 = Rectangle(4.0, 5.0)

  print(c1 > R1) # c1.__le__(c2)
  print(c1 == R1) # c1.__eq__(c2) 

会出现一个问题,重复代码,如何解决?

通过functools下类的装饰器total_ordering进行比较

# !/usr/bin/python3

from math import pi
from abc import abstractmethod
from functools import total_ordering


@total_ordering
class Shape(object):
  """
  定义一个抽象类,重定义比较运算,再定义抽象方法,然后子类通过这个方法进行比较,
  其他子类比较类都需要重构抽象方法,实现比较运算
  """

  # 标记比较方法,抽象方法
  @abstractmethod
  def get_area(self):
    pass

  # 重定义小于比较
  def __lt__(self, other):
    return self.get_area() < other.get_area()

  # 重定义等于比较
  def __eq__(self, other):
    return self.get_area() == other.get_area()


class Circle(Shape):
  def __init__(self, radius):
    self.radius = radius

  def get_area(self):
    return round(pow(self.radius, 2) * pi, 2)


class Rectangle(Shape):
  def __init__(self, width, height):
    self.width = width
    self.height = height

  def get_area(self):
    return self.width * self.height


if __name__ == '__main__':
  c1 = Circle(5.0)
  R1 = Rectangle(4.0, 5.0)

  print(c1 > R1) # c1.__le__(c2)
  print(c1 == R1) # c1.__eq__(c2)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持帮客之家。

本文实例为大家分享了python类支持比较运算的具体代码,供大家参考,具体内容如下 案例: 有...

之前在学习ios开发的过程中,虽然对高级运算符也有了解,但是了解的都不够深入,今天在网上看到一篇文章对swift高级运算符的介绍,感觉很有用,分享出来,大家一起学习~~~

案例:

1、Swift中的位运算

  有时我们希望自定义的类,实例间可以使用比较运算符进行比较,我们自定义比较的行为。

在很多编程语言中都有位运算,位运算应用得当可以提高算法的效率,在此就不做过多的讨论了。下面我们一起来看看Swift中的按位与,按位或,按位异或以及按位取反等操作。

  需求:

(1)按位与(&)

    有一个矩形的类,我们希望比较两个矩形的实例时,比较的是他们的面积

对二进制中的每一位进行与操作,所以叫按位与。运算规则为1 & 1 = 1,1 & 0 = 0,0 & 1 = 0,0 & 0 = 0。按位与简单的用法就是保留二进制中的指定位数,或者对数值进行清零操作。下方是按位与操作的小实例:0000_1111与1000_1011进行按位与运算,就是保留1000_1011的后四位。如果要对指定的二进制数进行清零的话,只需要把该值和0000_0000进行按位与操作即可。

如何解决这个问题?

图片 1

在类中重新定义比较运算符,所有的比较运算可以简化为两个基本的比较运算,小于和等于比较

下方是上述代码中按位与的原理图:

单个类比较

图片 2

#!/usr/bin/python3

from math import pi


class Circle(object):
  def __init__(self, radius):
    self.radius = radius

  def get_area(self):
    return round(pow(self.radius, 2) * pi, 2)

  # 重定义小于比较
  def __lt__(self, other):
    return self.get_area() < other.get_area()

  # 重定义等于比较
  def __eq__(self, other):
    return self.get_area() == other.get_area()

if __name__ == '__main__':
  c1 = Circle(3.0)
  c2 = Circle(5.0)

  print(c1 < c2)   # c1.__le__(c2)
  print(c1 == c2)   # c1.__eq__(c2)  

(2)按位或(|)

两个类比较

按位或是对二进制中的每一位进行或操作,所以叫按位或。运算规则为1 | 1 = 1,1 | 0 = 1,0 | 1 = 1,0 | 0 = 0。按位或常用来把指定位置的数值置为1。下方实例是要把0000_0011的前四位置为1,后四位不变,所以要与1111_0000进行按位或操作。

#!/usr/bin/python3

from math import pi


class Circle(object):
  def __init__(self, radius):
    self.radius = radius

  def get_area(self):
    return round(pow(self.radius, 2) * pi, 2)

  # 重定义小于比较
  def __lt__(self, other):
    return self.get_area() < other.get_area()

  # 重定义等于比较
  def __eq__(self, other):
    return self.get_area() == other.get_area()

if __name__ == '__main__':
  c1 = Circle(3.0)
  c2 = Circle(5.0)

  print(c1 < c2)   # c1.__le__(c2)
  print(c1 == c2)   # c1.__eq__(c2)


# !/usr/bin/python3

from math import pi


class Circle(object):
  def __init__(self, radius):
    self.radius = radius

  def get_area(self):
    return round(pow(self.radius, 2) * pi, 2)

  # 重定义小于比较
  def __lt__(self, other):
    return self.get_area() < other.get_area()

  # 重定义等于比较
  def __eq__(self, other):
    return self.get_area() == other.get_area()


class Rectangle(object):
  def __init__(self, width, height):
    self.width = width
    self.height = height

  def get_area(self):
    return self.width * self.height

  # 重定义小于比较
  def __lt__(self, other):
    return self.get_area() < other.get_area()

  # 重定义等于比较
  def __eq__(self, other):
    return self.get_area() == other.get_area()


if __name__ == '__main__':
  c1 = Circle(5.0)
  R1 = Rectangle(4.0, 5.0)

  print(c1 > R1) # c1.__le__(c2)
  print(c1 == R1) # c1.__eq__(c2) 

图片 3

会出现一个问题,重复代码,如何解决?

按位或操作的原理图如下:

通过functools下类的装饰器total_ordering进行比较

图片 4

# !/usr/bin/python3

from math import pi
from abc import abstractmethod
from functools import total_ordering


@total_ordering
class Shape(object):
  """
  定义一个抽象类,重定义比较运算,再定义抽象方法,然后子类通过这个方法进行比较,
  其他子类比较类都需要重构抽象方法,实现比较运算
  """

  # 标记比较方法,抽象方法
  @abstractmethod
  def get_area(self):
    pass

  # 重定义小于比较
  def __lt__(self, other):
    return self.get_area() < other.get_area()

  # 重定义等于比较
  def __eq__(self, other):
    return self.get_area() == other.get_area()


class Circle(Shape):
  def __init__(self, radius):
    self.radius = radius

  def get_area(self):
    return round(pow(self.radius, 2) * pi, 2)


class Rectangle(Shape):
  def __init__(self, width, height):
    self.width = width
    self.height = height

  def get_area(self):
    return self.width * self.height


if __name__ == '__main__':
  c1 = Circle(5.0)
  R1 = Rectangle(4.0, 5.0)

  print(c1 > R1) # c1.__le__(c2)
  print(c1 == R1) # c1.__eq__(c2)

(3)按位异或(^)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

异或的运算法则也是比较容易理解的,简单一句话就是相同为0,不同为1。1 ^ 1 = 0,1 ^ 0 = 1,0 ^ 1 = 1,0 ^ 0 = 0。有异或的运算规则我们容易得出0异或任何一个数,还等于这个数的本身。1异或任何一个数等于这个数取反。下方是一个实例:

您可能感兴趣的文章:

  • Python入门学习之字符串与比较运算符
  • 实例说明Python中比较运算符的使用

图片 5

上面代码的原理图如下:

图片 6

异或的用法是比较多的,我们可以使用异或运算在不创建临时变量时来交换两个数的值。具体如下:

图片 7

我们还可以使用异或运算来判断两个值是否相等,如果两个数异或后的值为0,那么两个数就相等,具体代码如下所示:

if swap1 ^ swap2== 0 {

print("swap1 == swap2")

}

(4)按位取反(~)

一个数值与1进行异或,都会得到其相反的值,也就是取反。我们还可以通过按位取反运算符来对值进行取反,取反的规则就比较简单了,就是0变成1,1变成0。下方是取反运算的实例,在Playground中可以看出其取反后的值。按位取反的实例如下(下面只讨论的正数的取反,关于负数的取反没有):

图片 8

(5)按位左移(<<)和按位右移(>>)操作

正数的左右位移用0来填补空位,而负数左移用0来填补,右移用符号位来填补。实例如下:

图片 9

2.溢出运算符

在Swift语言中,如果值溢出,是会报错的。这也能反映出Swift安全性,如果你想在值溢出时对有效位进行截断的话,那么你就可以使用溢出运算符。

值上溢出运算符(& ),关于值上溢运算符,就不说多少废话了,直接上实例。在Playground中取出UInt8类型的上限,然后对其加1,让其溢出。如果你直接使用 号的话,会给出一个错误。使用& 就不一样了,效果如下。值的下溢运算符(&-, &*)的用法和& 类似,在此就不做赘述了。(&/与&%)在Xcode7中未编译通过,提示找不到此标示符。

图片 10

3.运算符重载

在Swift2.0中运算符重载是比较容易实现的,就是把函数名换成你要重载的运算符即可。下方就通过一个小实例来看一下Swift中的运算符重载。在Swift中是 号运算符是不支持元组直接相加的,如果你直接对元组进行加法操作,会报下面的错误。

图片 11

(1)对中缀运算符重载,如果对 运算符进行重载,那么 运算符将会支持元组相加,具体代码和运行结果如下所示, 运算符原来的功能还是不变的。

图片 12

(2)对前缀运算符进行重载,就以-运算符为例。对前缀运算符重载在func前面要加上prefix修饰符。如果要对后缀运算符进行重载的话,要使用postfix进行修饰,下方是对-进行前缀运算符重载。具体代码如下:

//前缀运算符重载

struct Point {

var x = 0.0, y = 0.0

}

prefix func -(point: Point) -> Point {

return Point(x: -point.x, y: -point.y)

}

let positive =Point(x: 3.0, y: 4.0)

let negative =-positive

结果输出如下:

图片 13

(3)自定义运算符:在Swift中支持定义属于你自己的运算符,在定义运算符时,先使用operator声明一下所指定的标示符,并且指定一下是前缀还是后缀等,具体的就看下面的代码即可:

//自定义运算符

//1、先声明自定义的运算符

prefix operator {}

//2.进行实现

prefix func (point:Point) -> Point{

return Point(x:point.x 1, y:point.y 1);

}

let aaa =Point(x: 1.0, y:2.0);

let add = aaa;

print(add)// Point(x: 2.0, y: 3.0)

以上就是swift语言中,高级运算符的相关用法及操作,希望对大家有帮助吧~~

相关文章:《Swift语言如何获取类型的大小?》

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于计算机编程,转载请注明出处:0中的高端运算符有哪些,python怎么着让类帮忙比