第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
2. Linux 下安裝 Python

Linux 下安裝 Python 比較簡單,只需要運行一條命令即可:sudo apt-get install python3.8安裝過程中,出現(xiàn)如下畫面時候,輸入 y,點擊 enter 即可,如下圖所示:安裝成功后,輸入 pyton3.8 ,如果如下圖所示,則說明安裝成功。

2.1 Map 基本說明

在前面的 數(shù)據(jù)結(jié)構(gòu)擴(kuò)展 一節(jié)我們已經(jīng)了解到 Map 的基本使用。和 Set 一樣,Map 也是一個構(gòu)造函數(shù),不能直接使用,需要通過 new 的方式來創(chuàng)建一個 Map 實例。var map = Map([iterable]);Map 對象在插入數(shù)據(jù)時是按照順序來插入的,也就是說在插入時會保持插入的位置,Object 的在插入數(shù)據(jù)時沒有順序概念。Map 對象可以被 for...of 循環(huán),在每次迭代后會返回一個形式為 [key,value] 的數(shù)組,這個我們在下面的例子中會說到。Map 的本質(zhì)其實還是一個對象,并且它也是繼承 Object 的,看下面的實例:var map = new Map([["x", 1], ["y", 2]]);console.log(map instanceof Object); //true從上面的代碼中可以看出 Object 在實例 map 的原型鏈上。在創(chuàng)建 Map 實例時可以接收一個數(shù)組或是一個可遍歷的對象作為參數(shù),這個參數(shù)內(nèi)的每一項是鍵值的組合 [key, value] 第一個值時鍵,第二個值時鍵的值。在初始化 Map 對象時,如果默認(rèn)參數(shù)的數(shù)組中超過兩個以上的值不會被 Map 對象讀取。var map = new Map([["x", 1, 'a', 'b'], ["y", 2, 'c'], ["z", 3, 'd']]);console.log(map) // Map(3) {"x" => 1, "y" => 2, "z" => 3}上面的代碼中,從打印的結(jié)果可以看出,數(shù)組中超過的元素都會被自動忽略。

3. 小結(jié)

這里一定要記住這幾個要點:上欄和下欄的寬度加起來要剛好是屏幕的高度;下欄一定要寫 overflow-y: auto;下欄的背景什么的最好寫在子元素上,除非你就是想要這種背景不動的效果。

4.1 基本步驟

step1: 主菜單 File -> New -> Project, 選擇 Scientificstep2: 在項目設(shè)置對話框窗口中,指定項目名稱,確保將 Conda 選為新環(huán)境,然后單擊"Create"。step3: 自動創(chuàng)建了 main.py并且打開, 在其中加下面的代碼。(主要功能是用拆線圖展示北京與上海兩個城市一小時的溫度變化曲線。Tips: 使用Conda 解釋器,像Numpy , matplotlib 基本的科學(xué)計算包都已經(jīng)自帶了,不需要再單獨安裝。)# 畫出溫度變化圖import randomimport matplotlib.pyplot as plt# 準(zhǔn)備x, y坐標(biāo)的數(shù)據(jù)x = range(60)y_shanghai = [random.uniform(15, 18) for i in x]# 增加北京的溫度數(shù)據(jù)y_beijing = [random.uniform(1, 3) for i in x]# 創(chuàng)建畫布plt.figure(figsize=(20, 8), dpi=80)# 繪制折線圖# plt.plot(x, y_shanghai)plt.plot(x, y_shanghai, label="SHANGHAI")# 使用多次plot可以畫多個折線plt.plot(x, y_beijing, color='r', linestyle='--', label="BEIJING")# 顯示圖例plt.legend(loc="best")# 構(gòu)造x軸刻度標(biāo)簽x_ticks_label = ["11:{}".format(i) for i in x]# 構(gòu)造y軸刻度y_ticks = range(40)# 修改x,y軸坐標(biāo)的刻度顯示plt.xticks(x[::5], x_ticks_label[::5])plt.yticks(y_ticks[::5])# 添加網(wǎng)格顯示plt.grid(True, linestyle='--', alpha=0.5)# 添加x軸、y軸描述信息及標(biāo)題plt.xlabel("Time")plt.ylabel("Temperature")plt.title("Temperature Change between 11am and 12am")# 顯示圖像plt.show()step4: PyCharm 內(nèi)需啟用 Scientific Mode 才能正常顯示 matplotlib 相關(guān)圖表。主菜單View -> Scientific Mode。step5: 運行項目?F10 (Shift + F10), 代碼執(zhí)行完畢,會有如下三個工具窗口顯示:"SciView"工具窗口。它有兩個選項卡, "data"選項卡中預(yù)覽數(shù)據(jù)幀,在"plot"選項卡中預(yù)覽 matplotlib 圖表;"Documentation"工具窗口,顯示編輯器內(nèi)光標(biāo)插入位置處對象的內(nèi)聯(lián)文檔,比如光標(biāo)停留在matplotlib 包導(dǎo)入的地方,就會顯示 matplotlib 的相關(guān)信息;Python 控制臺。執(zhí)行完畢后,自動打開,程序中涉及變量詳細(xì)值也在右側(cè)邊欄自動顯示出來。

