1. 程式人生 > >ASP.Net WebForm溫故知新學習筆記:一、aspx與伺服器控制元件探祕

ASP.Net WebForm溫故知新學習筆記:一、aspx與伺服器控制元件探祕

開篇:毫無疑問,ASP.Net WebForm是微軟推出的一個跨時代的Web開發模式,它將WinForm開發模式的快捷便利的優點移植到了Web開發上,我們只要學會三步:拖控制元件→設屬性→綁事件,便可以行走於天下。但這樣真的就可以走一輩子嗎?實際上,ASP.Net經常被噴的詬病就在於WebForm以及只會拖控制元件的ASP.Net程式設計師,往往大型網際網路系統也沒有采用WebForm的模式進行開發。但是,WebForm並不是一無是處,而是我們沒有用好,還有很多東西我們知其然不知其所以然,現在我們就來對這些平時所不注意但又十分關鍵的東西一探究竟。

一、神祕不神祕—aspx探祕

1.1 WebForm時代的請求物件

aspx

  在WebForm中,所有的頁面請求都是以aspx檔案作為請求物件(靜態化和偽靜態的除外)。例如上圖中,訪問者在瀏覽器端通過輸入URL:blog/index.aspx向伺服器端傳送請求,伺服器端首先找到這個index.aspx,然後建立頁面物件(index.aspx.cs檔案中的類物件),呼叫這個頁面物件中的ProcessRequest方法和Page_Load方法(在此過程中,有可能需要訪問資料庫)來生成aspx頁面的所有html內容,最後將生成好的html返回給瀏覽器端。

  因此,我們可以知道,伺服器端對aspx的處理過程其實就是一個渲染生成html的過程

1.2 神奇的<%%>

  通過實踐可知,在aspx中除了<%%>的內容和runat="server"的內容,其他都是原樣輸出。這是因為我們在aspx中可以藉助<%%>寫入C#程式碼,就跟ASP、PHP一樣的風格。但是,在實際開發中並不建議這麼來做,因為它違反了CodeBehind的原則,不利於職責的分離。

  ①直接寫入C#業務邏輯程式碼

