<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 2.1 語言起源 和普通語言一樣,編程語言也有分類。Python是高級語言,就是說這種語言被設計為易于理解。與之相反的是極低級別的語言(通常叫機器碼),絕對不容易理解。兩者中間的是C或C++那樣的語言,在機器碼之上提供了一個抽象層。如前所述,Python更進了一步,意味著它易于理解(接近英文語法),不需要去處理復雜功能,比如內存回收,甚至聲明變量! 我們真幸運。 Python首發于1991年,從那以后它自由發展,成為一個用戶成千上萬的語言。Python文檔聲明”Python百搭“、"Python哪兒都有”、“Python平易近人”、“Python是開放的”。更多Python語言和開發的信息請參考:[http://www.python.org](http://www.python.org). 假設即使以前你沒有過編程經驗,我仍然覺得以下例子對你并不難: ```python import rhinoscriptsyntax as rs somenumber = rs.GetReal("Line length") line = rs.AddLine([0,0,0], [somenumber,0,0]) print "Line curve inserted with id", line ``` 當然你可能對[0,0,0]實際是什么并沒有概念,對rs.GetReal()感動困惑,但是整體上這和你去雜貨店使用的溝通語言差不多: ``` 要求Rhino給一個叫'somenumber'的東西賦值. 告訴Rhino從世界原點到'somenumber'定義的點加一條線 打印一條成功信息 ``` Python和英文的互譯并不會很難,至少在上面這個例子體現的級別來說是很容易的。有辦法讓代碼寫得不那么容易理解,但這不是你應該驕傲的點。語法與英文相似是有好處的,建議還是遵守。 如前文述,語法有3個主要因素,上面的腳本都使用到了: 1. 流程控制 ? 基于第2行的輸出,有些行可能不會運行 2. 變量 ? somenumber用于存儲一個變量 3. 交互 ? 用戶被要求輸入,并且有結果輸出 ## 2.2 流程控制 在Python中,可使用流程控制跳過某些行的執行,或執行某些行多次。也可以使用流程控制跳轉到其他不同的行,然后再返回。在代碼中,可以添加條件語句,達到屏蔽某些部分的作用。If…Else…結構是條件語句的例子,但是這部分稍后再討論。 一個典型的條件語句如: ``` 你必須達到這么高(1.5米)才能坐過山車。 ``` 這行‘代碼’使用了一個條件(高于1.5米),來評估你最后到底能不能坐過山車。像這樣的條件語句可以無限的串在一起。也可以增加其他條件,比如最大身高,或者最大體重,或者禁止帶眼鏡或禁止有心臟問題的人玩過山車。 除了跳過某些行,也可重復執行某些行。我們可以指定一個固定數字: ``` 添加5湯匙糖。 ``` 或者同樣使用條件判斷: ``` 持續添加牛奶直到面團松軟。 ``` 在編程術語里重復執行某些行叫‘循環’。有多種循環類型,但是它們基本上功能都差不多。后面會細講。 ## 2.3 變量 無論何時我們都希望代碼是動態的,因此必須確保它能夠處理各種不同的情況。為了做到這一點,我們必須有存儲變量的能力。例如,我們可能想在我們的三維模型中存儲一組曲線,這樣我們就可以在后面的階段刪除它們。或者,我們的程序需要添加一條從鼠標指針到三維原點的線。或者我們需要檢查當前日期,檢查軟件是否已經過期。這些信息在編寫腳本的時候是沒有的。 每當我們需要存儲數據/進行計算/邏輯運算時,我們都需要變量來記住結果。由于這些操作是動態的,我們不能在執行前將它們添加到腳本中。我們需要占位符。 在上一頁的例子中,名為 *"somenumber "* 的東西是一個數字占位符。它一開始只是一個名稱,沒有附加任何數據,但在以下一條代碼中它將被賦予一個數字值: ```python somenumber = rs.GetNumber("Line length") ``` 然后,當把直線添加到Rhino時,我們會使用到這個特定的值: ```python curve = rs.AddLine([0,0,0], [somenumber,0,0]) ``` 所有其他定義線條對象的坐標都是硬編碼在腳本中的。變量被讀取或重新賦值的頻率沒有限制,但它永遠不能包含一個以上的值,也沒有撤銷系統來獲取過去的值。除了數字之外,我們還可以在變量中存儲其他類型的數據。目前,我們只限于四個最基本的變量,再加上一個用于糾錯的特殊變量: 1. 整型 2. 雙精度浮點型 3. 布爾型 4. 字符串 5. None變量 ### 2.3.1 整型和雙精度浮點型 整型和雙精度浮點型都是數字變量類型,意味著它們可以用來存儲數字。它們分別用于存儲不同類型的數字,這就是為什么我們最終會有一個以上的類型。整型只能用于存儲整數。它們的范圍大致從-20億到+20億。這個區間之內的每一個整數都可以用一個整型來表示。整數幾乎只用于計數目的(與計算相反)。 雙精度浮點型是數字變量,可以存儲帶小數的數字。雙精度浮點型的上限可以達到1.8×10<SUP>308</SUP>,下限可以達到5.0×10<SUP>-324</SUP>, 盡管在實踐中,可以準確表示的數字范圍要小得多。那些不熟悉科學符號的人不必擔心,我不會一直這樣寫數字。只要知道雙精度浮點型的數字范圍確實很大就夠了。 <div align=center><img src="https://gitee.com/al666ex/developer-rhino3d-com/raw/master/images/primer-integers.svg" width="75%"></div> <!--TODO: The font in the SVG above is not rendeirng correctly. What Font to use --> 所有可能的雙數和整數的集合是不連續的;它有間隙。0和0之間不存在整數,零和5.0×10<SUP>-324</SUP>之間不存在雙數。事實上,雙數的間隙要小得多,只是因為我們選擇了一個接近零的數字。當我們向更大數字移動時,兩個相鄰的雙數之間的差距也會變大,當我們接近范圍的極限時,差距大到足以容納銀河系。2×10<SUP>300</SUP>減去10億仍然是2×10300,所以在使用極其大的數字時要小心。通常情況下,我們從不涉足32位計算開始崩潰的區域,我們傾向于將自己限制在我們實際能夠應付的數字上。 用于處理數值變量的Python語法應該非常易于理解: ```python x = 15 + 26 # x 等于 41 x = 15 + 26 * 2.33 # x 等于 75.58 x = math.sin(15 + 26) + math.sqrt(2.33) # x 等于 1.368 ``` 你可以使用`print()`方法來顯示這些計算的結果。`print()`方法將在命令行中顯示該值。: ```python x = 2 * math.sin(15 + 26) + math.log(55) print(x) ``` 也可以在方程的右側使用數值變量: ```python x = x + 1 x = math.sin(y) + math.sqrt(0.5 * y) ``` 第一行代碼將把x的當前值增加1,第二行將給x分配一個值,這個值取決于y的值,例如如果y等于34,x將變成4.65218831173768。 注意,在Python中有一個特殊的快捷方式,允許你在一行代碼中定義多個變量: ```python x, y, z = [1,2,3] print x # 返回 1 print y # 返回 2 print z # 返回 3 ``` ### 2.3.2 布爾型 數值變量可以存儲一系列不同的數字。布爾變量只能存儲兩個值,通常稱為Yes或No,True或False。很明顯,由于布爾變量的范圍有限,我們從不使用它來進行計算。我們使用布爾變量來評估條件......還記得嗎? ``` 你必須身高超過1.5米才能乘坐過山車。 ``` "身高超過1.5米"是這個句子中的條件。這個條件要么是真的,要么是假的。你要么比1.5米高,要么比1.5米矮。由于腳本中的大部分流程控制代碼都是基于條件語句的,所以布爾值起到了非常重要的作用。讓我們來看看一個循環的例子: ``` 繼續添加牛奶,直到面團可以揉捏。 ``` 在這條語句條件是:面團必須軟到可以揉捏。假設現在我們程序中某些東西(算法)可以評估面團現在的狀態。然后第一步我們就會使用這個算法,這樣就知道應不應該繼續加牛奶了。如果算法返回值是False(即:面團還硬,不可揉捏),我們就繼續加奶。加奶以后再一次調用這個算法,直到算法返回True(面團可揉捏啦)。這樣我們就知道不需要加更多奶了,可以進行做蘋果派的下一個步驟。 在python里從來不使用"0"或"1"或"Yes"或"No"這樣的表示方法,對于布爾值,總是使用"True"或"False"。 ```python if curve is None: print "Something went terribly wrong!" ``` 判斷語句會返回True或False,只有結果是True(曲線為None值即曲線沒有成功添加),才會進入條件判斷語句循環打印出"Something went terribly wrong!."的提示語句。 ### 2.3.3 字符串 字符串用于存儲文本信息。在python里只要給東西兩邊加上引號,就表示它是字符串。所以如果我們在數字兩邊加引號,它會變成文本: ```python variable1 = 5 variable2 = "5" ``` 你可以打印到命令行,這2個變量看起來好像一樣,但是一旦在算式中使用,就會看出字符串和數字變量的區別: ```python print (variable1 + variable2) # Results in an "Unsupported Operand Type" Error ``` python拋出一個錯誤信息,因為我們把字符串變量和整形變量進行了加法運算。要想讓運算成功進行,先要把字符串轉換為整數。 ```python print (variable1 + int(variable2)) # Results in 10 ``` 要存儲文本信息,除了使用字符串變量別無它法。字符串語法相當簡單,但是深入使用字符串涉及到很多小技巧。因為學習剛剛開始,我們只進行簡單的操作,比如賦值和連接: ```python a = "Apfelstrudel" # Apfelstrudel a = "Apfel" + "strudel" # Apfelstrudel a = "4" + " " + "Apfelstrudel" # 4 Apfelstrudel a = "The sqrt of 2.0 = " + str(math.sqrt(2.0)) # The sqrt of 2.0 = 1.4142135623731 ``` 在軟件內部,字符串是以字符序列方式存儲。每個字符('char')都來自于Unicode表,表內大約有10萬個不同的字符。比如,問號?在unicode表內的索引是63,小寫e是101,空格是32: <div align=center><img src="https://gitee.com/al666ex/developer-rhino3d-com/raw/master/images/primer-strings.svg" width="75%"></div> <!--TODO: The font in the SVG above is not rendeirng correctly. What Font to use --> 以后我們會用到一些字符串的高級特性,這要求理解字符串的工作方式,但是現在只使用它簡單的功能,只要知道它能按你預期的方式工作就行了。 在Rhino python里會重度使用字符串,因為物件ID總是以字符串方式來表示。物件ID就是在物件描述對話框里顯示的那一串奇怪的代碼: *D7EFCF0A-DB47-427D-9B6B-44EC0670C573*。每個物件的ID被設計為絕對唯一,在整個宇宙中都不會重復,所以在文件中可以用它來安全、清晰的定義一個物件。 ### 2.3.4 None變量 每當向Rhino提一些沒有答案的問題時,我們需要給Rhino一個方式回答'我不知道'。使用第5頁的例子: ```python curve = rs.AddLine([0,0,0], [somenumber,0,0]) ``` 并不是100%創建曲線會成功。如果在要求輸入長度時用戶輸入了0,直線的起點和終點就會重合。Rhino并不喜歡長度為0的直線,因此不會向文件中添加這個物件。這意味著`rs.AddLine()`的返回值并不是一個有效的物件ID。在Rhino里幾乎所有的方法在失敗時會返回一個None值,這樣在出錯時我們就可以添加錯誤檢查,執行規避操作: ```python curve = rs.AddLine([0,0,0], [somenumber,0,0]) if not curve: print "Something went terribly wrong!" ``` python中,在變量x是 *None* ,0或任何空列表時,`if not x`會返回True。 ### 2.3.5 使用變量 通常,每當我們在程序里需要使用一個變量,首先要聲明這個變量。然而在python中,我們不需要這樣做,無需聲明,直接創建并使用變量。python也不要求像其他語言那樣聲明變量的類型。這兩點使python成為一個快速且易學的語言。所以,需要使用變量直接寫: ```python a = "Apfelstrudel" ``` 當使用變量時,選擇一個變量名,并給它賦值(數值、字符串、布爾值等)。變量名需要你自己挑。上面的例子使用的變量名是a,并不是一個很好的選擇。首先,它并不能表示這個變量是用來干什么的,然后也不知道它包含的是什么類型的值。比如`strFood`就是一個比較好的名字。前綴str表示這是一個字符串變量,Food的的字面意思顯而易見。使用的比較廣泛的變量名前綴如下: <div align=center><img src="https://gitee.com/al666ex/RhinoPython101/raw/master/images/primer-variable-type.svg" width="60%"></div> 看到這么多變量類型不要慌,有些后面的章節會慢慢說,有些你可能再也不會用到。變量的作用域(有的地方叫“生命周期”)指程序中能訪問它的區域。第當你在一個函數中聲明一個變量,只有在那個函數內部可以讀寫這個變量。當函數終止時,變量就會超出作用域。生命周期在我看來不是一個好的叫法,因為有的變量能活得很久,但是仍然不能訪問到因為它在范圍之外。等我們學習函數聲明時再來擔心這個問題。現在,讓我們來看一個正確使用變量的例子: ```python strComplaint = "I don't like " strFood = "Apfelstrudel. " strNag = "Can I go now?" print(strComplaint + strFood + strNag) ``` 這里需要注意一個問題是python的大小寫敏感性。和其他語言不同,在python里,"Apfelstrudel", "apfelstrudel" 和 "ApfelStrudel"并不是同一個東西,在程序的其他地方比如變量名、函數、類等這條規則都適用。所以請記住認真對待大小寫字母! 現在,再來一個例子。我們使用第2頁的宏,但是用變量替換掉一些硬編碼數字,以增加靈活性。這程序看起來很恐怖,但是請記住那幾行亂七八糟的代碼(第10行以后)是因為程序需要模仿宏才那樣寫的,有點像把阿斯頓-馬丁開到人行道上一樣。通常情況下,和Rhino溝通不需要使用命令行,那樣程序看起來就會友好很多: ```python import rhinoscriptsyntax as rs dblMajorRadius = rs.GetReal("Major radius", 10.0, 1.0, 1000.0) dblMinorRadius = rs.GetReal("Minor radius", 2.0, 0.1, 100.0) intSides = rs.GetInteger("Number of sides", 6, 3, 20) strPoint1 = " w" + str(dblMajorRadius) + ",0,0" strPoint2 = " w" + str(dblMajorRadius + dblMinorRadius) + ",0,0" rs.Command ("_SelNone") rs.Command ("_Polygon _NumSides=" + str(intSides) + " w0,0,0" + strPoint1) rs.Command ("_SelLast") rs.Command ("-_Properties _Object _Name Rail _Enter _Enter") rs.Command ("_SelNone") rs.Command ("_Polygon _NumSides=" + str(intSides) + strPoint1 + strPoint2) rs.Command ("_SelLast") rs.Command ("_Rotate3D w0,0,0 w1,0,0 90") rs.Command ("-_Properties _Object _Name Profile _Enter _Enter") rs.Command ("_SelNone") rs.Command ("-_Sweep1 _SelName Rail _SelName Profile _Enter _Enter _Closed=Yes _Enter") rs.Command ("_SelName Rail") rs.Command ("_SelName Profile") rs.Command ("_Delete") ``` |行|描述| |-------|-------| |2...5|這里提示用戶輸入值(實數是雙精度浮點數的另一個叫法)。我們給 *rs.GetReal()* 方法提供了4個默認值,一個字符串和3個實數。字符串顯示在命令行,第一個實數10.0做為默認選項:<BR><img src="https://gitee.com/al666ex/developer-rhino3d-com/raw/master/images/primer-getrealexample.png" width="75%" margin="10px"><br>同時我們也限制數字在0至1000之間。如果用戶輸入一個特別大的數,Rhino會說這玩意太大了:<br><img src="https://gitee.com/al666ex/developer-rhino3d-com/raw/master/images/primer-getrealexamplemaximumlimit.png" width="75%">| |7...8|在這里我們基于`dblMajorRadius` 和 `dblMinorRadius`的值創建字符串。如果用戶都選擇默認值,那么`dblMajorRadius`會是10.0,`dblMinorRadius`會是2.0,`strPoint2`就是 " w12,0,0"。| |10...23|這和第3頁里的宏是一樣的,不同之處在于用變量替換了幾處,最后多了3行,刪掉了生成實體的結構線(所以我們能多運行程序向次而不崩潰)。| --- ## 下一步 這是python數據結構的基礎,接下來學習python的[程序框架](https://gitee.com/al666ex/developer-rhino3d-com/blob/master/_guide_topics/rhinopython/primer-101/3-script-anatomy.md)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看