学习线性代数的时候,想要可视化,但是仅仅是三维坐标系,我都感觉到手画图很不直观。所以这次的python学习,一方面是把之前没学完的学完,另一方面,也是想了解下图形绘制的技术。以下内容和6.00笔记10是重复的,但和之前记录的侧重点不同,这个笔记更加完整(熟练)。

>>> import math

>>> def addPoints(p1,p2):

r = []

r.append(p1[0]+p2[0])

r.append(p1[1]+p2[1])

return r

>>> p = [1,2]

>>> q = [3,1]

>>> r = addPoints(p,q)

>>> print (r)

[4, 3]

这个知识点之前在听课的时候似乎没有记录,但这个实际上可以视为一个向量加法。但这里有一个问题,就是坐标的表示有两种方法,一个是笛卡尔坐标系,就是普通的直角坐标系;另一种是极坐标,那么如何区分这里的两个点的表达是笛卡尔坐标还是极坐标呢?而且,如果是极坐标的形式的话,也就不能用上面这种addPoints方法。

应对这个问题,就需要用class来整合对象和方法,笛卡尔坐标下有对应的向量相加方法,极坐标有它自己的方法。

>>> class cartesianPoint:

pass

>>> cp1 = cartesianPoint()

>>> cp2 = cartesianPoint()

>>> cp1

cp1 and cp2 are both instances of this type.

>>> cp1.x = 1.0

>>> cp1.y = 2.0

>>> cp2.x = 1.0

>>> cp2.y = 2.0

>>> cp1.x

1.0

cp1 points to an instance, and I have now given an internal variable name

and a value.

以下是判断两个坐标是否重合:

>>> def samePoint(p1,p2):

return (p1.x == p2.x) and (p1.y == p2.y)

>>> samePoint(cp1,cp2)

True

但是不能用python内置比较器结果是这样的:

>>> 4 is 4

True

>>> cp1 is cp2

False

这个称为shallow equality(也称为object equality), 它测试的是:Do these things point to exactly the same spot in memory, the same instance. 前面的称为deep equality(也称为value equality),这个是我们可以自己定义的。

同样的思路可以应用于极坐标。

>>> class polarPoint():

pass

>>> pp1 = polarPoint()

>>> pp2 = polarPoint()

>>> pp1.radius = 1.0

>>> pp1.angle = 0

>>> pp2.radius = 2.0

>>> pp2.angle = math.pi / 4.0

但如果用samePoint()方法来判断极坐标,会出现错误:

>>> samePoint(pp1,pp2)

Traceback (most recent call last):

File "", line 1, in

samePoint(pp1,pp2)

File "", line 2, in samePoint

return (p1.x == p2.x) and (p1.y == p2.y)

AttributeError: 'polarPoint' object has no attribute 'x'

也就是说,虽然坐标的表现形式有极坐标和笛卡尔坐标两种,但本质上都是相同的,不同的只是表现形式。但如果要判定两种坐标是否重合时,竟然要需要两个method来判定。这不科学。而class还可以进一步整合。

class cPoint:

def __init__(self, x, y):

self.x = x

self.y = y

self.radius = math.sqrt(self.x * self.x + self.y * self.y)

self.angle = math.atan2(self.y, self.x)

def cartesian(self):

return (self.x, self.y)

def polar(self):

return (self.radius, self.angle)

def __str__(self):

return '[' + str(self.x) + ',' + str(self.y) + ']'

def __cmp__(self,other):

return (self.x > other.x) and (self.y > other.y)

注意,在cPoint类里面,极坐标是从笛卡尔坐标转化来的。

>>> p = cPoint(1.0, 2.0)

>>> p.x

1.0

>>> p.cartesian()

(1.0, 2.0)

尽管我们可以通过

命令直接获取数值,但是这个方法会让数据“exposed”,数据暴露的问题在于,你不仅可以直接获取数据,也可以修改数据,比如:

>>> p.x = 'foobo'

>>> p.x

'foobo'

为了防止这种情况,需要data hiding。所谓data hiding,就是:One can only access instance values through defined methods. 但python没有提供这种获取数据的限制,因此需要自我约束。以下是另一种“放飞”及后果:

>>> p = cPoint(1.0, 2.0)

>>> p.polar()

(2.23606797749979, 1.1071487177940904)

>>> p.radius = 5.0

>>> p.polar()

(5.0, 1.1071487177940904)

>>> p.cartesian()

(1.0, 2.0)

对__str__的说明:

>>> p

>>> print (p)

[1.0,2.0]

如果把cPoint类中的__str__删除:

>>> class cPoint:

def __init__(self, x, y): # create instances

self.x = x

self.y = y

self.radius = math.sqrt(self.x * self.x + self.y * self.y)

self.angle = math.atan2(self.y, self.x)

def cartesian(self):

return (self.x, self.y)

def polar(self):

return (self.radius, self.angle)

def __cmp__(self,other):

return (self.x > other.x) and (self.y > other.y)

>>> p = cPoint(1.0, 2.0)

>>> print (p)

显然,如果你要打印实例时,python首先自动搜寻__str__方法,如果有,调用该方法。

最后注意如何调用__cmp__方法,首先是错误的:

>>> p.__cmp__(p,q)

Traceback (most recent call last):

File "", line 1, in

p.__cmp__(p,q)

TypeError: __cmp__() takes 2 positional arguments but 3 were given

正确的:

>>> p.__cmp__(q)

False

还有公开课可以但我的python 3不可以的方法:

>>> p>q

Traceback (most recent call last):

File "", line 1, in

p>q

TypeError: '>' not supported between instances of 'cPoint' and 'cPoint'