1         <%
2             for (int i = 0; i < 5; i++)
3             {
4                 Response.Write("I am a webform page.<br/>
"); 5 } 6 %>

  ②獲取C#方法的返回值

  假設頁面後端程式碼中有一個GetServerTime的方法,它只有一句程式碼:return DateTime.Now.ToString();。頁面中只需要通過<%= 方法名() %>即可獲取該方法的返回值。

<%= GetServerTime() %>

  ③aspx中能夠訪問的方法的訪問修飾符只能為public和protected:這是因為aspx和aspx.cs之間的關係是編譯生成後aspx和aspx.cs會建立兩個類,並且aspx繼承自aspx.cs中的類,在面向物件中子類要訪問父類的方法,那麼方法的訪問修飾符必須為public或protected。(後面會講到aspx和aspx.cs的關係,不要急)

1.3 aspx與ashx的關係

  ashx是一般處理程式,它是一個實現了IHttpHandler的輕量級處理程式,處理操作都在ProcessRequest方法中完成。

  而aspx則相當於一個特殊的、高階的ashx,aspx所對應的父類是System.Web.UI.Page這個類,通過檢視Page類的定義,我們可以看到Page也實現了IHttpHandler的這個介面。另外之所以說它是高階的ashx,是因為aspx幫我們封裝了許多底層的操作,使得我們可以進行傻瓜式的開發操作。

  看到這裡,我們不禁要問:既然有了ashx為何還要aspx?大家都知道ashx中的ProcessRequest方法需要向請求響應報文中輸出html,而每個html頁內容有很多,如果每次響應都往裡邊輸出html開發起來會很痛苦(這裡主要是指在如果不借助模板引擎的情況下),而aspx則起到了類似於於一個模板引擎的作用,幫我們把html的大體框架定義好了,我們在開發中就只需要操作每次響應需要更改的內容即可。

1.4 aspx與aspx.cs的關係

(0)假如我們有以下的名為FirstPage的一個aspx頁面:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>第一個WebForm頁</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        哈哈,我是ASP.Net WebForm,下面看我的表演。
        <br />
        <%
            for (int i = 0; i < 5; i++)
            {
                Response.Write("I am a webform page.<br/>");
            }
        %>
        <br />
        <%= GetServerTime() %>
        <br />
        <asp:TextBox ID="txtDateTime" runat="server"></asp:TextBox>
        <asp:Button ID="btnGetTime"
            runat="server" Text="獲取時間" onclick="btnGetTime_Click" />
        <br />
        <% GetDllInfo(); %>
    </div>
    </form>
</body>
</html>
View Code

  其後臺程式碼.cs檔案程式碼如下:

namespace WebFormDemo
{
    public partial class FirstPage : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected string GetServerTime()
        {
            string result = "伺服器時間:" + DateTime.Now.ToString();
            return result;
        }

        protected void GetDllInfo()
        {
            Response.Write("頁面類名稱:"+this.GetType() + "<br/>");
            Response.Write("程式集地址:"+this.GetType().Assembly.Location + "<br/>");
            Response.Write("父類的名稱:"+this.GetType().BaseType + "<br/>");
            Response.Write("程式集地址:"+this.GetType().BaseType.Assembly.Location + "<br/>");
        }

        protected void btnGetTime_Click(object sender, EventArgs e)
        {
            txtDateTime.Text = DateTime.Now.ToString();
        }
    }
}
View Code

  (1)CodeBehind:在每個aspx檔案中的頭部,我們都會看到以下的一句程式碼

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FirstPage.aspx.cs" Inherits="WebFormDemo.FirstPage" %>

  其中CodeBehind這個屬性定義了此aspx頁面的專屬後臺程式碼檔案的名稱,而Inherits這個屬性則定義了此aspx頁面所要繼承的父類的名稱(這也可以簡單地說明,aspx頁面會單獨生成一個類,與後臺程式碼類不重合在一起)。因此,aspx.cs就是aspx的後置處理程式碼,負責處理aspx中<%%>和runat="server"的內容。

  (2)子類與父類:我們使用ASP.NET寫的網站在執行時候都會被編譯生成為一個一個的程式集(.dll),而我們的aspx頁面也會被生成為一個一個的類。那麼,我們如何來證明aspx會生成一個類,而且還是aspx.cs中的類的子類呢?那麼,我們需要反編譯系統所生成的程式集(.dll)檔案。

  第一步:找到網站所生成的程式集

  我們可以通過寫入以下程式碼,然後在aspx中<% GetDllInfo(); %>呼叫;

protected void GetDllInfo()
{
    Response.Write("頁面類名稱:"+this.GetType() + "<br/>");
    Response.Write("程式集地址:"+this.GetType().Assembly.Location + "<br/>");
    Response.Write("父類的名稱:"+this.GetType().BaseType + "<br/>");
    Response.Write("程式集地址:"+this.GetType().BaseType.Assembly.Location + "<br/>");
}

  瀏覽頁面,會顯示以下結果:通過下圖可以看到,我們的FirstPage這個頁面會生成一個ASP.firstpage_asx的類,其父類是FirstPage。

PS:當某個頁面第一次被訪問的時候,CLR就會使用一個程式碼生成器去解析aspx檔案並生成原始碼並編譯,然後以後的訪問就直接呼叫編譯後的dll,這也是為什麼aspx第一次訪問的時候非常慢的原因。  

  第二步:反編譯臨時程式集檔案

  ①通過上面顯示的路徑找到dll,並拖到反編譯工具(ILSpy或者Reflector,前者開源免費,後者已經收費,但天朝,你懂的。)進行檢視。通過下圖可以看出,頁面類aspx是後臺程式碼類所繫結的子類,它的名稱是aspx檔名加上“_aspx”字尾。因此,這裡也就解釋了為什麼在aspx中要訪問的方法必須是public和protected的訪問修飾符才可以。

  ②下圖則展示了對頁面後置程式碼類所在的程式集進行反編譯的情況:

  第三步:我們在剛剛時就說了,伺服器端對aspx處理的過程是一個渲染生成html的過程,如何來深入理解這句話,我們可以在此藉助反編譯工具來一探究竟。通過對aspx類的反編譯,我們可以看到在它的方法列表中有如下幾個命名格式一樣的方法:

  ①_BuildControl_controlX(); X代表數字

  通過對這幾個方法的原始碼分析,我們可以知道,這些方法都在做一件事件:拼接生成aspx頁面的html內容。每個方法都會返回一個控制元件型別的物件,有LiteralControl型別,也有HtmlHead型別(在aspx中只要給head加了runat="server"就會有此型別的生成方法)等等,那麼這些數字又代表了什麼?難道是生成html的執行順序麼?這些生成方法又是在哪個方法中被一一呼叫的呢?別急,下面我們就來看看。

  ②通過後面幾個方法原始碼的檢視,我們發現原來上面的幾個生成控制元件的方法都在一個叫做BuildControlTree的方法(生成控制元件樹)中被依次呼叫。

  這裡幾乎是按照數字序號的順序來依次呼叫具體的BuildControl_controlX()方法,並將每次返回的控制元件新增到頁面中去。這裡可以看到,BuildControlTree方法的引數是其本身,它實現了IParserAccessor的介面。這裡暫且將這個介面其理解為一個大的控制元件容器,可以往這個容器裡邊新增子控制元件(這裡看到不同型別的控制元件都可以往裡邊加,那麼肯定初步斷定方法引數應該是object型別),這裡將每次呼叫BuildControl_controlX()方法所返回的控制元件型別新增到了這個容器中。

  ③剛剛分析了BuildControlTree方法,知道了控制元件的生成過程。但是,頁面主體內容又在哪裡呢?伺服器端要返回的內容可不止是那些控制元件的HTML程式碼啊。別急,通過檢視反編譯的方法,我們看到原來Renderform1這個方法裡邊。PS:這裡方法名為什麼是form1呢?那是因為我們在aspx中給form表單設定的ID就為form1。

  ④這裡我們就分析到這兒,而WebForm具體的頁面生命週期留到後面的ASP.Net頁面生命週期探索的文章中詳細介紹。這裡我們只需要知道,aspx這個類是其後置程式碼類的子類,它要做的工作就是幫我們生成要返回瀏覽器端的html內容即可。其中,RenderForm將渲染生成整個form表單,而BuildControlTree則會生成伺服器控制元件樹,以便在後面的方法中方便地呼叫每個控制元件的RenderControl方法生成html字串。

二、好用不好用—伺服器控制元件探祕

2.1 企業中到底在用哪些控制元件?

  企業專案中經常使用到的最多還是一些“輕量級”的控制元件,例如:Button、TextBox、CheckBox、RadioButton、DropDownList、Repeater、ListView等;就我所實習的單位來說,這一年做WebForm的專案以來,用的最多也就是這些控制元件,資料控制元件除了Repeater就沒用過其他的。我覺得資料控制元件的話,好好學習下Repeater就夠了,因為Repeater已經足夠強大了。至於什麼***DataSource、Validator、Wizard、Login還有什麼ASP.Net AJAX ToolKit就根本沒雜用,這些控制元件既複雜又不實用,而且還比較重量級。

2.2 需要注意的基本控制元件用法

  (1)Button控制元件中的OnClientClick屬性

  ①在WebForm中,Button控制元件有兩個Click事件:一個是OnClick的服務端事件,另一個是OnClientClick的客戶端事件;OnClick事件寫在後置程式碼類中,每次點選Button首先會觸發OnClientClick事件(OnClientClick會返回一個bool值,為true則繼續執行OnClick,為false則不繼續)。

  ②通過分析這個屬性,可以知道OnClientClick是一個字串屬性,寫的程式碼是JavaScript程式碼,在上面所說的BuildControl方法中會渲染成input的onclick方法,它會執行在瀏覽器端。

 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ClientClickPage.aspx.cs"
 2     Inherits="WebFormDemo.ClientClickPage" %>
 3 
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 5 <html xmlns="http://www.w3.org/1999/xhtml">
 6 <head runat="server">
 7     <title>OnClientClick</title>
 8     <script type="text/javascript">
 9         function checkConfirm() {
10             var flag = confirm("您確定要刪除此內容?");
11             return flag;
12         }
13     </script>
14 </head>
15 <body>
16     <form id="form1" runat="server">
17     <div>
18         <asp:Label ID="lblFlag" runat="server" Text="This is a label control text."></asp:Label>
19         <asp:Button ID="btnDelete" runat="server" Text="Delete" 
20             OnClientClick="return checkConfirm()" onclick="btnDelete_Click" />
21     </div>
22     </form>
23 </body>
24 </html>
View Code

  在上面的Button控制元件中,既設定了OnClientClick也設定了OnClick服務端事件,瀏覽生成的頁面原始碼,可以看到在生成的html中,OnClientClick確實是渲染成了input的onclick這個瀏覽器端的事件:在Button每次以POST方式向伺服器提交請求之前,都會先進行checkConfrim這個方法的判斷,如果返回值為true才會將請求提交到伺服器端;

  (2)被某些人濫用的LinkButton

①LinkButton用法跟Button差不多,區別就只在於LinkButton渲染成超連結(<a></a>),而Button渲染生成input標籤(<input type="button"></input>)。

  ②不要用LinkButton來實現普通的超連結,在實際開發中,我還真見過有些人用LinkButton來實現超連結的:他們在LinkButton的OnClick事件中寫Response.Redirect("xxx.aspx");這種頁面跳轉程式碼,完全是作死的節奏啊。能在瀏覽器端進行的事兒為啥要弄到伺服器端來進行呢?而且就只是一個頁面跳轉的小事。

2.3 AutoPostBack的那點事

  (1)什麼是PostBack

  比如現在正在訪問a.aspx這個頁面上,點選頁面上的某個submit按鈕把資料提交到a.asx.cs進行處理,這個過程則可以看作是:“從客戶端瀏覽器把之前的狀態資料提交回來(PostBack)”。

PS:設定了runat="server"的Button或者input控制元件都會渲染生成type="submit"的按鈕

  (2)剛剛提到只有點選submit型別的按鈕才會提交請求到伺服器,那麼在以下這種場景如何破呢?

 1 <form id="form1" runat="server">
 2     <div>
 3         <asp:DropDownList ID="ddlProvince" runat="server" 
 4         onselectedindexchanged="ddlProvince_SelectedIndexChanged">
 5             <asp:ListItem Value="BJ">北京市</asp:ListItem>
 6             <asp:ListItem Value="CQ">重慶市</asp:ListItem>
 7             <asp:ListItem Value="SC">四川省</asp:ListItem>
 8         </asp:DropDownList>
 9         <asp:DropDownList ID="ddlCity" runat="server">
10             <asp:ListItem Value="-1">請先選擇省份</asp:ListItem>
11         </asp:DropDownList>
12     </div>
13 </form>
View Code

  有一個省市兩級聯動的下拉列表場景,在使用者選擇一個省份後,自動從伺服器獲取屬於該省份的市名下拉列表。這裡使用了DropDownList控制元件,該控制元件提供了一個叫做SelectIndexChanged的事件,它會幫我們渲染生成select的onchange的瀏覽器事件。但是在頁面的瀏覽過程中,我們怎麼選擇不同的省份,市名稱的下拉列表就是不動,因為沒有向伺服器提交資料請求。

  ①這時候,一位名叫MSDN的大神會告訴你,需要給這個DropDownList控制元件設定一個AutoPostBack="true"的屬性,經除錯後果然可行了。但是,作為一個學習者,我們會想知道到底這個AutoPostBack幫我們做了什麼事兒?這時,我們可以通過檢視瀏覽器的原始碼一探究竟。

  ②通過瀏覽器提供的開發人員工具檢視資料請求報文,可以看到除了提交form中的input外,還提交了ASP.Net WebForm預置的一些隱藏欄位,而這些隱藏欄位則是WebForm為我們提供便利的基礎。比如EventTarget則記錄剛剛提交給伺服器的是哪個伺服器控制元件。

2.4 為什麼需要IsPostBack

  注:WebForm頁面中如果有一個runat="server"的form,那麼必定會涉及到IsPostBack。

  (1)Http的無狀態:因為Http是無狀態的,所以這次會話結束下次再給我提交請求我也不記得你是誰,即使你是李剛的兒子,老子也不認識。那麼,為了解決這種問題,我們可以使用一些方法來解決,例如設定一個隱藏欄位來判斷,如果是PostBack那麼肯定請求報文中會帶上這個欄位,如果不是那麼請求報文中肯定沒有這個欄位。比如,下面我們使用隱藏欄位來作為判斷PostBack的標誌。

 <input name="IsPostBack" type="hidden" value="true" />

  (2)ASP.Net WebForm中內建了一個IsPostBack屬性(bool型別),我們可以在Page_Load事件中判斷IsPostBack是否為true,如果不為true則可以知道是第一次訪問或者是請求頁面的操作,而如果為true則代表是PostBack操作,我們可以分別進行不同的業務邏輯處理。例如:有的程式碼只會在頁面第一次載入時才執行(比如從資料庫中讀取資料並顯示),這時就應該使用IsPostBack進行判斷。

if (!IsPostBack)
{
    this.lblInfo.Text = "第一次來,不是PostBack";
}
else
{
    this.lblInfo.Text = "非第一次來,是PostBack";
}

  (3)通過檢視生成的頁面html程式碼,我們沒有發現頁面中有IsPostBack的這個隱藏欄位。那麼,它是儲存在哪個位置又是根據什麼來判斷的呢?實際上,IsPostBack屬性是根據ViewState中的一些特殊的鍵值對來判斷賦值的(因為:每次提交請求後,伺服器端都會返回不同的ViewState隱藏域給瀏覽器端;同樣,瀏覽器每次也會將ViewState提交給伺服器端,伺服器端會解析ViewState還原上次狀態)。對於ViewState,可以通過一些軟體例如ViewStateDecoder進行解析檢視,例如下圖:

  如果我們禁用了ViewState,那麼也就無法正常使用IsPostBack屬性了,也無法正常使用PostBack了。那麼對於ViewState,我會在下一篇進行簡單探祕,本篇就到此為止。

  如果你覺得本文對你有用,那就麻煩點個“推薦”吧,也能讓我更有動力寫下去,謝謝!

附件下載

作者:周旭龍

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。

相關推薦

ASP.Net WebForm溫故知新學習筆記aspx伺服器控制元件探祕

開篇:毫無疑問,ASP.Net WebForm是微軟推出的一個跨時代的Web開發模式,它將WinForm開發模式的快捷便利的優點移植到了Web開發上,我們只要學會三步:拖控制元件→設屬性→綁事件,便可以行走於天下。但這樣真的就可以走一輩子嗎?實際上,ASP.Net經常被噴的詬病就在於WebForm以及只會拖控

ASP.Net WebForm溫故知新學習筆記ViewStateUpdatePanel探秘

ole htable nbsp 工具 utf cti abi divide 優點 原文地址:http://www.cnblogs.com/edisonchou/p/3901559.html 開篇:經歷了上一篇《aspx與服務器控件探秘》後,我們了解了aspx和服務器控件

ASP.Net WebForm溫故知新學習筆記ViewStateUpdatePanel探祕

開篇:經歷了上一篇後,我們瞭解了aspx和伺服器控制元件背後的故事。這篇我們開始走進WebForm狀態保持的一大法寶—ViewState,對其刨根究底一下。然後,再對曾經很流行的ASP.Net AJAX方案中的利器—UpdatePanel這個神奇的區域一探究竟。 一、隱藏的狀態—ViewState探祕 1

MFC學習筆記)High Speed Chart 控制元件使用