9. 區(qū)間 Range

在 Kotlin 中使用in運算符來檢測某個數(shù)字是否在指定的區(qū)間內(nèi),區(qū)間表達(dá)式具有操作符形式"…"的rangeTo函數(shù)輔助in和!in組合而成。區(qū)間可以支持任何可以比較的類型,對于原生的整型,內(nèi)部有一個優(yōu)化的實現(xiàn)。比如以下幾種使用場景:1. 檢測某個數(shù)字是否在指定區(qū)間內(nèi):val x = 10val y = 9if (x in 1..y + 1) {//表示x是否在1~y+1范圍內(nèi)。 println("fits in range")}2. 檢測某個數(shù)字是否在指定區(qū)間外:val list = listOf("a", "b", "c")if (-1 !in 0..list.lastIndex) { println("-1 is out of range")}if (list.size !in list.indices) { println("list size is out of valid list indices range too")}3. 區(qū)間迭代:for(x in 1..10){//相當(dāng)于 x >= 1 && x <= 10 println(x)}//或者fun printList(num: Int) { for (i in 1..num) {//相當(dāng)于 i >= 1 && i <= num print(i) }}//或者使用until 函數(shù)排除結(jié)束元素for (i in 1 until 10) {// i in [1, 10) 排除了 10,相當(dāng)于 i >= 1 && i < 10 println(i)} 4. 數(shù)列迭代 :for(x in 1..100 step 2){//遞增數(shù)列迭代,每次間隔步長是2;1,3,5,7... println(x)}for(x in 9 downTo 0 step 3){//遞減數(shù)列迭代,每次間隔步長是3;9,6,3,0 println(x)}

2. Vim 刪除、復(fù)制與粘貼基礎(chǔ)操作

Vim 刪除、復(fù)制與粘貼基礎(chǔ)操作快捷鍵如下:快捷鍵功能d剪切選定文本內(nèi)容y復(fù)制選定文本內(nèi)容p/P粘貼到光標(biāo)前/后u撤銷上一步操作Ctrl+r恢復(fù)之前撤銷操作

2. 計算文本寬度

canvas 為我們提供了一個計算文本寬度的方法:measureText 方法,方法返回一個 TextMetrics 對象,包含關(guān)于文本尺寸的信息,里面就有文本寬度。我們看一個案例:1499運行結(jié)果:上面案例中,我們封裝了一個函數(shù),可以繪制自適應(yīng)大小的按鈕,讓我們拆分講解一下主要代碼。先看繪制按鈕的封裝函數(shù) drawBtn,函數(shù)傳入了三個參數(shù),分別是繪制文本以及繪制文本的起點坐標(biāo) (x, y)。function drawBtn(str, x, y ){ ...}(1)獲取到繪制文本的寬度和高度,其實文本的高度就是設(shè)置的文本字體的大小值,這里我們用了一個小技巧拿到了設(shè)置的文本大小。 var w = ctx.measureText(str).width; // 獲取到繪制文本的寬度w var h = parseInt(ctx.font) // 通過小技巧獲取到了文本高度h(2)設(shè)置按鈕背景為 #456795 這個顏色,并且繪制了一個矩形,這里矩形坐標(biāo)我們向左上方移動了10個像素,目的是給按鈕添加一個內(nèi)邊距,美觀一些,因為左側(cè)有10個像素邊距,右側(cè)也有10個像素邊距,所以我們給背景的矩形框的長度增加了20個像素,高度同理,也增加了20個像素。 ctx.fillStyle="#456795"; ctx.fillRect(x-10,y-10,w+20,h+20)(3)設(shè)置文字的顏色為白色,把文字的基線設(shè)置為 hanging,這樣做的目的是將文本左上角和基線對齊,方便計算,我們也可以設(shè)置為其他值,不過計算起來會比較麻煩。 ctx.fillStyle="#fff"; ctx.textBaseline="hanging"(4)繪制文本。 ctx.fillText(str,x,y)設(shè)置字體大小為16像素,調(diào)用封裝函數(shù)繪制文字。 ctx.font="16px 微軟雅黑"; drawBtn("慕課Wiki",40,40)設(shè)置字體大小為18像素,調(diào)用封裝函數(shù)繪制文字。 ctx.font="18px 微軟雅黑"; drawBtn("Imooc教程 Hello World", 40, 90)設(shè)置字體大小為20像素,調(diào)用封裝函數(shù)繪制文字。 ctx.font="20px 微軟雅黑"; drawBtn("確認(rèn)", 40, 140)

3.2 Series 常用的方法

另外 Series 中還提供了豐富的函數(shù),方便我們來進(jìn)行操作,下面我們列舉了幾個常用的操作方法。常用函數(shù)函數(shù)描述Series()創(chuàng)建一個 Series 數(shù)據(jù)結(jié)構(gòu)的對象isnull()和notnull()用于檢測缺失數(shù)據(jù)argmin()和argmax()返回對應(yīng)條件值的索引位置copy()復(fù)制一個 Series,注意淺拷貝和深拷貝reindex([x,y,…])重返回一個適應(yīng)新索引的新對象,缺失索引對應(yīng)數(shù)值使用默認(rèn)值 NaNdrop()丟棄指定索引的項下面我們分別看一下每個方法的具體操作實例:Series() 方法該方法用于創(chuàng)建一個一維數(shù)組的對象,通過該方法有多種方式去創(chuàng)建 Series 對象:方式一:Series([x,y,…])、方式二:Series([x,y,…], index=[param1,param1,…])、方式三:Series({“a”:x,“b”:y,…})# 引入pandasimport pandas as pd# 形式一:Series([x,y,...])obj=pd.Series([12,23,34,45])print(obj)#--- 輸出結(jié)果 ---0 121 232 343 45dtype: int64# 形式二:Series([x,y,...], index=[param1,param1,...])obj=pd.Series([12,23,34,45],index=["a","b","c","d"])print(obj)#--- 輸出結(jié)果 --- # 該形式,我們可以指定它的索引列的值a 12b 23c 34d 45dtype: int64# 形式三:Series({"a":x,"b":y,...})obj2=pd.Series({"a":12,"b":33,"c":5,"d":22})print(obj2)#--- 輸出結(jié)果 ---# 這里我們里面?zhèn)魅氲氖且粋€字典,他的key就會對應(yīng)成索引列,value對應(yīng)數(shù)據(jù)列a 12b 33c 5d 22dtype: int64isnull() 和 notnull() 方法isnull() 是缺失值返回 Ture 運行結(jié)果,而 notnull() 則不是缺失值的返回 Ture 運行結(jié)果# 引入pandasimport pandas as pdobj=pd.Series([12,23,34,45],index=["a","b","c","d"])print(obj.isnull())#--- 輸出結(jié)果 ---a Falseb Falsec Falsed Falsedtype: bool print(obj.notnull())#--- 輸出結(jié)果 ---a Trueb Truec Trued Truedtype: boolargmin() 和 argmax() 方法argmin() 用于返回最小值索引的位置,argmax() 用于返回最大值索引的位置# 引入pandasimport pandas as pdobj2=pd.Series({"a":12,"b":33,"c":5,"d":22})print(obj2.argmin())# --- 輸出結(jié)果 ---2 #最小值的索引為2,因為索引是從0開始的,我們最小值為5,print(obj2.argmax())# --- 輸出結(jié)果 ---1 #最小值的索引為1,最大值是33,copy( ) 方法該方法為拷貝一個 Series,但要注意里面的 deep 設(shè)置,也就是深拷貝 copy(deep=True) 和淺拷貝copy(deep=False) 的問題。淺拷貝:拷貝父對象,不會拷貝對象的內(nèi)部的子對象,只復(fù)制對象本身,沒有復(fù)制該對象所引用的對象;深拷貝:完全拷貝了父對象及其子對象,新的組合對象與原對象沒有任何關(guān)聯(lián)。# 引入pandasimport pandas as pdobj2=pd.Series({"a":12,"b":33,"c":5,"d":22})# 1.cpys 淺拷貝cpys = obj2.copy(deep=False)cpys['a']=0print(cpys)print(obj2)# --- 輸出結(jié)果 ---# 這是淺拷貝之后的cpysa 0b 33c 5d 22dtype: int64# 這是被拷貝的 obj2a 0b 33c 5d 22dtype: int64# 通過上面的輸出結(jié)果,我們可以看到,我們對拷貝后的對象進(jìn)行修改,也會影響到被淺拷貝的對象,進(jìn)而證明了,淺拷貝只復(fù)制對象本身,沒有復(fù)制該對象所引用的對象 # 2.cpys_deep深拷貝cpys_deep = obj2.copy(deep=True)cpys_deep['a']=0print(cpys_deep)print(obj2)# --- 輸出結(jié)果 ---# 這是深拷貝之后的cpys_deepa 0b 33c 5d 22dtype: int64# 這是被拷貝的 obj2a 12b 33c 5d 22dtype: int64 # 我們通過輸出結(jié)果,可以看到 索引a,obj和cps_deep的值是不一樣的,我們修改拷貝后的對象,并不能影響到被拷貝的對象,這就是深拷貝,它完全拷貝了父對象及其子對象,和之前的對象是相互獨立的。reindex([x,y,…]) 方法該方法會將源 Series 對象,按照新的索引順序生成新的 Series 對象,默認(rèn)如果沒有對應(yīng)索引的則使用默認(rèn)值NaN。( NaN 即"?數(shù)字" (not a number),在 Pandas 中,它?于表示缺失或NA值 )# 引入pandasimport pandas as pdobj=pd.Series([12,23,6,145,44],index=["a","b","c","d","e"])rs_obj=obj.reindex(["e","d","c","b","a","f","g"])print(rs_obj)#--- 輸出結(jié)果 ---e 44.0d 145.0c 6.0b 23.0a 12.0f NaNg NaNdtype: float64# 這里我們看到按照我們寫的索引的順序,生成了一個新的對象rs_obj,沒有值的默認(rèn)為NaN進(jìn)行填充。drop( ) 方法該方法通過傳入指定的索引,丟棄對應(yīng)的數(shù)據(jù)項,返回一個新的 Series 對象。# 引入pandasimport pandas as pdobj=pd.Series([12,23,6,145,44],index=["a","b","c","d","e"])drop_obj=obj.drop(["e","d"])print(obj)print(drop_obj)#--- 輸出結(jié)果 ---# 源對象a 12b 23c 6d 145e 44dtype: int64# drop操作后新的對象 drop_obja 12b 23c 6dtype: int64

3. 使用 yum 命令安裝 vim 編輯器

使用 yum 命令安裝 vim 編輯器命令如下:yum -y install vim執(zhí)行結(jié)果如下圖:等待安裝完成輸入 vim -v 即可查看到 vim 編輯器的相關(guān)信息:Tips:在如圖所示的窗口下,可以輸入 :q 回車就能退出。

1. 前言

除了將上下欄固定在屏幕上,我們還有另一種選擇,那就是上下欄和主盒子都在屏幕的那個位置不動,那有人可能會說了,主盒子里的內(nèi)容要是多了,超出了屏幕的高度該怎么辦呢?這就要用到一個屬性叫做 overflow-y:

1. Vim VS Windows

Vim 中的刪除、復(fù)制、粘貼于 Windows 下的還是有細(xì)微不同的,具體看下表:Windowsvim比較cutdeletevim delete 和windows 剪切差不多,不是真正的刪除copyyank含義相同,只是為了避免c(change)沖突,改成了y(yank)pasteput粘貼含義享同而且首字母都是p,方便記憶和操作

3.3 as 命令

as 命令是用來重命名的,在使用 import 命令導(dǎo)入時可以使用 as 來更改變量名。// a.jslet a = 1;let b = 2;export { a, b,}// main.jsimport { a, b as y } from './a';console.log(a, y); // 1,2如果模塊中同時有 export default 導(dǎo)出和 export 導(dǎo)出時,在導(dǎo)入時可以使用 as 對默認(rèn)導(dǎo)出進(jìn)行重命名。// a.jslet a = 1;let b = 2;export { a, b,}export default let c = 3;// main.jsimport { a, b, default as c } from './a'// 等價于下面直接在外面進(jìn)行使用import c, { a, b } from './a'默認(rèn)導(dǎo)出的內(nèi)容也可以放在 export 導(dǎo)出的對象中,但是需要使用 as default 命令:// a.jslet a = 1;let b = 2;let c = 'imooc';export { a, b, c as default, // 相當(dāng)于 export default 'imooc',給導(dǎo)出的對象增加一個default屬性}

實例

614運行結(jié)果語句2由于 x > 0 條件成立,所以會執(zhí)行 if 語句后面的程序,緊接著就要下一個判斷, y > z ,顯然這個是不成立的,所以執(zhí)行了 else 里面的語句。大家可以嘗試修改上面的程序,修改片段條件,或者增加新的分支。

2.4 解構(gòu)賦值

在批量定義有默認(rèn)值的變量時可以使用數(shù)組的解構(gòu)賦值。// badconst a = 1, b = 2, c = 3;// goodconst [a, b, c] = [1, 2, 3];在獲取數(shù)組或?qū)ο笾兄禃r也可以優(yōu)先使用解構(gòu)的方式:const arr = [1, 2, 3, 4];const obj = {a: 1, b: 3};// badconst x = arr[0];const y = arr[1];const a = obj.a;const b = obj.b;// goodconst [x, y] = arr;const [a, b] = obj;在函數(shù)參數(shù)中,如果函數(shù)接收的參數(shù)是一個對象時,可以直接在函數(shù)的括號中解構(gòu)對象,這樣可以在函數(shù)內(nèi)部之間使用變量。// badfunction getFullName(user) { const firstName = user.firstName; const lastName = user.lastName;}// goodfunction getFullName(obj) { const { firstName, lastName } = obj;}// bestfunction getFullName({ firstName, lastName }) {}對于函數(shù)中有返回值是對象時,對象中屬性名和要返回的變量名相同時可以省了變量。// badfunction foo() { const a = 'aaa'; const b = 'bbb'; return { a: a, b: b }}// goodfunction foo() { const a = 'aaa'; const b = 'bbb'; return { a, b }}

2.2 條形圖

條形圖是用橫向的柱子來展現(xiàn)數(shù)據(jù),一般用于縱向的數(shù)據(jù)對比,其實就是 x 軸、y 軸對調(diào)的柱狀圖。例如上例中,對調(diào) xAxis、yAxis 的配置值就可以實現(xiàn)條形圖,示例:1355示例效果:

3.1 使用 export 導(dǎo)出聲明

任何聲明(比如變量,函數(shù),類,類型別名或接口)都能夠通過添加 export 關(guān)鍵字來導(dǎo)出。export.ts:export const a: number = 1export const add = (x: number, y:number) => x + y export interface User { nickname: string, department: string}export class Employee implements User { public nickname!: string public department!: string}export type used = true | false解釋: 每個聲明都通過 export 關(guān)鍵字導(dǎo)出。

2. 鏈表成環(huán)問題

面試官提問:給定一個單鏈表,判斷鏈表是否存在環(huán)?能否在不使用額外空間的情況下解決問題?題目解析:鏈表成環(huán)問題是來源于算法網(wǎng)站LeetCode的經(jīng)典題目,題目鏈接:https://leetcode.com/problems/linked-list-cycle/。暴力破解方法是使用額外的數(shù)組結(jié)構(gòu),數(shù)組每一個元素存儲鏈表的值以及節(jié)點哈希地址,在遍歷鏈表的時候,如果發(fā)現(xiàn)遍歷到相同哈希地址的節(jié)點,說明鏈表有環(huán),否則直到遍歷到鏈表末尾節(jié)點為止。但是面試官要求在原始數(shù)組上操作,空間復(fù)雜度控制在O(1)。使用單個指針則沒有記憶能力,所以肯定要使用兩個以上的指針遍歷鏈表,最常用解法就是快慢指針法。經(jīng)典快慢指針的算法核心思路是:(1)初始定義:定義一個指針 slow,每次走一個 Node 節(jié)點;定義一個指針 fast,每次走兩個 Node 節(jié)點;(2)終止條件一:當(dāng)快指針走到了 Null 節(jié)點,說明鏈表沒有成環(huán);(3)終止條件二:當(dāng)快指針和慢指針同時走到了一個節(jié)點,說明該鏈表有環(huán);(4)附加計算一:當(dāng)滿足鏈表有環(huán)時,將慢指針重置到鏈表頭部,然后快慢指針同時走,每次只走一個節(jié)點,當(dāng)兩個指針再次相遇時,相遇點即是鏈表的環(huán)入口;(5)附加計算二:當(dāng)滿足鏈表有環(huán)時,停止快指針,每次慢指針走一個 Node 節(jié)點,當(dāng)兩個節(jié)點再次相遇時,慢指針重新走的長度即是鏈表長度。最重要的環(huán)節(jié)在于如何證明慢指針和快指針會在環(huán)中相遇,我們假設(shè)一個通用的有環(huán)鏈表如下圖所示:環(huán)狀鏈表其中A—>B 的距離為 x,B—>C 的距離為y,C—>B 的距離為 z。假設(shè)慢指針走了a步,那么快指針走了2a步,因為相遇時快指針已經(jīng)在環(huán)上循環(huán)了n次,所以滿足公式:2*(x+y) = x+y+n*(y+z),所以x+y = n * (y+z)??炻羔樦g的距離會逐漸增大,結(jié)果是要么快指針提前走到了鏈表末尾,要么是快指針剛好多走出n個鏈表長度,說明鏈表有環(huán)。我們在白板上可以寫出算法實現(xiàn),示例:public class Solution { public boolean hasCycle(ListNode head) { //如果鏈表為空或者只有一個節(jié)點,肯定不成環(huán) if(head==null || head.next==null){ return false; } ListNode slow = head; head=head.next; while(head!=null && head.next!=null){ //當(dāng)快慢指針相遇,說明鏈表有環(huán) if(slow==head){ return true; } slow=slow.next; head=head.next.next; } return false; }}算法的時間復(fù)雜度為O(N),其中N表示鏈表長度,空間復(fù)雜度為O(1),因為沒有使用額外輔助空間。

3. arc 方法參數(shù)

前面提到 arc 方法有 5 個必填參數(shù)和1個可選參數(shù),我們詳細(xì)地說明一下這幾個參數(shù)的用途。前三個參數(shù):x,y,r 分別代表了圓心坐標(biāo) (x, y)和要繪制圓的半徑,這個很好理解,我們著重講一下后面三個參數(shù)。我們先來看一張圖片:上圖中,x,y,r 分別對應(yīng)著圓的中心和半徑,圖里還有一個開始角和結(jié)束角,這就是第四個參數(shù) sAngle 和第五個參數(shù) sAngle 表示的內(nèi)容。明白了 5 個必填參數(shù)的含義,我想同學(xué)們應(yīng)該可以想到 act 方法不僅可以畫整圓,也是可以畫半圓的,我們只需要調(diào)整開始角和結(jié)束角的大小即可。我們看一個案例:1430執(zhí)行結(jié)果:我們可以看到從 0 到 π 的一個半圓已經(jīng)繪制好了。我們注意到默認(rèn)繪制半圓是順時針繪制的,如果我想讓逆時針繪制應(yīng)該怎么做呢?這時我們就用到了 arc 方法的第六個可選參數(shù):counterclockwise。我們還是用上一個案例來說明。1431運行結(jié)果:這樣我們就讓圓弧實現(xiàn)了逆時針繪制。不知道同學(xué)們有沒有注意到上面兩個案例中半圓都是沒有閉合的一條弧線,如果想要閉合也很簡單,只需要調(diào)用我們之前學(xué)習(xí)過的 closePath() 即可。案例:1432運行結(jié)果:執(zhí)行了 closePath() 就可以得到一條閉合的路徑了。

3. 例子三(Kotlin 實現(xiàn) Android 中的自定義 View)

使用 Kotlin 實現(xiàn) Android 中自定義圓形或圓角圖片,需要支持以下功能:支持圖片圓形的定制化;支持圖片圓角以及每個角的X,Y方向值的定制化;支持形狀邊框?qū)挾阮伾亩ㄖ苹?;支持圖片圓角或者圓形右上角消息圓點定制化(一般用于圓形或者圓角頭像)。

