网教网

搜索
查看: 102|回复: 0

【建筑编程入门-Python】02变量、数据类型和运算符

[复制链接]

2

主题

3

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-4-28 10:46:00 | 显示全部楼层 |阅读模式
上一章节我们已经尝试在Python电池组里写基本代码。这一章我们介绍编程的一些基本语法和数据类型。
变量与基本数据类型
首先我们需要知道什么是变量。变量是用来存储数据的内存位置,分为不同的数据类型。Python的变量支持多种数据类型,在给变量赋值的时候,解释器会自动推断变量的数据类型。Python常见的数据类型有以下几种:整型int,浮点数float,字符串str,布尔值bool。除了这些基础数据类型之外,还有一些高级的数据结构,比如列表list,元组tuple,集合set和字典dict。在这里,我们先了解前面几种基础数据类型。其他地几种数据类型在之后会慢慢补充。
首先是我们已经接触过的整数int,整数代表没有小数部分的数值,例如-1,-190,0,114115,这些都是整数,在python中整数没有最大限制,所以可以表示非常大的数。比如:
x = 100
y = -50

a = x + y
print(a)然后是浮点数float,浮点数表示具有小数部分的数值,例如0.1,-3.14以及2.0等。在Python中浮点数使用双精度,也就是64位比特。比如:
f1 = 3.14
f2 = 5

f3 = f1 + f2
print(f3)这里要注意的是,Python可以让整数和浮点数进行直接运算,Python会自动将数据转换成浮点数:
x = 100
f1 = 2.5

a = x + f1
print(a)第三钟数据类型是字符串str。字符串表示一系列的字符,比如字母、数字、空格和符号。在python中,需要用到双引号来表示字符串。比如我们想让变量word等于Hello, world。我们不能直接写成:
word = Hello, world  #代码报错
print(word)而是:
word = "Hello, world"
print(word)字符串之间也可以实现相加,比如:
intro = "My name is "
name = "Kun"

sentence = intro + name
print(sentence)但是字符串和数字不能直接相加,需要用str()将数字转换成字符串的数据类型再进行运算:
year = 2.5
word = "age"

sentence = year + word  #这里会报错

sentence = str(year) + word
print(sentenct)第四种数据类型则是布尔型,用来表示真True或者假False的逻辑值,所以布尔值也只有True和False这两种。布尔类型常常用于条件判断和循环控制。给变量赋值布尔类型的方法很简单,就是True和False。或者还可以通过布尔运算来实现,这个我们马上会讲。
bool_example_1 = True
bool_example_2 = False
运算符
Python支持各种数据之间的算数、比较和逻辑运算符。那么以下是几种比较常见的算数运算的写法,分别是加法、减法、乘法、除法、取余、幂运算以及整除。以下是代码示例:
a = 5 + 3 #加法
b = 4 - 6 #减法
c = 5 * 3 #乘法
d = 8 / 5 #除法
e = 8 % 3 #取余
f = 5 ** 3 #幂运算
g = 7 // 3 #整除加减乘除这个常规的四则运算就不说了,大家应该很清楚。然后取余、幂运算和整除这三个运算,大家可以试着用print命令把结果打出来。
print(e,f,g)然后我们就知道,取余就是取8除以3的余数,3乘以2得6,6加2等于8,所以余2。幂运算也就是次方,f的意思就是5的三次方,5乘5等于25,25再乘5等于125。整除和取余刚好相反,得到的结果是能整除的部分不要余数。
这里顺便说一下,用Python时我们要善于运用print命令来检查代码运行的过程,这对于我们梳理代码逻辑和debug十分重要。再一个就是Python里井号#之后的内容被视为注释,它不会对代码有任何影响,但是能给阅读代码的人起到很好的提示作用。
然后我们说第二种运算符,比较运算符。比较运算一般用于比较大小关系,运算结果是布尔型。最常见的当然是大于、小于和等于,还有大于等于、小于等于和不等于。如果两个变量符合比较运算符的逻辑的话,那么输出结果是True,反之则为False。以下是代码的示例,大家可以看看哪些结果是True,哪些是False:
x = 5
y = 10

