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

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
5. 拷貝異常時會被打斷

在拷貝時如果發(fā)生異常,則拷貝會被終止,并報錯,前面已經(jīng)被拷貝的不會被影響可以繼續(xù)使用,但后面沒有被拷貝的則不能被使用。var target = Object.defineProperty({}, "a", { value: 1, writable: false});Object.assign(target, {b: 2}, {a: 3}, {c: 4});// Uncaught TypeError: Cannot assign to read only property 'a' of object 'console.log(target.b); // 2console.log(target.c); // undefined上面的代碼中,定義了目標(biāo)對象 target 上的屬性 a 是只讀的,也就是不能不被修改,在合并代碼時,源對象上有 a,則報了 a 是對象上的只讀屬性不能被 assign 操作。從后面的打印結(jié)果可以看出,b 已經(jīng)被拷貝到目標(biāo)對象上了可以正常使用,但由于拷貝中發(fā)生異常,最后一個對象沒有被拷貝,所以 c 的值是 undefined。

2. Numpy 在線安裝

如果已經(jīng)完成了 Python 環(huán)境搭建,在本地環(huán)境上安裝 Numpy 也非常方便。在保持網(wǎng)絡(luò)通暢的前提下,在 cmd 窗口中輸入:C:\Users>pip install numpyPIP 工具會根據(jù) Python 的版本,自動搜索匹配的 Numpy 版本,進(jìn)行安裝。PIP(英文 Python Install Packages 的簡稱)是一個現(xiàn)代的、通用的 Python 包管理工具。考慮到默認(rèn)情況下,PIP 是從 Python 官方的第三方庫的倉庫中選擇合適版本下載,在某些網(wǎng)絡(luò)情況下并不好用。因此也可以利用國內(nèi)的鏡像點(diǎn)進(jìn)行在線安裝,這里以阿里云的鏡像站點(diǎn)為例,完成Numpy安裝演示:C:\Users>pip install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com numpy

2.1 字符串 String

在 Groovy 中,字符串較 Java 中比較特殊,在 Java 中我們用單引號(’’)來表示 char,用雙引號("")表示字符串。但是在 Groovy 中字符串不僅可以用雙引號 (""),而且單引號 (’’),三引號 ("’’")也可以。我們看下下面這個例子:class Example { static void main(String[] args) { String a = '單引號'; String b = "雙引號"; String c = '''這是三引號 Gradle專題 Groovy語言基礎(chǔ)'''; println(a); println(b); println(c); } }最終輸出結(jié)果為:單引號雙引號這是三引號 Gradle專題 Groovy語言基礎(chǔ)我們發(fā)現(xiàn)三引號(’’’ ‘’’)其實(shí)還可以換行,多行字符串也可以用三引號(’’’ ‘’’)來引用。不像 Java 一樣我們?nèi)绻址畵Q行還需要用“ + 和 \n”連接起來。

2. each_with_index

在 each 的基礎(chǔ)上我們還需要打印出每一個元素對應(yīng)的索引,這樣我們可以使用each_with_index。下面是一個數(shù)組的例子。實(shí)例:[1, 2, 3, 4, 5].each_with_index do |number, index| puts "index: #{index} \nnumber:#{number}"end# ---- 輸出結(jié)果 ----index: 0 number:1index: 1 number:2index: 2 number:3index: 3 number:4index: 4 number:5解釋:上述代碼我們塊中增加了一個index,它代表著每個元素的索引,從0開始依次加1。下面是一個哈希的例子:實(shí)例:{a: '1', b: '2', c: '3', d: '4', e: '5'}.each_with_index do |value, index| puts "value:#{value} class: #{value.class} index: #{index}"end# ---- 輸出結(jié)果 ----value:[:a, "1"] class: Array index: 0value:[:b, "2"] class: Array index: 1value:[:c, "3"] class: Array index: 2value:[:d, "4"] class: Array index: 3value:[:e, "5"] class: Array index: 4

2. 小結(jié)

在這里我們展示了一個簡單的字符串的練習(xí)。在 C 語言中對于字符串的處理除了之前介紹的可以使用字符串函數(shù)以外,更過的時候是利用其字符數(shù)組的特性,可以精確的通過索引訪問到每一個字符元素,然后再對其進(jìn)行處理。

C 語言中的三目運(yùn)算符

三目運(yùn)算符是一種比較特殊的運(yùn)算符,在我們前面的總體運(yùn)算符介紹中,它被歸在了單獨(dú)的一類,也就是其它類別。這個運(yùn)算符其實(shí)更像是一個簡化版的 if 語句,但是卻很簡潔強(qiáng)大。

