使用 ellipse 標(biāo)簽表示橢圓:1089其中包含 4 個屬性rx x 半徑;ry y 半徑;cx 圓心坐標(biāo) x 值;cy 圓心坐標(biāo) y 值。
不過感覺最后這個跳動的卡通小人還是有點(diǎn)大,像素顆粒感明顯,所以我們絕定縮小一下加載動畫最后一幀給定的寬高:/* 清除瀏覽器默認(rèn)邊距 */* { padding: 0; margin: 0; }body { /* 這段代碼是為了居中顯示,不是重點(diǎn),看不懂的話可以無視 */ height: 100vh; display: flex; align-items: center; justify-content: center; /* 添加背景圖 */ background: url(../img/bg.jpg) center / cover;}.animate { width: 130px; height: 130px; background: url(../img/rect.png); /* 動畫: 動畫名(loading) 時長(0.6秒) 運(yùn)行方式(step-end) 動畫次數(shù)(3次) 填充模式(雙向) */ animation: loading .6s step-end 3 both, /* 動畫可以定義多個,每個動畫用逗號分隔。*/ /* 第二個動畫的動畫名(animate) 時長(0.8秒) 運(yùn)行方式(step-end) 延時(1.8秒) 動畫次數(shù)(無限) */ animate .8s steps(12) 1.8s infinite;}/* 定義動畫:動畫名(loading) */@keyframes loading { from { background-position: 0 0 } /* 第一個數(shù)字代表x軸坐標(biāo),第二個數(shù)字代表y軸坐標(biāo) */ 10% { background-position: -130px 0 } /* x坐標(biāo):-130 y坐標(biāo):0 */ 20% { background-position: -260px 0 } /* x坐標(biāo):-260 y坐標(biāo):0 */ 30% { background-position: -390px 0 } /* x坐標(biāo):-390 y坐標(biāo):0 */ 40% { background-position: -520px 0 } /* x坐標(biāo):-520 y坐標(biāo):0 */ 50% { background-position: 0 -130px } /* x坐標(biāo):0 y坐標(biāo):-130 */ 60% { background-position: -130px -130px } /* x坐標(biāo):-130 y坐標(biāo):-130 */ 70% { background-position: -260px -130px } /* x坐標(biāo):-260 y坐標(biāo):-130 */ 80% { background-position: -390px -130px } /* x坐標(biāo):-390 y坐標(biāo):-130 */ 90% { background-position: -520px -130px } /* x坐標(biāo):-520 y坐標(biāo):-130 */ /* 修改最后一幀,以便動畫結(jié)束后盒子就應(yīng)用最后一幀的樣式 */ to { /* 下一個動畫的寬高 */ width: 108px; height: 150px; /* 下一個動畫的雪碧圖 */ background-image: url(../img/animate.png); }}/* 定義動畫:動畫名(animate) */@keyframes animate { from { background-position: 0 } to { background-position: -2600px }}注意:寬高一定要按比例縮小,不能寬縮小三分之一,高縮小一半。要寬和高都同時縮小一半才能保持住比例。運(yùn)行結(jié)果:看起來怎么和咱們預(yù)想中的效果不太一樣呢?因?yàn)楹凶涌s小了一半,但是雪碧圖卻并沒有縮小,那么大家還記得之前的章節(jié)中我們講過的如果雪碧圖尺寸不吻合時怎么辦嗎?對沒錯!(大概率是不記得了)就是background-size: cover;/* 清除瀏覽器默認(rèn)邊距 */* { padding: 0; margin: 0; }body { /* 這段代碼是為了居中顯示,不是重點(diǎn),看不懂的話可以無視 */ height: 100vh; display: flex; align-items: center; justify-content: center; /* 添加背景圖 */ background: url(../img/bg.jpg) center / cover;}.animate { width: 130px; height: 130px; background: url(../img/rect.png); /* 動畫: 動畫名(loading) 時長(0.6秒) 運(yùn)行方式(step-end) 動畫次數(shù)(3次) 填充模式(雙向) */ animation: loading .6s step-end 3 both, /* 動畫可以定義多個,每個動畫用逗號分隔。*/ /* 第二個動畫的動畫名(animate) 時長(0.8秒) 運(yùn)行方式(step-end) 延時(1.8秒) 動畫次數(shù)(無限) */ animate .8s steps(12) 1.8s infinite;}/* 定義動畫:動畫名(loading) */@keyframes loading { from { background-position: 0 0 } /* 第一個數(shù)字代表x軸坐標(biāo),第二個數(shù)字代表y軸坐標(biāo) */ 10% { background-position: -130px 0 } /* x坐標(biāo):-130 y坐標(biāo):0 */ 20% { background-position: -260px 0 } /* x坐標(biāo):-260 y坐標(biāo):0 */ 30% { background-position: -390px 0 } /* x坐標(biāo):-390 y坐標(biāo):0 */ 40% { background-position: -520px 0 } /* x坐標(biāo):-520 y坐標(biāo):0 */ 50% { background-position: 0 -130px } /* x坐標(biāo):0 y坐標(biāo):-130 */ 60% { background-position: -130px -130px } /* x坐標(biāo):-130 y坐標(biāo):-130 */ 70% { background-position: -260px -130px } /* x坐標(biāo):-260 y坐標(biāo):-130 */ 80% { background-position: -390px -130px } /* x坐標(biāo):-390 y坐標(biāo):-130 */ 90% { background-position: -520px -130px } /* x坐標(biāo):-520 y坐標(biāo):-130 */ /* 修改最后一幀,以便動畫結(jié)束后盒子就應(yīng)用最后一幀的樣式 */ to { /* 下一個動畫的寬高 */ width: 108px; height: 150px; /* 下一個動畫的雪碧圖 */ background-image: url(../img/animate.png); /* 雪碧圖的最短邊(這里是高)剛好能夠覆蓋住盒子 */ background-size: cover; }}/* 定義動畫:動畫名(animate) */@keyframes animate { from { background-position: 0 } to { background-position: -2600px }}運(yùn)行結(jié)果:
整數(shù)相加 >>> 1 + 12浮點(diǎn)數(shù)相加 >>> 1.2 + 2.33.5復(fù)數(shù)相加 >>> x = 1 + 2j>>> y = 2 + 3j>>> x + y(3 + 5j)
# include <stdio.h>int main(){ int x,y,z; x=10; // 10 = 1010 y=15; // 15 = 1111 z=x&y; printf("x & y = %d\n", z); z=x|y; printf("x | y = %d\n", z); z=x^y; printf("x ^ y = %d\n", z); z=~x; printf("~ x = %d\n", z); z=~y; printf("~ y = %d\n", z); z=x<<2; printf("x << 2 = %d\n", z); z=y>>2; printf("x >> 2 = %d\n", z); return 0;}運(yùn)行結(jié)果如下:x & y = 10x | y = 15x ^ y = 5~ x = -11~ y = -16x << 2 = 40x >> 2 = 3那么我們分析一下這些結(jié)果。 10 = 1 0 1 0 15 = 1 1 1 110 & 15 = 1 0 1 0按照上節(jié)的表格計(jì)算后,發(fā)現(xiàn) 10 與 15 進(jìn)行位與計(jì)算后,結(jié)果為 10 。 10 = 1 0 1 0 15 = 1 1 1 110 | 15 = 1 1 1 1按照上節(jié)的表格計(jì)算后,發(fā)現(xiàn) 10 與 15 進(jìn)行位或計(jì)算后,結(jié)果為 15 。 10 = 1 0 1 0 15 = 1 1 1 110 ^ 15 = 0 1 0 1按照上節(jié)的表格計(jì)算后,發(fā)現(xiàn) 10 與 15 進(jìn)行位異或計(jì)算后,結(jié)果為 5 。 10 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0~ 10 = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1因?yàn)橐粋€整數(shù)是由 4 個字節(jié)組成,每個字節(jié)是 8 位,因此在 1010 前還有 28 個 0 存在。將這些 0 全部變?yōu)?1 ,這時的數(shù)字代表 -11。 15 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1~ 15 = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0在 1111 前還有 28 個 0 存在。將這些 0 全部變?yōu)?1 ,這時的數(shù)字代表 -40。 10 = 1 0 1 010 << 2 = 1 0 1 0 0 0把 10 向左移動兩位,右面的空余位置用 0 補(bǔ)齊。Tips:請?zhí)貏e注意,在向左移位的過程中,如果左移的位數(shù)超出數(shù)據(jù)的存儲最大位數(shù),那么將產(chǎn)生錯誤。下面的示例程序展示了這種錯誤。# include <stdio.h>int main(){ int x,y,z; x=10; // 10 = 1010 z=x<<200; printf("x << 200 = %d\n", z); return 0;}顯然超過了 int 類型可以表示的最大位數(shù)。在編譯的時候,會出現(xiàn)如下的錯誤。test.c: In function ‘main’:test.c:7:8: warning: left shift count >= width of type [-Wshift-count-overflow] z=x<<200; 15 = 1 1 1 115 >> 2 = 0 0 1 1把 15 向右移動兩位,左面的空位用 0 補(bǔ)齊。
bezierCurveTo 方法作用是繪制一條三次貝塞爾曲線。變量說明:變量名類型是否必須說明cpx1Number是控制點(diǎn)位置1的X坐標(biāo)。cpy1Number是控制點(diǎn)位置1的Y坐標(biāo)。cpx2Number是控制點(diǎn)位置2的X坐標(biāo)。cpy2Number是控制點(diǎn)位置2的Y坐標(biāo)。xNumber是終點(diǎn)位置的X坐標(biāo)。yNumber是終點(diǎn)位置的Y坐標(biāo)。
使用 line 元素表示直線:1090它包含 4 個屬性x1 起點(diǎn)的 x 坐標(biāo);y1 起點(diǎn)的 y 坐標(biāo);x2 終點(diǎn)的 x 坐標(biāo);y2 終點(diǎn)的 y 坐標(biāo)。
元組與列表很相似,都是有序的只讀序列,兩者有相同的方法和操作運(yùn)算,它們的區(qū)別在于:列表創(chuàng)建后,可以進(jìn)行修改元組創(chuàng)建后,不能進(jìn)行修改修改列表的示例如下:>>> x = [1, 2, 3]>>> x[0] = 11>>> x[11, 2, 3]在第 1 行,創(chuàng)建了列表 x在第 2 行,修改列表 x 的第 0 項(xiàng)元素在第 3 行,顯示修改后的列表在第 4 行,結(jié)果表示修改成功了修改元組的示例如下:>>> y = (1, 2, 3)>>> y[0] = 11Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: 'tuple' object does not support item assignment>>> y(1, 2, 3)在第 1 行,創(chuàng)建了元組 y在第 2 行,修改元組 y 的第 0 項(xiàng)元素在第 3 行,提示出現(xiàn) TypeError,因?yàn)?‘tuple’ object does not support item assignment,所以無法修改在第 6 行,顯示元組 y在第 7 行,結(jié)果表示元組 y 沒有被修改
這一句是聲明了 3 個整數(shù)型的變量。在 C 語言中,變量要先通過聲明類型,然后才能使用。這一點(diǎn)和某些編程語言有點(diǎn)不太一樣。不同的變量類型在 C 語言中會對應(yīng)不同的內(nèi)存分配大小。
尺寸的問題是解決了,怎么速度又不對了?原來是因?yàn)檠┍虉D縮小了一半,所以現(xiàn)在的寬只有 1300 px了??墒俏覀兌x的動畫是 -2600 px,于是乎動畫在相同的時間移動了 2 倍的距離,看起來就會導(dǎo)致速度加快。解決辦法也很簡單,把定義的動畫距離也同比例縮?。?* 清除瀏覽器默認(rèn)邊距 */* { padding: 0; margin: 0; }body { /* 這段代碼是為了居中顯示,不是重點(diǎn),看不懂的話可以無視 */ height: 100vh; display: flex; align-items: center; justify-content: center; /* 添加背景圖 */ background: url(../img/bg.jpg) center / cover;}.animate { width: 130px; height: 130px; background: url(../img/rect.png); /* 動畫: 動畫名(loading) 時長(0.6秒) 運(yùn)行方式(step-end) 動畫次數(shù)(3次) 填充模式(雙向) */ animation: loading .6s step-end 3 both, /* 動畫可以定義多個,每個動畫用逗號分隔。*/ /* 第二個動畫的動畫名(animate) 時長(0.8秒) 運(yùn)行方式(step-end) 延時(1.8秒) 動畫次數(shù)(無限) */ animate .8s steps(12) 1.8s infinite;}/* 定義動畫:動畫名(loading) */@keyframes loading { from { background-position: 0 0 } /* 第一個數(shù)字代表x軸坐標(biāo),第二個數(shù)字代表y軸坐標(biāo) */ 10% { background-position: -130px 0 } /* x坐標(biāo):-130 y坐標(biāo):0 */ 20% { background-position: -260px 0 } /* x坐標(biāo):-260 y坐標(biāo):0 */ 30% { background-position: -390px 0 } /* x坐標(biāo):-390 y坐標(biāo):0 */ 40% { background-position: -520px 0 } /* x坐標(biāo):-520 y坐標(biāo):0 */ 50% { background-position: 0 -130px } /* x坐標(biāo):0 y坐標(biāo):-130 */ 60% { background-position: -130px -130px } /* x坐標(biāo):-130 y坐標(biāo):-130 */ 70% { background-position: -260px -130px } /* x坐標(biāo):-260 y坐標(biāo):-130 */ 80% { background-position: -390px -130px } /* x坐標(biāo):-390 y坐標(biāo):-130 */ 90% { background-position: -520px -130px } /* x坐標(biāo):-520 y坐標(biāo):-130 */ /* 修改最后一幀,以便動畫結(jié)束后盒子就應(yīng)用最后一幀的樣式 */ to { /* 下一個動畫的寬高 */ width: 108px; height: 150px; /* 下一個動畫的雪碧圖 */ background-image: url(../img/animate.png); /* 雪碧圖的最短邊(這里是高)剛好能夠覆蓋住盒子 */ background-size: cover; }}/* 定義動畫:動畫名(animate) */@keyframes animate { from { background-position: 0 } to { background-position: -1300px }}運(yùn)行結(jié)果:911
Python 提供了與、或、非三種基本邏輯運(yùn)算,如下所示:邏輯運(yùn)算表達(dá)式功能描述與x and yx 和 y 都為真,則結(jié)果為真;x 為假或者 y 為假,則結(jié)果為假或x or yx 為真或者 y 為真,則結(jié)果為真; x 和 y 都為假,則結(jié)果為假非not xx 為真,則結(jié)果為假;x 為假,則結(jié)果為真
public static void main(String...s){ int delta = -1; BinaryOperator<Integer> add = (delta, y) -> delta + y + delta; //編譯報(bào)錯 add.apply(1,2); }我們將表達(dá)式的第一個參數(shù)的名稱由 x 改為 delta 時,編譯器會報(bào)錯說:Variable 'delta' is already defined in the scope
strokeRect 是使用設(shè)定的繪畫樣式,描繪一個起點(diǎn)在 (x, y) 、寬度為 w、高度為 h 的矩形的方法,它直接繪制一個矩形,而不是一個路徑,它有四個參數(shù)變量 x,y,width,height。變量說明:變量名類型是否必須說明xNumber是指定左上角位置的X坐標(biāo)。yNumber是指定左上角位置的Y坐標(biāo)。widthNumber是矩形的寬度值。heightNumber是矩形的高度值。
這里以安裝 nginx 為例,使用如下命令:yum -y install nginxTips:-y 表示不需要詢問直接安裝,nginx 表示軟件名。
使用 JS DOC 描述函數(shù)是非常良好的習(xí)慣,良好的 JS DOC 書寫還可以使用工具快速生成文檔。JS DOC 對函數(shù)的描述大體如下:/** * 這是這個求冪函數(shù) 計(jì)算 x 的 y 次方 * @param {Number} x - 底數(shù) * @param {String} y - 指數(shù) */function pow(x, y) { // ...}除此之外還可以描述返回值等。
BinaryOperator<Long> add = (Long x, Long y) -> x+y ;通常 Lambda 的參數(shù)類型都有編譯器推斷得出的,也可以顯示的聲明參數(shù)類型。
rect 方法作用是繪制一個起點(diǎn)在 (x, y) 、寬度為 width、高度為 height 的矩形路徑,它有四個參數(shù)變量 x,y,width,height。變量說明:變量名類型是否必須說明xNumber是指定左上角位置的X坐標(biāo)。yNumber是指定左上角位置的Y坐標(biāo)。widthNumber是矩形的寬度值。heightNumber是矩形的高度值。
在機(jī)器學(xué)習(xí)中我們最經(jīng)常使用的就是張量的梯度了,張量的梯度可以理解為張量的微分。因?yàn)樵跈C(jī)器學(xué)習(xí)之中我們需要不斷地計(jì)算參數(shù)的導(dǎo)數(shù)來計(jì)算出參數(shù)的誤差,從而對參數(shù)進(jìn)行調(diào)整。在 TensorFlow 之中,計(jì)算張量的梯度是通過 tf.tf.GradientTape 來進(jìn)行的,具體來說分為兩步:在梯度帶中定義運(yùn)算;運(yùn)算結(jié)束后從梯度帶中得到梯度。下面我們以一個簡單的例子來展示一下如何求得梯度:x = tf.Variable(5.0)with tf.GradientTape() as tape: y = x**2dy_dx = tape.gradient(y, x)print(dy_dx.numpy())在上面的例子之中,我們首先定義了一個常量 x,然后我們在梯度帶中定義 y 為 x 的平方,然后我們便在記錄的梯度帶中求得 y 對于 x 的梯度,在這里就相當(dāng)于導(dǎo)數(shù)。因?yàn)?x * *2 的導(dǎo)數(shù)為 2 * x,因此我們得到的梯度應(yīng)該是 2 * 5 = 10。我們查看輸出,果然結(jié)果是6。10.0上面我們是通過一個常量來進(jìn)行的演示,其實(shí)梯度可以應(yīng)用于任意的張量,下面我們以一個張量來進(jìn)行演示:a = tf.Variable(tf.random.normal((3, 2)), name='a')b = tf.Variable(tf.zeros(2), name='b')x = [[1., 2., 3.]]with tf.GradientTape(persistent=True) as tape: y = tf.matmul(x, a) + b loss = tf.reduce_mean(y**2) # 計(jì)算y**2的平均值[dl_da, dl_db] = tape.gradient(loss, [a, b])print(a)print(dl_da, dl_db)在這里我們定義了 a 和 b 兩個張量,并定義了一個常數(shù) x;然后我們在梯度帶中計(jì)算了 y = a * x + b,然后又計(jì)算了 y 平方的平均值(賦值為 loss );計(jì)算結(jié)束后我們計(jì)算了 loss 對于 a 和 b 的梯度,并將其輸出。我們可以得到以下結(jié)果,可以看到 TensorFlow 已經(jīng)幫助我們計(jì)算了梯度:<tf.Variable 'a:0' shape=(3, 2) dtype=float32, numpy=array([[-0.16581778, -0.5726858 ], [ 0.65533674, 0.8761684 ], [ 0.7585775 , -1.0951476 ]], dtype=float32)>tf.Tensor([[ 3.4205883 -2.1057918] [ 6.8411765 -4.2115836] [10.261765 -6.317375 ]], shape=(3, 2), dtype=float32) tf.Tensor([ 3.4205883 -2.1057918], shape=(2,), dtype=float32)
在函數(shù)調(diào)用時經(jīng)常會向函數(shù)中傳遞參數(shù),但是,當(dāng)我們的參數(shù)是數(shù)組中的項(xiàng)時,我們需要把數(shù)組中的每一項(xiàng)取出來,然后傳入函數(shù)中,這樣顯得很麻煩,能不能有個方式直接把數(shù)組傳入進(jìn)去呢?首先我們看個求和的例子:function sum(x, y) { return x + y;}console.log(sum(1, 2)); // 3const data = [1,2];console.log(sum(data[0], data[1])); // 3上面的 sum 是一個求和函數(shù),接受兩個參數(shù),我們可以在調(diào)用時直接傳遞 2 個參數(shù)。但這個時候我們希望求 data 數(shù)組中的和,這個時候只能取出 data 中的每一項(xiàng)值傳遞到函數(shù)中去,這樣無疑是一個很笨的方法,在 ES5 的時候可以使用 apply() 對函數(shù)進(jìn)行間接的調(diào)用解決這個問題。function sum(x, y, z) { return x + y + z;}const data = [1,2,3];console.log(sum.apply(null, data)); // 6使用 apply() 的方法是解決了這個問題,但是可能會使我們理解代碼增加了難度。有了 ES6 的展開語法,這個問題就會輕而易舉地解決了。function sum(x, y, z) { return x + y + z;}const data = [1,2,3];console.log(sum(...data)); // 6上面的方法使用展開語法把 data 數(shù)組中的每一項(xiàng)進(jìn)行展開,成為 sum 函數(shù)中的三個參數(shù)。
在對象解構(gòu)出來的變量不是我們想要的變量命名,這時我們需要對它進(jìn)行重命名。var {a:x = 8, b:y = 3} = {a: 2};console.log(x); // 2console.log(y); // 3這里把 a 和 b 的變量名重新命名為 x 和 y。
命令 pip3 uninstall package-name 卸載名稱為 package-name 的第三方模塊。卸載 requests 模塊,示例如下:C:\>pip3 uninstall requestsUninstalling requests-2.23.0: c:\python3\lib\site-packages\requests-2.23.0.dist-info\installer c:\python3\lib\site-packages\requests-2.23.0.dist-info\license c:\python3\lib\site-packages\requests-2.23.0.dist-info\metadata c:\python3\lib\site-packages\requests-2.23.0.dist-info\record c:\python3\lib\site-packages\requests-2.23.0.dist-info\top_level.txt c:\python3\lib\site-packages\requests-2.23.0.dist-info\wheel c:\python3\lib\site-packages\requests\__init__.py ...Proceed (y/n)? y Successfully uninstalled requests-2.23.0卸載 requests 模塊時,首先列出該模塊相關(guān)的文件,在刪除這些文件前,程序要求用戶輸入 y 進(jìn)行確認(rèn)。用戶輸入 y 后,pip3 就會卸載該模塊。
union() 方法返回兩個集合的并集,示例如下:>>> x = {1, 2, 3}>>> y = {4, 5, 6}>>> z = x.union(y)>>> z{1, 2, 3, 4, 5, 6}在第 3 行,使用 union() 方法返回集合 x 和集合 y 的并集在第 4 行,顯示兩個集合的并集
quadraticCurveTo 方法作用是繪制一條二次貝塞爾曲線。變量說明:變量名類型是否必須說明cpxNumber是控制點(diǎn)位置的X坐標(biāo)。cpyNumber是控制點(diǎn)位置的Y坐標(biāo)。xNumber是終點(diǎn)位置的X坐標(biāo)。yNumber是終點(diǎn)位置的Y坐標(biāo)。
Kotlin 的空安全設(shè)計(jì)對于聲明可為空的參數(shù),在使用時要進(jìn)行空判斷處理,有兩種處理方式,字段后加!!像 Java 一樣拋出空異常,另一種字段后加?可不做處理返回值為 null 或配合 ?: 做空判斷處理//類型后面加?表示可為空var age: String? = "23"http://字段后面加"!!"拋出空指針異常val ages = age!!.toInt()//字段后面加”?“不做處理返回 nullval ages1 = age?.toInt()//使用”?:“ 表示age為空返回-1val ages2 = age?.toInt() ?: -1當(dāng)一個引用可能為 null 值時, 對應(yīng)的類型聲明必須明確地在類型后面標(biāo)記為”?“表示可為 null。 當(dāng) str 中的字符串內(nèi)容不是一個整數(shù)時, 返回 null:fun main(args: Array<String>) { if (args.size < 2) { println("Two Integers Expected") return } val x = parseInt(args[0]) val y = parseInt(args[1]) //println(x + y) 由于標(biāo)識了可能為null,直接使用x + y在編譯器看來是非法,需要去做非空判斷 if (x != null && y != null) { println(x + y) }}fun parseInt(s: String): Int? {//表示當(dāng)前函數(shù)返回值可能為null,就必須在類型后面標(biāo)識"?" return s.toInt()}
numpy.linalg.solve() 函數(shù)給出了矩陣形式的線性方程的解。案例對于如下方程組:x + y + z =102x + y = 63y -2z = 2將方程組轉(zhuǎn)化為矩陣形式:Ax=b,則有:A = np.array([[1, 1, 1], [2, 1, 0], [0, 3, -2]])b = np.array([[10], [6], [2]])求解方程組:np.linalg.solve(A, b)out: array([[1.], [4.], [5.]])即上述方程組的解為:x=1,y=4,z=5。
issubset() 方法判斷指定集合是否為子集,示例如下:>>> x = {1, 2, 3}>>> y = {1, 2}>>> y.isubset(x)True在第 3 行,使用 issubset() 方法判斷集合 y 是否為集合 x 的子集在第 4 行,結(jié)果表明集合 {1, 2} 是集合 {1, 2, 3} 的子集
declare function f<T extends boolean>(x: T): T extends true ? string : numberconst x = f(Math.random() < 0.5) // const x: string | numberconst y = f(true) // const y: stringconst z = f(false) // const z: number代碼解釋:第 3 行,可以看到在條件不確定的情況下,得到了聯(lián)合類型 string | number。最后兩行,條件確定時,得到了具體類型 string 或 number。
到這里有個問題,到底什么是原型,原型是怎么來的。首先看一段代碼:function Point(x, y) { this.x = x; this.y = y;}var point = new Point(1, 2);console.log(point.__proto__);這樣打印出來的 point 的原型對象,除了 constructor 和 __proto__ 屬性,就什么都沒有了。接下來做個改寫:function Point(x, y) { this.x = x; this.y = y;}Point.prototype.info = function() { console.log('x: ' + this.x + ', y: ' + this.y);};var point = new Point(1, 2);point.info(); // 輸出:"x: 1, y: 2"console.log(point.__proto__);這樣輸出的 point 的原型對象,就具有了一個 info 方法。從這就可以看出對象的原型,和他的構(gòu)造函數(shù)的 prototype 屬性是有關(guān)的。所有函數(shù)都具有一個 prototype 屬性,翻譯過來也是 原型的意思。當(dāng)一個函數(shù)作為構(gòu)造函數(shù)被調(diào)用的時候,就會把這個函數(shù)的 prototype 屬性,作為構(gòu)造函數(shù)生成的對象的原型。使用相等運(yùn)算符,就可以驗(yàn)證上面這個規(guī)則:console.log( point.__proto__ === Point.prototype,); // 輸出:true這就是一個對象原型的由來。如果要知道對象由哪個構(gòu)造函數(shù)生成,可以從 constructor 屬性獲取到,原型對象的 constructor 屬性則指向這個原型所處的函數(shù)。這一點(diǎn)也可以由相等運(yùn)算符驗(yàn)證,point 對象的 constructor 屬性和其原型對象下的 constructor 應(yīng)該都指向同一個,也就是 Point 函數(shù)。console.log( point.constructor === point.__proto__.constructor, // 輸出:true point.constructor === Point, // 輸出:true point.__proto__.constructor === Point, // 輸出:true);事實(shí)上對象的 constructor 屬性就是直接從原型上繼承的。
在 Lambda 表達(dá)式中試圖修改局部變量是不允許的,那么我們在后面對 delta 賦值會怎么樣呢?public static void main(String...s){ int delta = -1; BinaryOperator<Integer> add = (x, y) -> x+y+ delta; //編譯報(bào)錯 add.apply(1,2); delta = 2;}這個時候編譯器會報(bào)錯說:Variable used in lambda expression should be final or effectively final
數(shù)值類型的數(shù)據(jù)表示整數(shù)、浮點(diǎn)數(shù)、復(fù)數(shù),例如:整數(shù) 123浮點(diǎn)數(shù) 123.456復(fù)數(shù) 1 + 2j數(shù)值類型通常用于數(shù)值計(jì)算的場合,例如:整數(shù)運(yùn)算>>> 1 + 12浮點(diǎn)數(shù)運(yùn)算>>> 1.1 + 1.12.2復(fù)數(shù)運(yùn)算>>> x = 1 + 2j>>> y = 3 + 4j>>> x + y(4 + 6j)
通過上面小節(jié)的例子,想必大家已經(jīng)對使用 TensorFlow 進(jìn)行梯度求解有了一個大體的了解。具體來說,我們大致需要經(jīng)過幾個步驟進(jìn)行自動微分的操作:定義梯度帶 tf.GradientTape () 的上下文;指定我們要跟蹤梯度的數(shù)據(jù),tape.watch();在梯度帶上下文之中進(jìn)行我們想要的操作(一般是讓數(shù)據(jù)通過網(wǎng)絡(luò));通過得到的結(jié)果來使用梯度帶求得各個參數(shù)的梯度;后續(xù)的操作,比如根據(jù)梯度進(jìn)行優(yōu)化等。那么讓我們來看一個更加實(shí)際一些的例子,使用矩陣進(jìn)行運(yùn)算。import tensorflow as tfx = tf.ones((5, 5))with tf.GradientTape() as t: t.watch(x) y = tf.reduce_sum(x) y = tf.reduce_sum(y+x) z = tf.multiply(y, y)dz_dx = t.gradient(z, x)print(dz_dx)我們可以得到輸出,值得注意的是,因?yàn)槲覀兊妮斎攵际蔷仃嚕虼说玫降奶荻纫彩且粋€矩陣:tf.Tensor([[33800. 33800. 33800. 33800. 33800.] [33800. 33800. 33800. 33800. 33800.] [33800. 33800. 33800. 33800. 33800.] [33800. 33800. 33800. 33800. 33800.] [33800. 33800. 33800. 33800. 33800.]], shape=(5, 5), dtype=float32)如此,我們便求得了梯度,這是我們進(jìn)行自定義網(wǎng)絡(luò)的第一步,下一步,我們要將整個網(wǎng)絡(luò)的計(jì)算放在梯度帶的上下文之中進(jìn)行計(jì)算。