1. 前言

除了將上欄固定在屏幕上,我們還有另一種選擇,那就是上欄和主盒子都在屏幕的那個位置不動,那有人可能會說了,主盒子里的內(nèi)容要是多了,超出了屏幕的高度該怎么辦呢?這就要用到一個屬性叫做 overflow-y。

MySQL 的系統(tǒng)函數(shù)

MySQL 提供了很多的系統(tǒng)函數(shù),這些系統(tǒng)函數(shù)可以對數(shù)據(jù)進(jìn)行特殊的處理,下面表格列舉了大部分的系統(tǒng)函數(shù),本小節(jié)選擇一些代表性的系統(tǒng)函數(shù)演示說明。函數(shù)名說明CONCAT(str0,str1)將兩個字段的值拼接在一起CONCAT_WS(“拼接符”,str0,str1)將兩個字段的值使用指定拼接符拼接在一起GROUP_CONCAT(expr)將指定分組的字段內(nèi)容拼接在一起UPPER(str)將字符串包含的英文字符小寫轉(zhuǎn)化成大寫lOWER(str)將字符串包含的英文字符大寫轉(zhuǎn)化成小寫INITCAP(str)將字符串的首字母變成大寫LENGTH(str)獲取字符串的長度SUBSTR(str FROM pos FOR len)截取字符串,其中 pos 表示其實位置,len 表示結(jié)束位置TRIM(str)去除字符串兩邊空格INSTR(str,substr)查找指定字符在字符串的中的位置,其中 substr 表示需要查找的字符,例如 'Tom' 中 'T' 的位置為 1,'m' 的位置為 3LPAD(str,len,padstr)左填充,其中 len,表示字符串總長度,padstr 表示填充的字符RPAD(str,len,padstr)右填充,其中 len,表示字符串總長度,padstr 表示填充的字符LEFT(str,len)取一個字符串的前多少位RIGHT(str,len)取一個字串的后多少位CEIL(X)向上取整FLOOR(X)向下取整MOD(N,M)取余,例如 MOD(age,5),將字段 age 除以 5,除不盡的取余數(shù)POWER(X,Y)冪運算,例如 MOD(age,2),獲取字段 age 值的 2 次方的值NOW()獲取當(dāng)前日期和時間CURDATE()獲取當(dāng)前日期,不包含時間CURTIME()獲取當(dāng)前時間,不包含日期YEAR(now())獲取當(dāng)前的年份HOUR(NOW())獲取當(dāng)前時間的小時數(shù)MINUTE(now())獲取當(dāng)前時間的分鐘數(shù)SECOND(NOW())獲取當(dāng)前時間的秒數(shù)MONTHNAME(now())獲取當(dāng)前日期的英文月份MONTH(NOW())獲取當(dāng)前日期的數(shù)字月份DATE_ADD(date,INTERVAL expr unit)查詢?nèi)掌诘淖兓?,例?DATE_ADD(‘2020-03-03’,INTERVAL 10 day) 表示 2020-03-03 十天之后的日期DATEDIFF(expr1,expr2)日期差,例如 DATEDIFF('2019-12-29','2019-12-01') 表示 2019-12-29 距離 2019-12-01 的天數(shù)DATE_FORMAT(date,format)將指定日期轉(zhuǎn)化為自定義格式,例如 DATE_FORMAT('2019-12-29','%m/%d/%y') ,其中 %m 表示前面對應(yīng)的月份,%d 表示前面對應(yīng)的日期的天數(shù),%y 表示前面對應(yīng)的年份STR_TO_DATE(str,format)將指定日期轉(zhuǎn)化為自定義格式,例如 DATE_FORMAT('12-29-2019','%m/%d/%y')DATE_FORMAT(date,format)將指定日期轉(zhuǎn)化為自定義格式,例如 DATE_FORMAT('2019/12/29','%m/%d/%y')MD5(str)對字符串進(jìn)行 MD5 轉(zhuǎn)換UNIX_TIMESTAMP()將指定日期轉(zhuǎn)化為時間戳COUNT()獲取查詢結(jié)果集條數(shù)AVG(expr)獲取指定列平均值SUM(expr)獲取指定字段值的總和MIN(expr)獲取指定字段值的最小值MAX(expr)獲取指定字段值的最大值