判定两个坐标是否重合,需要用__eq__方法。关于这些比较方法,在6.00笔记11中有说明。

线段:

>>> class Segment:

def __init__(self, start,end):

self.start = start

self.end = end

def length(self):

return math.sqrt( ((self.start.x - self.end.x) *

(self.start.x - self.end.x)) +

((self.start.y - self.end.y) *

(self.start.y - self.end.y)) )

要注意的是,start, end are actually points。也就是说,在这个Segment类中,its elements are themselves instances of cPoint.

>>> p1 = cPoint(3.0, 4.0)

>>> p2 = cPoint(5.0, 7.0)

>>> s = Segment(p1, p2)

>>> print (s.length())

3.605551275463989

但是这个代码存在一个问题,就是直接读取数据,而不是通过method获取数据。这种data exposing的问题在于,当你的代码数量庞大的时候,有的时候修改会很麻烦。而通过method访问数据的话,那么需要调整的代码量就会少很多,而且明确。关于这点,老师一直在强调“模块化”这个概念。

另外,就这节课内容而言,还有一个封装的概念。我们首先把“点”对应的笛卡尔坐标和极坐标还有相应的方法封装在cPoint里面。在这个基础上,我们可以建立”线段“。之后我们还可以继续延伸,比如建造多边形等。

python数值比较器_python笔记16(数据处理笔记1)相关推荐

  1. python数值类型_Python数值类型

    python数值类型 In programming, Data Types are an essential concept. Data of various types can be stored ...

  2. python编程语言继承_python应用:学习笔记(Python继承)

    学习笔记(Python继承)Python是一种解释型脚本语言,可以应用于以下领域: web 和 Internet开发 科学计算和统计 人工智能 教育 桌面界面开发 后端开发 网络爬虫 有几种叫法(父类 ...

  3. python dict方法_python dict()方法学习笔记

    学习PYTHON 的dict()方法笔记. dict() -> new empty dictionary | dict(mapping) -> new dictionary initial ...

  4. python xlwings 切片_Python xlwings库学习笔记(1)

    Python xlwings库学习笔记(1) Python是最近几年很火的编程语言,被办公自动化的宣传吸引入坑,办公自动化必然绕不开Excel的操作,能操作Excel的库有很多,例如: xlrd xl ...

  5. python异常处理优点_python各类异常处理学习笔记

    print("============异常与工具===================") print("============一.异常基础============== ...

  6. python socket服务器_python网络编程学习笔记(三):socket网络服务器

    1.TCP连接的建立方法 客户端在建立一个TCP连接时一般需要两步,而服务器的这个过程需要四步,具体见下面的比较.步骤 TCP客户端 TCP服务器 第一步 建立socket对象 建立socket对象 ...

  7. python单词词典_Python自然语言处理学习笔记(42):5.3 使用Python字典将单词映射到属性...

    5.3  Mapping Words to Properties Using Python Dictionaries 使用Python字典将单词映射到属性 As we have seen, a tag ...

  8. python怎样控制继电器_Python与硬件学习笔记:继电器的使用

    (整理我在美诚创新中心教授Python与继电器相连接的资料,连接线路和程序都实验成功,大家可以自己学习调试,有啥不懂的可以互相探讨.) 继电器是一种电控制器件.它具有控制系统(又称输入回路)和被控制系 ...

  9. python网络开发框架_python网络编程学习笔记(10):webpy框架

    django和webpy都是python的web开发框架.Django的主要目的是简便.快速的开发数据库驱动的网站.它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架 ...

最新文章

  1. python编程员工资-Python 程序员的工资能有多高?
  2. 基于FFmpeg-4.0 SDK的PCM编码成AAC
  3. 自动切换电脑或手机版(php aspx),ASP程序自动判断是电脑或手机访问网站。
  4. 基于drools_Drools:基于PHREAK堆栈的评估和向后链接
  5. java 判断范围_java判断一个点是否在一个围栏范围内
  6. Java进阶:SpringMVC中放行静态资源
  7. python 列表切片学习
  8. Hello can not find git path
  9. matlab实现2dpsk调制与解调,(完整版)matlab设计2DPSK信号调制与解调
  10. c语言中stdio什么意思6,求助,return,stdio是什么意思,在C语言中又是什么意思
  11. 一篇文章总结Java虚拟机内存区域模型
  12. yoloV4mosaic数据增强,同步Pascal VOC格式的XML标注信息
  13. 阿里云域名证书免费认证教程
  14. 用PhoneGap开发移动程序
  15. 为什么零信任网络的设计需求有优先级列表?
  16. “大力丸”是壮阳药吗?
  17. 中小企业当心低价诱饵 莫把供销存当成ERP (转)
  18. Alcohol 120%刻录教程:刻录镜像文件
  19. 传智播客视频39期 36期 达内2016年前端开发视频
  20. treegrid 与java交互_针对dhtmlX当中的treegrid在java类当中的封装实现的步骤(后台代码)...

热门文章

  1. Python3异常-AttributeError: module 'sys' has no attribute 'setdefaultencoding'
  2. 由echarts想到的js中的时间类型
  3. nodejs pm2教程(转载)
  4. Android实战技巧:ViewStub的应用
  5. forward/redirect跳转页面的区别
  6. 2015.7.9(1000股涨停,未按分段交易中国重工、中国软件减仓失误!补做大智慧、中色股份追高,而后控制仓位预防高开跳水——重新整理分段交易原则)发现中软吸筹率极高...
  7. 求两条直线(线段)的交点
  8. 用php实现下载生成某链接的快捷方式
  9. const和readonly区别
  10. 【vscode】去除黄色波浪下划线