a = x > y  #大于
b = x < y  #小于
c = x == y #等于
d = x >= 2 #大于等于
e = y <= 8 #小于等于
f = x != y #不等于同样的,我们可以用print命令来输出这几个变量的结果:
print(a,b,c,d,e,f)这里要注意的是,比较运算符里的等于号是这个==,而一个等于号=是赋值。很多时候大家会下意识地把两个搞混。
接下来是第三种逻辑运算符,也就是与and,或or和非not。逻辑运算符常用于条件判断和循环结构。and的运算逻辑是:当两个操作数都为True时,返回值为True,否则为False。
True and True     # 返回 True
True and False    # 返回 False
False and True    # 返回 False
False and False   # 返回 Falseor的运算逻辑是,当至少有一个操作数为True时,返回值为True。当两个数都为False时,返回值为False:
True or True     # 返回 True
True or False    # 返回 True
False or True    # 返回 True
False or False   # 返回 Falsenot的运算逻辑是,对布尔值取反,如果输入为True,则返回为False,如果输入为False,则返回为True:
not True    # 返回 False
not False   # 返回 True逻辑运算符可以与比较运算符结合,创建更复杂的表达形式,比如:
a = 1
b = 5

#判断a是否大于0且小于b
result = a > 0 and a < b  #返回为True

#判断a是否等于5或b是否等于5
result = a == 5 or b == 5  #返回值为True

#判断a和b是否都大于3
result = a > 3 and b > 3  #返回值为False
Rhino中特有的数据类型
作为设计师,我们更多的会关注代码的可视化内容,或者说我们更关注利用代码来生成几何形体。而Rhino作为3D建模软件,也提供了很多几何数据类型,这也是为什么我们推荐设计师使用Rhino来学习编程的原因。一方面我们可以提高自己的编程知识水平,另一方面学到的编程知识能够快速地应用在设计领域,产生正反馈。这样的学习未来无论是转行还是在业内深耕都有帮助。
由于这些数据类型不是Python原生的,而是Rhino API提供的的数据类型和方法,所以我们需要在代码的最开头写上一行命令,来调用Rhino API的数据:
import Rhino.Geometry as rg这句话的意思是,我们在Python里导入RhinoCommon库中的几何模块,并命名为rg。通过这个模块,我们可以创建点、线、曲线、面等几何图形。接下来我们从基础的几个几何图形开始讲解。
首先是三维点Point3d,这个数据类型也是在使用Rhino编程中最常用的一种。要确定一个三维点,需要x,y和z三个方向的坐标,以下是一个创建三维点变量的代码示例:
import Rhino.Geometry as rg

point = rg.Point3d(1,1,0)创立了三维点之后,我们可以访问和修改它的坐标值:
import Rhino.Geometry as rg

point = rg.Point3d(1,1,0)

xCoor = point.X  #获取点的x坐标
yCoor = point.Y  #获取点的y坐标
point.Z = 10  #将点的z坐标改为10

print(xCoor, yCoor, point.Z)  #输出点的三个坐标但此时我们还不能在Rhino中看到这个点,我们需要将数据传递给输出变量,才能在Rhino中看到我们生成的点。我们在最后加上一行代码:
a = point

Point3d点之间能进行加减运算,其结果为坐标值的相加或相减:
import Rhino.Geometry as rg

pt1 = rg.Point3d(1,2,3)
pt2 = rg.Point3d(-1,0,1)

pt3 = pt1 + pt2
print(pt3)  #输出为 0,2,4Rhino还为Point3d提供了许多方法,例如计算点和点之间的距离:
import Rhino.Geometry as rg

pt1 = rg.Point3d(3,4,0)
pt2 = rg.Point3d(0,0,0)

distance = pt1.DistanceTo(pt2) #计算pt1到pt2的距离
print(distance)  #输出结果为5.0点是一切几何的基础。介绍完了点,自然就有线的数据类型。最常见的线就是线段Line,Line包含两个Point3d对象,From和To,也就是线段的起点和终点。以下是创捷Line对象的一个例子:
import Rhino.Geometry as rg