引言 大學期間學習STM32時,由於參加機器人比賽,第一次接觸到攝像頭,讓我深深被其吸引,還記得當初為了點亮第一顆攝像頭,第一次通過自己寫的顏色識別演算法讓它按照自己的意願去識別出每幀影象的內容,正確標識出物體位置資訊時的激動,那時的我們真的是廢寢忘食般的吸收大量新知識,連續通宵好幾晚,

JNI學習筆記JNIEnvjobjectjclass詳解

1 前言   在進行JNI程式設計開發的時候,使用javah生成Native方法對應的Native函式宣告,會發現所有的Native函式的第一個引數永遠是JNIEnv指標,而第二個引數永遠是jobject或jclass中的一個。JNIEnv指

ASP.NET Core 2 學習筆記(十)Cookies & Session

自動 asp Go 內存 rtu serialize .html call names 原文:ASP.NET Core 2 學習筆記(十一)Cookies & Session基本上HTTP是沒有記錄狀態的協定,但可以通過Cookies將Request來源區分出來,並

ASP.NET Core 2 學習筆記(十)視圖

部分 合成 cati 分享 col script text var AC ASP.NET Core MVC中的Views是負責網頁顯示,將數據一並渲染至UI包含HTML、CSS等。並能痛過Razor語法在*.cshtml中寫渲染畫面的程序邏輯。本篇將介紹ASP.NET Co