1. 指針的定義和使用

在 Go 語言中指針類型的聲明和 C/C++ 類似,都是采用 * 符號來區(qū)分正常類型變量和指針變量。代碼示例:package mainimport ( "fmt")func main() { str := "Hello World !" var strP *string strP = &str *strP = "Hello Codey !" fmt.Println("指針strP的地址為", strP) fmt.Println("指針strP指向的值為", *strP) fmt.Println("變量str的地址為", &str) fmt.Println("變量str的值為", str)}第 9 行:使用 *+變量類型的形式聲明一個 string 類型的指針。第 10 行:將指針 strP 指向變量 str,也就是將變量 str 的地址賦值給指針變量 strP 。& 為取地址符,可以取出變量所在的地址。第 11 行:通過指針修改 str 的值。執(zhí)行結(jié)果:從以上輸出結(jié)果可以看出,變量 strP 存儲的值就是變量 str 的地址,可以通過使用 *strP 操作符改變其存儲的地址所存儲的值。

3.1 drop_duplicates () 函數(shù)

該函數(shù)用于刪除特定列下的重復(fù)數(shù)據(jù)行,并返回一個新的數(shù)據(jù)集對象,其中有兩個重要的參數(shù),一是 subset ,該參數(shù)用來指定判定重復(fù)的數(shù)據(jù)的列,默認(rèn)是所有的列;二是 keep 參數(shù),該參數(shù)是用來控制如何刪除重復(fù)值的,有三個參數(shù)值選項:first:表示將第一次出現(xiàn)的重復(fù)值視為唯一的,刪除后面出現(xiàn)重復(fù)值的數(shù)據(jù)行 ,默認(rèn)是這種方式;last:表示將最后一次出現(xiàn)重復(fù)的值視為唯一的,刪除前面出現(xiàn)重復(fù)值的數(shù)據(jù)行 ;False:表示將刪除重復(fù)值所在的所有數(shù)據(jù)行 ;下面我們通過實(shí)際代碼操作來演示重復(fù)數(shù)據(jù)的刪除操作:# 導(dǎo)入pandas包import pandas as pddata_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第12小節(jié)/execl數(shù)據(jù)demo.xlsx"# 解析數(shù)據(jù)data = pd.read_excel(data_path)print(data)# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人0 java 1983年 45.6 James Gosling1 python 1991年 67.0 Bjarne Stroustrup2 python 1972年 45.6 Dennis MacAlistair Ritchie3 js 1983年 45.6 js4 James Gosling 2012年 45.6 Rasmus Lerdorf5 C++ java 75.0 Bjarne Stroustrup# drop_duplicates()data_res=data.drop_duplicates()print(data_res)# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人0 java 1983年 45.6 James Gosling1 python 1991年 67.0 Bjarne Stroustrup2 python 1972年 45.6 Dennis MacAlistair Ritchie3 js 1983年 45.6 js4 James Gosling 2012年 45.6 Rasmus Lerdorf5 C++ java 75.0 Bjarne Stroustrup# 結(jié)果解析:這里我們直接使用了 drop_duplicates() 函數(shù),但是沒有傳入任何的參數(shù),默認(rèn)則是以整行進(jìn)行判斷是否存在重復(fù)行,要是存在則進(jìn)行刪除操作。這里因?yàn)闆]有重復(fù)行,因此返回的數(shù)據(jù)集和原數(shù)據(jù)集內(nèi)容一樣。# 設(shè)置 subset="編程語言"data_res=data.drop_duplicates(subset="編程語言")print(data_res)# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人0 java 1983年 45.6 James Gosling1 python 1991年 67.0 Bjarne Stroustrup3 js 1983年 45.6 js4 James Gosling 2012年 45.6 Rasmus Lerdorf5 C++ java 75.0 Bjarne Stroustrup# 結(jié)果解析:這里設(shè)置了 subset="編程語言" ,以編程語言列為標(biāo)準(zhǔn)查找重復(fù)值,默認(rèn) keep="first" 表示第一次的重復(fù)值視為唯一的不進(jìn)行刪除,通過輸出結(jié)果可以看到,第3行的數(shù)據(jù)被刪除了。# 設(shè)置 keep="last"data_res=data.drop_duplicates(subset="編程語言",keep="last")print(data_res)# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人0 java 1983年 45.6 James Gosling2 python 1972年 45.6 Dennis MacAlistair Ritchie3 js 1983年 45.6 js4 James Gosling 2012年 45.6 Rasmus Lerdorf5 C++ java 75.0 Bjarne Stroustrup# 結(jié)果解析:這里設(shè)置了 keep="last" 表示將最后一個出現(xiàn)的重復(fù)值視為唯一的,因此這里刪除了第2行的數(shù)據(jù)。# 設(shè)置 keep=Falsedata_res=data.drop_duplicates(subset="編程語言",keep=False)print(data_res)# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人0 java 1983年 45.6 James Gosling3 js 1983年 45.6 js4 James Gosling 2012年 45.6 Rasmus Lerdorf5 C++ java 75.0 Bjarne Stroustrup# 結(jié)果解析:通過設(shè)置 keep=False 可以看到所有重復(fù)值所在的行都被刪除了。