3. 畫布坐標(biāo)

canvas 的畫布坐標(biāo)默認(rèn)和我們?yōu)g覽器窗口坐標(biāo)系是相同的,都是以左上角為坐標(biāo)原點,沿 X 軸向右為正值,沿 Y 軸向下為正值,這和我們數(shù)學(xué)上定義的坐標(biāo)系有一些差別。canvas 默認(rèn)坐標(biāo)系如下圖:

3. 使用場景及應(yīng)用實例

行內(nèi)代碼功能可以讓我們很輕松的在文章文字內(nèi)容中間增加諸如 <html> 標(biāo)簽的內(nèi)容,而不需要手動轉(zhuǎn)義。當(dāng)我們編寫程序說明文檔時,或者其他需要在文檔中插入特殊字符時,這個功能的作用會非常明顯。實例 4:畫一張字符畫。#### 一張字符畫?```.__ .__ .__ .__ .___| |__ ____ | | | | ____ __ _ _____________| | __| _/| | \_/ __ \| | | | / _ \ \ \/ \/ / _ \_ __ \ | / __ || Y \ ___/| |_| |_( <_> ) \ ( <_> ) | \/ |__/ /_/ ||___| /\___ >____/____/\____/ \/\_/ \____/|__| |____/\____ | \/ \/ \/?```渲染結(jié)果如下:

3.3 使用圖像背景

color 屬性還支持傳入 HTMLImageElement 對象,實現(xiàn)背景圖像配置,示例:1296示例效果:上例 color 對象接受兩個配置屬性:image:僅支持 HTMLImageElement、 HTMLCanvasElement 對象,所以注意使用時需要通過 document.getElementById 等方法獲取到 dom 實例;repeat:指定圖像的重復(fù)渲染模式,與 CSS 類似,支持: no-repeat、repeat-x、repeat-y、repeat

3.1 data 數(shù)據(jù)配置項詳解

data 屬性用于配置折線圖的數(shù)據(jù)集,上面例子已經(jīng)給出一些示例。data 項的常見形態(tài)有:空值: 當(dāng)某數(shù)據(jù)不存在時,可以用 ‘-’、null、undefined、NaN 表示;二維數(shù)組: 數(shù)組項用一個二維數(shù)組表示: [x, y],在直角坐標(biāo)系中對應(yīng) [x值, y值];在極坐標(biāo)系中對應(yīng) [距離, 角度];一維數(shù)組: 數(shù)組項用一個數(shù)字表示,通常見于直角坐標(biāo)系上某一軸為類目軸的場景。 data 值與 axis 值按順序一一對應(yīng),例如:{ "xAxis": { "type": "category", "data": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] }, "series": [ { // 對應(yīng)順序: // Mon Tue Wed Thu Fri Sat Sun "data": [820, 932, 901, 934, 1290, 1330, 1320] } ]}對象: 數(shù)組項用一個對象表示,例如:{ "xAxis": { "type": "category" }, "data": [ { "name": "Mon", "value": 820 }, { "name": "Tue", "value": 932 }, { "name": "Wed", "value": 901 }, { "name": "Thu", "value": 934 }, { "name": "Fri", "value": 1290 }, { "name": "Sat", "value": 1330 }, { "name": "Sun", "value": 1320 } ]}當(dāng)數(shù)組項為對象時,除 name、value 屬性外還可以傳入 symbol、label 等配置項實現(xiàn)針對數(shù)據(jù)項級別的定制化,例如:1345示例效果:

3. 決定網(wǎng)絡(luò)是否進(jìn)行訓(xùn)練

我們的網(wǎng)絡(luò)在使用的時候包括兩個情景:訓(xùn)練的情景,需要我們進(jìn)行參數(shù)的調(diào)整等;測試的情景或其他情景,固定參數(shù),只進(jìn)行輸出。在大多數(shù)時間,我們都需要在訓(xùn)練或者測試的過程之中做一些額外的操作。而我們的網(wǎng)絡(luò)是默認(rèn)進(jìn)行訓(xùn)練的,那么如何才能將我們的網(wǎng)絡(luò)調(diào)整為測試狀態(tài)或是訓(xùn)練狀態(tài)呢?答案就是 call 方法的參數(shù):training。如以下示例:class MyLayer2(tf.keras.layers.Layer): def __init__(self, hidden_units, input_units): super(MyLayer2, self).__init__() self.w = self.add_weight(shape=(input_units, hidden_units), initializer="random_normal") self.b = self.add_weight(shape=(hidden_units,), initializer="random_normal", trainable=False) def call(self, inputs, training=True): if training: self.b = self.b * 2 # ...... Other Operations return tf.matmul(tf.matmul(inputs, inputs), self.w) + self.b我們在 call 之中定義了 training 參數(shù),從而可以根據(jù)是否進(jìn)行訓(xùn)練進(jìn)行額外的操作,我們可以通過如下方式來具體使用:my_layer2 = MyLayer2(10, 5)y = my_layer2(x, traing=True)y = my_layer2(x, traing=False)于是我們在第一調(diào)用的時候進(jìn)行訓(xùn)練,而第二次調(diào)用的時候不進(jìn)行訓(xùn)練。

2.1 選定主軸

使用 dataZoom 的第一步是確定縮放組件要控制那一條坐標(biāo)軸,方法很簡單,在直角坐標(biāo)系下通過設(shè)定 xAxisIndex或 yAxisIndex 為對應(yīng)坐標(biāo)軸下標(biāo);極坐標(biāo)系下通過設(shè)定 radiusAxisIndex 或 angleAxisIndex 為對應(yīng)坐標(biāo)軸下標(biāo)即可。例如下例設(shè)定兩個 dataZoom 實例并分別指向兩個不同類型的坐標(biāo)軸:1337示例效果:Tips:dataZoom 三個變種功能相似,其中只有 slider 類型提供了視覺組件,為演示的便利,本文中的示例默認(rèn)使用 slider 類型,inside、select 功能類似,以此類推即可。dataZoom 也支持同時控制兩條軸的數(shù)據(jù)窗口,只需同時指定 xAxisIndex 和 yAxisIndex(極坐標(biāo)下則同時指定 angleAxisIndex、radiusAxisIndex),不過需要兩個軸有相同的類型和數(shù)值范圍,例如下例:1338縮放后,要求數(shù)值項的 x、y 值同時在窗口內(nèi)才會顯示,可以仔細(xì)觀察下圖,隨著 dataZoom 滑塊的變化,圖表 x、y 軸的數(shù)值范圍同時發(fā)生變化:

1.1 常規(guī)快捷鍵

功能說明Windows/LinuxMac全部保存Ctrl+SCommand+S同步Ctrl+Alt+YCommand+Option+Y最大化/最小化編輯器Ctrl+Shift+F12Ctrl+Command+F12添加到收藏夾Alt+Shift+FOption+Shift+F使用當(dāng)前配置文件檢查當(dāng)前文件Alt+Shift+IOption+Shift+I快速切換方案Ctrl+| Ctrl+打開設(shè)置對話框Ctrl+Alt+SCommand+,打開項目結(jié)構(gòu)對話框Ctrl+Alt+Shift+SCommand+;在標(biāo)簽頁和工具窗口之間切換Ctrl+TabCtrl+Tab

4. 卸載 Java

Linux上的卸載與其他操作系統(tǒng)有所不同。有必要單獨說明一下。執(zhí)行如下命令,可查看操作系統(tǒng)中的 JDK版本rpm -qa | grep jdk可以看到我們的系統(tǒng)上存在兩個版本的 Java,執(zhí)行命令刪除對應(yīng)版本:yum -y remove java jdk-13.0.2-13.0.2-ga.x86_64

1.2 單行注釋

但是如果不使用 IDE ,而使用鍵盤敲擊注釋內(nèi)容,每次都要敲擊 4 次鍵盤才能完成一次注釋,對于一些簡短的注釋來說是比較麻煩的。因此在 C++ 語言設(shè)計的時候,就出現(xiàn)了使用 // 來進(jìn)行單行注釋的方法。請注意,這里編譯器只會忽略 // 后面到本行行末的部分。也就是只能注釋一行。這與使用 /* */ 方式注釋可以同時注釋多行的方式有所不同。這種注釋的方法優(yōu)缺點顯而易見。與上面的傳統(tǒng)方式優(yōu)勢互補(bǔ)。Tips:需要特別注意的是,對于幾十年前的老舊的編譯器,這種注釋方式會引起錯誤。當(dāng)然,最近十年的編譯器已經(jīng)可以支持這種新的注釋標(biāo)準(zhǔn)了。# include <stdio.h>int main(){ // 聲明變量 int x,y,z; return 0; // 返回值}將兩種注釋方式混合使用的例子。/*使用第一種方式注釋*/# include <stdio.h>int main(){ // 使用第二種方式注釋 int x,y,z; return 0;}

直播
查看課程詳情
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號