ASP.NET Core 2 學習筆記(十二)REST-Like API

light namespace strong postman space 新增 html move engine Restful幾乎已算是API設計的標準,通過HTTP Method區分新增(Create)、查詢(Read)、修改(Update)和刪除(Delete),簡稱

ASP.NET Core 2 學習筆記(十四)Filters

span ans 黃色 返回 lec red addm spn using 原文:ASP.NET Core 2 學習筆記(十四)FiltersFilter是延續ASP.NET MVC的產物,同樣保留了五種的Filter,分別是Authorization Filter、Res

ASP.NET Core 2 學習筆記(四)依賴註入

pub framework 三次 DDM order 包裝 差異 限制 cto 原文:ASP.NET Core 2 學習筆記(四)依賴註入ASP.NET Core使用了大量的依賴註入(Dependency Injection, DI),把控制反轉(Inversion Of

ASP.NET Core 2 學習筆記(二)生命周期

RF Go 使用 HR runt block top 最大的 env 原文:ASP.NET Core 2 學習筆記(二)生命周期要了解程序的運行原理,就要先知道程序的進入點及生命周期。以往ASP.NET MVC的啟動方式,是繼承 HttpApplication 作為網站開始

ASP.NET Core 2 學習筆記(七)路由

local quest urn AD term 執行 自動 routes code 原文:ASP.NET Core 2 學習筆記(七)路由ASP.NET Core通過路由(Routing)設定,將定義的URL規則找到相對應行為;當使用者Request的URL滿足特定規則條件

ASP.NET Core 2 學習筆記(六)MVC

方便 web redirect AR return his 架構模式 PE ofo 原文:ASP.NET Core 2 學習筆記(六)MVC ASP.NET Core MVC跟ASP.NET MVC觀念是一致的,使用上也沒有什麽太大的變化。之前的ASP.NET MVC把MV

git學習筆記臺電腦上配置兩個git賬戶

idt ica 項目 auth 開源中國 重復 gmail name 微軟 如何在一臺電腦上配置兩個git賬戶,現在雲端倉庫很多,有開源中國的 gitee.com 微軟的 github.com 還有 gitlab.com 和 bitbucket.org 等等,下面是具體步驟

《精通ASP.NET MVC4》學習筆記

實例 重寫方法 fig 功能 add 相同 stat 筆記 .net 第7-11章 SportStore項目實踐 (見個人項目CY.SportsStoreMVC) 第12章 MVC項目綜述 理解約定優於配置:不用明確的配置應用程序中的某種關聯,只要遵守某種約定,一切都

Powershell學習筆記(初識Powershell

什麼是Powershell? MSDN上的說明是:PowerShell 是構建於 .NET 上基於任務的命令列 shell 和指令碼語言。 PowerShell 可幫助系統管理員和高階使用者快速自動執行用於管理作業系統(Linux、macOS 和 Windows)和流程的任務。 使用 Power

Asp.net MVC4.0學習筆記】找不到DbContext和無法檢索元資料

編譯環境:Visual Studio 2012; 解決問題:找不到DbContext需要安裝EntityFramework,安裝方法如下:      工具->庫程式包管理器->程式包管理器控制檯,開啟控制檯後,輸入命令Install-package Ent

ASP.NET MVC5(二)控制器視圖模型

script pcr 靜態 簡單 err ice message blog 控制器 前言   本篇博文主要介紹ASP.NET MVC中的三個核心元素:控制器、視圖與模型,以下思維導圖描述了本文的主要內容。 控制器 控制器簡介   在介紹控制器之前,簡單的介紹一下MVC工

NumPy學習筆記3更加復雜的數組

ssi ram 有符號 -c .sh [0 tab sin pes 一、更多的數據類型 1、Casting (1) 在混合數據類型的運算中,最終運算結果的數據類型與size更大的數據類型相同。 >>> np.array([1, 2, 3]) + 1.5

NumPy學習筆記4高級運算

scipy file matrix 系統 from degree span ctu src 一、多項式 舉個例子,: >>> p = np.poly1d([3, 2, -1]) >>> p(0) -1 >>> p.ro