pt1 = rg.Point3d(1,2,0)
pt2 = rg.Point3d(0,0,0)

ln = rg.Line(pt1,pt2) #创建一个从pt1到pt2的线段同样的,我们可以通过类似的方法计算点和线段之间的距离:
import Rhino.Geometry as rg

# 创建一个 Point3d 点
point = rg.Point3d(1, 2, 3)

# 创建一条线
line_start = rg.Point3d(0, 0, 0)
line_end = rg.Point3d(5, 5, 5)
line = rg.Line(line_start, line_end)

# 找到线上离点最近的点
closest_point_on_line = line.ClosestPoint(point, True)

# 计算点到线的距离
distance = point.DistanceTo(closest_point_on_line)

# 输出距离
print(distance)在这个例子中,我们创建了一个Point3d点和一条线,然后使用line.CloestPoint(point,True)方法找到在线上距离点最近的点,然后计算这两个点的距离。
Rhino API中还有一个很重要的类,就是Vector3d三维向量。Vector3d三维向量包括三个浮点数:X、Y和Z,分别表示向量在三维坐标系中的X轴、Y轴和Z轴的分量。以下是创建Vector3d对象的示例:
import Rhino.Geometry as rg

v = rg.Vector3d(0,1,0)与Point3d类似,可以通过类似的方法获取Vector3d对象的属性,也可以进行加减运算,也能进行点乘:
import Rhino.Geometry as rg

v1 = rg.Vector3d(0,1,0)
v2 = rg.Vector3d(1,1,0)

xCoor = v1.X  #获取v1的x坐标
v2.Y = 2   #修改v2的y坐标

v3 = v1 + v2  #向量相加
v4 = v3 * v1  #向量点乘Rhino API也提供了许多关于向量有用的方法:
import Rhino.Geometry as rg

v1 = rg.Vector3d(1,0,0)
v2 = rg.Vector3d(2,1,0)

length = v1.Length  #获取v1的长度
v2.Unitize()   #将v2单位化向量不能在Rhino中直接显示出来,我们可以在Grasshopper里通过增加vector display的电池组显示向量。这个电池组的第一个输入为向量的起始点,第二个输入为向量的值。例如:
import Rhino.Geometry as rg

pt = rg.Point3d(0,0,0)
v = rg.Vector3d(1,1,0)

a = pt
b = v

此外,Rhino API还提供了许多不同的数据类型和方法,部分知识我们会在稍后涉及。这里十分推荐大家去参阅Rhino API的官方网站,了解具体数据类型的使用:
Rhino - API References (rhino3d.com)
至此,我们已经简单介绍了python的一些基本语法和数据类型,包括Rhino里特有的一些几何类。我们也在这一期也留了几个训练题给大家巩固知识的理解和应用。
训练题:
1.请制作一个python电池组(如图所示),它有x,y和z三个float数据类型的输入。并以这三个数值为三维坐标建立一个点point1,另外用代码建立一个坐标为(1,1,0)的点point2。计算这两个点的距离,输出一段话”点x,y,z到点1,1,0的距离为xxx“。


2.已知Rhino API 提供了Circle这个数据类型,想要新建一个Circle变量,需要一个中心点和一个半径数据。请建参照Line的创建方法,创建一个圆心在(5,3,0)半径为2.5的圆。
3.请制作一个python电池组,有三个输入变量,分别是圆心的x坐标,圆心的y坐标和圆的半径(圆心z坐标默认为0)。并将圆心、圆和圆心指向(1,1,0)向量方向的半径可视化出来。


以上就是今天的训练题,讲解会在之后的P2视频放出。初步掌握这些数据类型,就像在Sketch Up或者AutoCAD里了解如何建立矩形、圆形等等基本的元素。这些元素会在以后的学习中不断用到,是万丈高楼平地起的基础,十分的重要。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表