4.3 通過 while 循環(huán)遍歷堆棧

在實(shí)現(xiàn)了迭代協(xié)議后,使用 while 循環(huán)顯示的使用 iter、next、StopIteration 完成對 stack 的遍歷,代碼如下:stackIterator = iter(stack)while True: try: item = next(stackIterator) print(item) except StopIteration: break程序依次壓入 ‘a(chǎn)’、‘b’、‘c’,遍歷時以壓入相反的順序輸出,結(jié)果如下:cba

1.2 CSS

新建一個 css 文檔,寫一個 pos ,然后按下 Tab 鍵試試。我們還可以寫 c#3 它代表顏色為 #333 ,這些快捷鍵理解了就很容易寫樣式了。Tips:但是也不用刻意去記這些簡寫,過分依賴工具的程序員不是好程序員。

3.HTML和編譯型語言的區(qū)別

計算機(jī)語言分成解釋型語言和編譯型語言兩種。我們下面來展開講一下解釋型語言和編譯型語言兩者的區(qū)別:在說兩區(qū)別之前我們先來講一下計算機(jī)怎么把代碼翻譯成計算機(jī)能看得懂的語言(翻譯成機(jī)器碼)。眾所周知,計算機(jī) CPU 的集成電路中,除了電容、電阻、電感就是晶體管了,每個晶體管相當(dāng)于一個開關(guān),理論上 CPU 只能存儲識別兩個標(biāo)識符,那就是 0 和 1,所以說 CPU 識別的指令集只能由 0 和 1 組合。那么所有的計算機(jī)語言想要 CPU 能看得懂,必須翻譯成 0/1 代碼才行,這個由 0/1 組成的代碼叫做機(jī)器碼。但是機(jī)器碼相對于人來說過于繁瑣,所以就有人發(fā)明了高級語言、低級語言等等,這些語言的分級是根據(jù)它的語法是貼近人還是貼近機(jī)器來區(qū)分的,越貼近人它就越高級,越貼近機(jī)器它就越低級,但是最終想要 CPU 可以識別都需要翻譯成機(jī)器碼。典型的低級語言包括剛剛提到的機(jī)器碼、匯編語言、c 等,高級語言包括 PHP、c#、JavaScript、Java、Python 等等。什么是編譯型語言和解釋性語言呢?剛剛我們提到翻譯成機(jī)器碼,這個翻譯的過程就叫做編譯或解釋。編譯型語言是指通過編譯器翻譯成完整的機(jī)器碼,然后通過 CPU 去執(zhí)行。而解釋型語言是指通過一個虛擬機(jī)的方式一行行的翻譯,翻譯一行執(zhí)行一行;還有一種方式是混合型,介于兩者之間。常見的編譯型語言包括 c++、c、rust等,解釋型語言包括 JavaScript、PHP、HTML 等等,混合型包括 Python、Java等。

3.5 this 參數(shù)

JavaScript 里,this 的值在函數(shù)被調(diào)用的時候才會被指定,但是這個 this 到底指的是什么還是需要花點(diǎn)時間弄清楚。默認(rèn)情況下,tsconfig.json 中,編譯選項 compilerOptions 的屬性 noImplicitThis 為 false,我們在一個對象中使用的 this 時,它的類型是 any 類型。let triangle = { a: 10, b: 15, c: 20, area: function () { return () => { // this 為 any 類型 const p = (this.a + this.b + this.c) / 2 return Math.sqrt(p * (p - this.a) * (p - this.b) *(p - this.c)) } }}const myArea = triangle.area()console.log(myArea())代碼解釋:在實(shí)際工作中 any 類型是非常危險的,我們可以添加任意屬性到 any 類型的參數(shù)上,比如將 const p = (this.a + this.b + this.c) / 2 這句改為 const p = (this.d + this.d + this.d) / 2 也不會報錯,這很容易造成不必要的問題。所以我們應(yīng)該明確 this 的指向,下面介紹兩種方法:第一種,在 tsconfig.json 中,將編譯選項 compilerOptions 的屬性 noImplicitThis 設(shè)置為 true,TypeScript 編譯器就會幫你進(jìn)行正確的類型推斷:let triangle = { a: 10, b: 15, c: 20, area: function () { return () => { const p = (this.a + this.b + this.c) / 2 return Math.sqrt(p * (p - this.a) * (p - this.b) *(p - this.c)) } }}const myArea = triangle.area()console.log(myArea())代碼解釋:將 noImplicitThis 設(shè)置為 true 以后,把鼠標(biāo)放在第 7 行的 this 上,可以看到: this: { a: number; b: number; c: number; area: () => () => number; }這時,TypeScript 編譯器就能準(zhǔn)確的知道了 this 的類型,如果取不存在于 this 屬性中的 d,將會報錯 Property 'd' does not exist on type '{ a: number; b: number; c: number; area: () => () => any; }'除了這種方法,我們還可以通過 this 參數(shù) 這種形式來解決 this 為 any 類型這一問題。提供一個顯式的 this 參數(shù),它出現(xiàn)在參數(shù)列表的最前面:// 語法function f(this: void) {}改造剛才的例子:340代碼解釋:我們聲明了一個接口 Triangle,其中的函數(shù)類型顯式的傳入了 this 參數(shù),這個參數(shù)的類型為 Triangle 類型(第 5 行):area(this: Triangle): () => number;此時,在第 14 行,this 指向 Triangle,就可以進(jìn)行正確的類型判斷,如果取未定義參數(shù),編譯器將直接報錯。

3.2 append() 方法新增數(shù)據(jù)行

append(other, ignore_index=False, verify_integrity=False) 是用來在數(shù)據(jù)表尾新增數(shù)據(jù)行,并返回新增后的數(shù)據(jù)對象,該方法不僅僅適用于 DataFrame 結(jié)構(gòu)的數(shù)據(jù),還可以用于 Series 數(shù)據(jù)的追加。參數(shù)名說明other要添加的數(shù)據(jù),可以是 Series、list、dict、dataframe 等等;ignore_index新增了數(shù)據(jù)后,會重新設(shè)置索引,忽略舊的索引;verify_integrity當(dāng)為 True 時,如果和原數(shù)據(jù)的索引值相同,將會報錯;# 新建一個 DataFrame 對象data_new= pd.DataFrame([["11","22","33.5","44"], ["55","66","77.7","88"]], columns=["編程語言","推出時間","價格","主要創(chuàng)始人"])# 對 data 使用 append 操作,傳入新創(chuàng)建的 DataFrame 對象result_data=data.append(data_new)print(result_data)# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人0 java 1995年 45.6 James Gosling1 python 1991年 67 Guido van Rossum2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js 1995年 59.5 Brendan Eich4 php 2012年 69.9 Rasmus Lerdorf5 C++ 1983年 75 Bjarne Stroustrup0 11 22 33.5 441 55 66 77.7 88輸出解析:這里可以看到通過 append() 操作是將兩個數(shù)據(jù)集進(jìn)行行的合并,在 data 數(shù)據(jù)集的基礎(chǔ)上,后面合并 data_new 數(shù)據(jù)行。這里的索引并不會產(chǎn)生沖突,因?yàn)槲覀儧]有設(shè)置 verify_integrity=True(默認(rèn)的是為 False),如果我們設(shè)置了 ignore_index= True ,合并后生成的新的數(shù)據(jù)集索引值會重新排列,如下操作所示:data_new= pd.DataFrame([["11","22","33.5","44"], ["55","66","77.7","88"]], columns=["編程語言","推出時間","價格","主要創(chuàng)始人"])result_data=data.append(data_new, ignore_index= True)print(result_data)# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人0 java 1995年 45.6 James Gosling1 python 1991年 67 Guido van Rossum2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js 1995年 59.5 Brendan Eich4 php 2012年 69.9 Rasmus Lerdorf5 C++ 1983年 75 Bjarne Stroustrup6 11 22 33.5 447 55 66 77.7 88輸出解析:這里可以看到通過設(shè)置 ignore_index= True 屬性,返回的數(shù)據(jù)對象的行索引從0開始重新進(jìn)行了排列。

6.1 匹配與查找

關(guān)于匹配與查找的終止操作,有下面幾個常用方法:allMatch(Predicate p):檢查是否匹配所有元素;anyMatch(Predicate p):檢查是否至少匹配一個元素;noneMatch(Predicate p):檢查是否沒有匹配所有元素;findFirst():返回第一個元素;findAny():返回當(dāng)前流中的任意元素;count():返回流中元素總數(shù);max(Comparator c):返回流中最大值;min(Comparator c):返回流中最小值;forEach(Consumer c):內(nèi)部迭代(使用 Collection 接口需要用戶去做迭代,稱為外部迭代;相反 Stream API使用內(nèi)部迭代)。如下實(shí)例,演示了幾個匹配元素相關(guān)方法的使用:1260運(yùn)行結(jié)果:[10, 12, 9, 8, 20, 1]列表中所有的元素都大于0[10, 12, 9, 8, 20, 1]列表中至少存在一個的元素都大于等于20[10, 12, 9, 8, 20, 1]列表中不存在大于100的元素查找元素的相關(guān)方法使用實(shí)例如下:1261運(yùn)行結(jié)果:[10, 12, 9, 8, 20, 1]列表中第一個元素為:Optional[10]列表中任意元素:Optional[10][10, 12, 9, 8, 20, 1]列表中元素總數(shù)為6[10, 12, 9, 8, 20, 1]列表中最大值為Optional[20][10, 12, 9, 8, 20, 1]列表中最小值為Optional[1]實(shí)例中,我們觀察到findFirst()、findAny()、max()等方法的返回值類型為Optional類型,關(guān)于這個Optional類,我們將在下一小節(jié)具體介紹。

5. 公平鎖與非公平鎖

分類:根據(jù)線程獲取鎖的搶占機(jī)制,鎖可以分為公平鎖和非公平鎖。公平鎖:表示線程獲取鎖的順序是按照線程請求鎖的時間早晚來決定的,也就是最早請求鎖的線程將最早獲取到鎖。非公平鎖:非公平鎖則在運(yùn)行時闖入,不遵循先到先執(zhí)行的規(guī)則。ReentrantLock:ReentrantLock 提供了公平和非公平鎖的實(shí)現(xiàn)。ReentrantLock 實(shí)例://公平鎖ReentrantLock pairLock = new ReentrantLock(true);//非公平鎖ReentrantLock pairLock1 = new ReentrantLock(false);//如果構(gòu)造函數(shù)不傳遞參數(shù),則默認(rèn)是非公平鎖。ReentrantLock pairLock2 = new ReentrantLock();場景介紹:通過模擬一個場景假設(shè),來了解公平鎖與非公平鎖。假設(shè)線程 A 已經(jīng)持有了鎖,這時候線程 B 請求該鎖將會被掛起;當(dāng)線程 A 釋放鎖后,假如當(dāng)前有線程 C 也需要獲取該鎖,如果采用非公平鎖方式,則根據(jù)線程調(diào)度策略,線程 B 和線程 C 兩者之一可能獲取鎖,這時候不需要任何其他干涉;而如果使用公平鎖則需要把 C 掛起,讓 B 獲取當(dāng)前鎖,因?yàn)?B 先到所以先執(zhí)行。Tips:在沒有公平性需求的前提下盡量使用非公平鎖,因?yàn)楣芥i會帶來性能開銷。

2.2 打印輸出

>>> print('hello')hello>>> print('hello', 'world')hello world內(nèi)置函數(shù) print 打印文本到屏幕缺省情況下,print() 輸出會加上換行如果不需要換行,可以加上參數(shù) end =’’,示例如下:print('a', end = '')print('b', end = '')print('c', end = '')print()運(yùn)行程序,輸出結(jié)果:abc

4.2 第二個參數(shù)為負(fù)值時

如果第二個參數(shù)為負(fù)值時,計算數(shù)組的長度和第二個參數(shù)之和小于 0,則整個數(shù)組都會被搜索。var arr = ['a', 'b', 'c'];arr.includes('a', -10); // truearr.includes('b', -10); // truearr.includes('a', -2); // falsearr 的數(shù)組長度是 3,第二個參數(shù)是 - 10,計算之和為 -7 小于 0,則整個數(shù)組都會被搜索。

3. Nginx 命令參數(shù)說明

常用參數(shù)作用-vNginx 版本信息-V詳細(xì)信息,包括已編譯的模塊-t后面跟配置文件地址,檢查配置文件的語法是否正確-c指定 Nginx 配置文件-s最重要的選項, stop|quit: 停止 Nginx 服務(wù),reload: 熱加載啟動 Nginx 服務(wù), reopen:重新打開日志文件

1. Vim VS Windows

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

4.1 通過單鏈表實(shí)現(xiàn)堆棧

通過單鏈表實(shí)現(xiàn)堆棧,圖示如下:![圖片描述](//img1.sycdn.imooc.com//wiki/5ea92d460974644d07000133.jpg) 在上圖中,每個節(jié)點(diǎn)有兩個字段: item 和 next,item 用于存儲數(shù)據(jù),next 指向下一個節(jié)點(diǎn),head 指針指向堆棧的頂部。描述堆棧的 Python 代碼如下:class Node: def __init__(self, item): self.item = item self.next = Noneclass Stack: def __init__(self): self.head = None def push(self, item): node = Node(item) node.next = self.head self.head = nodestack = Stack()stack.push('a')stack.push('b')stack.push('c')在第 1 行,定義了類 Node 用于描述鏈表中的節(jié)點(diǎn)在第 6 行,定義了類 Stack 描述堆棧在第 8 行,定義了頭指針 head,指向鏈表中的首個節(jié)點(diǎn)在第 10 行,定義了成員方法 push,將元素壓如到堆棧中在第 11 行,創(chuàng)建一個新節(jié)點(diǎn) node在第 12 行,新節(jié)點(diǎn) node 的 next 指向頭結(jié)點(diǎn)在第 13 行,頭結(jié)點(diǎn)指向新節(jié)點(diǎn)在第 15 行,創(chuàng)建一個對象 stack在第 16 行到第 18 行,依次壓入 3 個元素 ‘a(chǎn)’、‘b’、‘c’

4.1 修改本地倉庫位置

在 Maven 的使用過程中,會自動將項目依賴的 jar 包從中央倉庫下載到本地倉庫,默認(rèn)本地倉庫路徑是${user.home}/.m2/repository,這樣的話,會占用較多的 C 盤空間,因此,我們可以自定義該路徑。

3.1 函數(shù)參數(shù)

先看一段代碼示例:let fn1 = (a: number, b: string) => {}let fn2 = (c: number, d: string, e: boolean) => {}fn2 = fn1 // OKfn1 = fn2 // Error代碼解釋:第 4 行,將 fn1 賦值給 fn2 成立是因?yàn)椋篺n1 的每個參數(shù)均能在 fn2 中找到對應(yīng)類型的參數(shù)參數(shù)順序保持一致,參數(shù)類型對應(yīng)參數(shù)名稱不需要相同第 5 行,將 fn2 賦值給 fn1 不成立,是因?yàn)?fn2 中的必須參數(shù)必須在 fn1 中找到對應(yīng)的參數(shù),顯然第三個布爾類型的參數(shù)在 fn1 中未找到。參數(shù)類型對應(yīng)即可,不需要完全相同:let fn1 = (a: number | string, b: string) => {}let fn2 = (c: number, d: string, e: boolean) => {}fn2 = fn1 // OK代碼解釋: fn1 的第一個參數(shù)是 number 和 string 的聯(lián)合類型,可以對應(yīng) fn2 的第一個參數(shù)類型 number,所以第 4 行賦值正常。

2. 預(yù)裝依賴包

Nginx 是完全用 c 語言編寫的,所以想要編譯 Nginx,必須要有 c 編譯器(gcc), 只要系統(tǒng)里有 gcc, Nginx 就可以編譯安裝。但是往往我們會用的到 Nginx 的一些重要功能,比如壓縮和解壓縮功能,這時就必須需要依賴 zlib 庫,想在配置文件中使用正則表達(dá)式,就必須安裝 pcre 庫,最后想實(shí)現(xiàn) SSL/TLS 功能,必須安裝 openssl 庫。無論是在 Ubuntu 還是 CentOS 系統(tǒng)中都大致如此,只不過管理軟件包的工具不一樣,依賴庫的名稱也不一樣。在 Ubuntu 系統(tǒng)下,在 Ubuntu 中執(zhí)行如下命令安裝依賴庫:$ sudo apt-get update # 更新下apt源$ sudo apt-get install gcc # Nginx必備$ sudo apt-get install make # 編譯安裝需要make工具$ sudo apt-get install libz-dev$ sudo apt-get install libpcre3-dev$ sudo apt-get install libssl-dev

2. GROUP_CONCAT拼接分組字段

以 course 和 teacher 表內(nèi)連接分組為例,并使用 GROUP_CONCAT 將指定的分組字段拼接在一起:SELECT c.teacher_id,t.*,GROUP_CONCAT(c.id) AS new_strFROM course c LEFT JOIN teacher t ON c.teacher_id=t.id GROUP BY c.teacher_id;查詢結(jié)果如下圖;Tips:如上圖所示, 其中 new_str 的值是 GROUP_CONCAT() 函數(shù)將 c.id 的值拼接在一起,默認(rèn)是 ‘,’ 拼接。

3.2 函數(shù)參數(shù)

在函數(shù)傳參時,參數(shù)不要超過兩個,這樣會讓你更容易測試這個函數(shù),如果超過 2 個參數(shù)會導(dǎo)致組合膨脹,以至于你必須根據(jù)不同的參數(shù)對大量不同的情況進(jìn)行測試。理想情況下是兩個,如果參數(shù)過多可以使用對象來處理。// badfunction fn(a,b,c,d) { // todo}// goodconst params = { a: 1, b: 2, c: 3, d: true}function fn(params) { // todo}不要使用函數(shù)的內(nèi)部的參數(shù) arguments 來獲取函數(shù)的不定參數(shù),使用 ... 來接收。因?yàn)?arguments 獲取的參數(shù)是一個類數(shù)組需要轉(zhuǎn)化為真正的數(shù)組。function foo() { const args = [].slice.call(arguments); console.log(args)}foo(1,2,3); // [1,2,3]function foo(...args) { console.log(args)}foo(1,2,3); // [1,2,3]當(dāng)函數(shù)的參數(shù)有默認(rèn)值時,可以使用最短路徑的方法設(shè)置。// badfunction foo(a, b) { a = a || 1; b = b || 2;}// goodfunction foo(a=1, b=2) { // todo}

3.5 按函數(shù)查詢

函數(shù)查詢是在查詢的參數(shù)中傳入函數(shù),查詢使該函數(shù)返回為 True 的數(shù)據(jù)集。# 這里的 data 是上面我們從 Excel 中解析出來的數(shù)據(jù)print(data.loc[data["推出時間"].isin(["1972年","1995年","1983年"])])# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人0 java 1995年 45.6 James Gosling2 C 1972年 33.9 Dennis MacAlistair Ritchie3 js 1995年 59.5 Brendan Eich5 C++ 1983年 75.0 Bjarne Stroustrup輸出解析:這里我們傳入了一個函數(shù) isin( ) 該函數(shù)接受一個列表,判斷該列中元素是否在“推出時間 ”列表中 ,如果是就查詢出該數(shù)據(jù)集,從結(jié)果可以看出,查詢出了“推出時間”為1972年、1995年、1983年的數(shù)據(jù)集。當(dāng)然,我們除了可以使用 Pandas 自帶的一些函數(shù),我們也可以自定義一些條件函數(shù),傳入?yún)?shù)進(jìn)行查詢。

3. 多字段分組

以查詢學(xué)生選課關(guān)聯(lián)表為例,查詢學(xué)生選課相關(guān)信息:SELECT * FROM student_course a INNER JOIN student b ON a.student_id=b.id INNER JOIN course c ON a.course_id=c.id INNER JOIN teacher d ON c.teacher_id=d.id;查詢結(jié)果如下圖;上圖是不同學(xué)生選課相關(guān)的信息數(shù)據(jù),可以使用 GROUP BY 按照 teacher_id、course_id 分組來展示所有教師的所有課程信息:SELECT c.teacher_id,a.course_id,c.course_name,d.nameFROM student_course a INNER JOIN student b ON a.student_id=b.id INNER JOIN course c ON a.course_id=c.id INNER JOIN teacher dON c.teacher_id=d.id GROUP BY c.teacher_id,a.course_id;執(zhí)行結(jié)果如下圖:Tips:單字段分組和多字段分組的區(qū)別在于,單字段是以一個字段來判斷數(shù)據(jù)是否重復(fù)分組出來的結(jié)果,多字段分組是以多個字段同時來判斷是否重復(fù)分組出來的結(jié)果。

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()丟棄指定索引的項下面我們分別看一下每個方法的具體操作實(shí)例: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 運(yùn)行結(jié)果,而 notnull() 則不是缺失值的返回 Ture 運(yùn)行結(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,因?yàn)樗饕菑?開始的,我們最小值為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的值是不一樣的,我們修改拷貝后的對象,并不能影響到被拷貝的對象,這就是深拷貝,它完全拷貝了父對象及其子對象,和之前的對象是相互獨(dú)立的。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.1 dropna () 函數(shù)

該函數(shù)用于過濾含有缺失值的數(shù)據(jù)行或者列,操作之后會返回一個新的數(shù)據(jù)集,該函數(shù)提供了豐富的參數(shù)設(shè)置,下面列舉了該函數(shù)常用的幾個參數(shù):參數(shù)名說明 axis 指定是行還是列的過濾( 0 指行,1 為列),默認(rèn) axis=0how 指定缺失值過濾的依據(jù),含有缺失值就過濾(how=“any” 默認(rèn))還是全是全是缺失值才過濾(how=“all”)thresh 指保留至少含有多少個非缺失值的行或列(參數(shù)值為整數(shù))subset 指定特定的行或者列進(jìn)行缺失值過濾下面我們將通過實(shí)際程序操作,學(xué)習(xí)每個參數(shù)的使用方式:# 導(dǎo)入pandas包import pandas as pddata_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第11小節(jié)/execl數(shù)據(jù)demo.xlsx"# 解析數(shù)據(jù)data = pd.read_excel(data_path)print(data)# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人0 java NaN 45.6 James Gosling1 python 1991年 67.0 NaN2 NaN 1972年 NaN Dennis MacAlistair Ritchie3 js NaN NaN Brendan Eich4 php 2012年 NaN Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup###### dropna 過濾缺失值# 1. axis=0 設(shè)置過濾行中有缺失值的數(shù)據(jù)new_data= data.dropna(axis=0)print(new_data)# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人5 C++ 1983年 75.0 Bjarne Stroustrup# 結(jié)果解析:可以看到所有含 NaN 的數(shù)據(jù)行都被過濾掉,只剩下一行數(shù)據(jù)# 2. axis=1 設(shè)置過濾行列中缺失值的數(shù)據(jù)new_data= data.dropna(axis=1)print(new_data)# --- 輸出結(jié)果 ---Empty DataFrameColumns: []Index: [0, 1, 2, 3, 4, 5]# 結(jié)果解析:因?yàn)樵瓟?shù)據(jù)中每一列都有 NaN 數(shù)據(jù)的存在,所以 axis=1 操作后,數(shù)據(jù)集為 Empty DataFrame# 3. how="all" 設(shè)置所有值都為 NaN 的數(shù)據(jù)列才被過濾new_data= data.dropna(axis=1,how="all")print(new_data)# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人0 java NaN 45.6 James Gosling1 python 1991年 67.0 NaN2 NaN 1972年 NaN Dennis MacAlistair Ritchie3 js NaN NaN Brendan Eich4 php 2012年 NaN Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup# 結(jié)果解析:通過設(shè)置 how="all" 因?yàn)樵瓟?shù)據(jù)不存在全為 NaN 的數(shù)據(jù)列,因此并沒有進(jìn)行數(shù)據(jù)的過濾,輸出為原數(shù)據(jù)集# 4. thresh=4 只保留含有4個及4個以上的非缺失值的數(shù)據(jù)new_data= data.dropna(axis=1,thresh=4)print(new_data)# --- 輸出結(jié)果 --- 編程語言 推出時間 主要創(chuàng)始人0 java NaN James Gosling1 python 1991年 NaN2 NaN 1972年 Dennis MacAlistair Ritchie3 js NaN Brendan Eich4 php 2012年 Rasmus Lerdorf5 C++ 1983年 Bjarne Stroustrup# 結(jié)果解析:因?yàn)?價格"這一列只有3個非缺失值的數(shù)據(jù),因此設(shè)置 thresh=4,會將該列過濾掉。 # 5. subset 指定要過濾的數(shù)據(jù)列new_data= data.dropna(axis=0,subset=["價格","主要創(chuàng)始人"])print(new_data)# --- 輸出結(jié)果 --- 編程語言 推出時間 價格 主要創(chuàng)始人0 java NaN 45.6 James Gosling5 C++ 1983年 75.0 Bjarne Stroustrup# 結(jié)果解析:這里通過 subset 指定過濾"價格""主要創(chuàng)始人"列中存在 NaN 數(shù)據(jù)的行,通過結(jié)果可以看到,過濾掉了行索引為1,2,3,4的行。

2.1 命令行參數(shù)

在 windows 和 linux 中,操作系統(tǒng)提供了命令行的控制方式,用戶輸入命令完成任務(wù)。例如,建立一個目錄,輸入如下命令:C:\> mkdir test這條命令創(chuàng)建了一個名稱為 test 的目錄,字符串 ‘mkdir’ 和字符串 ‘test’ 被稱為命令行參數(shù)。

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

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

幫助反饋 APP下載

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

公眾號

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