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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
2.1 修改行索引值

# 導(dǎo)入pandas包import pandas as pd# 指定導(dǎo)入的文件地址data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小節(jié)/execl數(shù)據(jù)demo.xlsx"# 解析數(shù)據(jù)data = pd.read_excel(data_path)print(data)# --- 輸出結(jié)果 --- 編程語(yǔ)言 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人0 java 1995年 45.6 James Gosling1 python 1991年 67.0 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.0 Bjarne Stroustrup# 修改行索引和 rename({0: "aa", 2: "bb", 3: "cc"},axis=0) 等價(jià)data_res=data.rename(index={0: "aa", 2: "bb", 3: "cc"})print(data_res)# --- 輸出結(jié)果 --- 編程語(yǔ)言 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人aa java 1995年 45.6 James Gosling1 python 1991年 67.0 Guido van Rossumbb C 1972年 33.9 Dennis MacAlistair Ritchiecc js 1995年 59.5 Brendan Eich4 php 2012年 69.9 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup輸出解析:我們通過(guò) index 參數(shù)指定映射關(guān)系,修改了列索引0,2,3的索引值為aa,bb,cc,通過(guò)輸出結(jié)果可以看出修改的效果。

3.3 os.path.dirname(path)

os.path.dirname 的功能是獲取路徑名中的目錄名,該函數(shù)的使用示例:>>> import os>>> os.dirname('C:\\Windows\\Readme.txt')'C:\\Windows'

2.5 lambda(匿名函數(shù))

val sumLambda: (Int, Int, Int) -> Int = { a, b, c -> a + b + c }//調(diào)用println("sum = ${sumLambda(1, 6, 7)}")

3. 運(yùn)行效果

雖然運(yùn)行效果比較簡(jiǎn)單,但是通過(guò)前面的代碼分析,我們可以知道,“This string from C++” 這個(gè)字串是在 Java 源碼中調(diào)用 Cpp 源碼中的函數(shù)來(lái)獲取的。這是一個(gè)最簡(jiǎn)單的項(xiàng)目支持 C/C++ 的例子。

3. -XX:+TraceClassLoading 參數(shù)

參數(shù)作用:-XX:+TraceClassLoading 參數(shù)是為了跟蹤類(lèi)的加載。為了更好的理解并掌握 -XX:+TraceClassLoading 參數(shù),我們通過(guò)如下步驟進(jìn)行操作。步驟 1:在 VM Options 中配置參數(shù) -XX:+TraceClassLoading 并保存;步驟 2:運(yùn)行示例代碼,觀察執(zhí)行結(jié)果。結(jié)果驗(yàn)證:由于追蹤的結(jié)果日志非常龐大,此處僅展示具有代表性的類(lèi)的加載。全部的類(lèi)加載日志,請(qǐng)學(xué)習(xí)者自行執(zhí)行代碼進(jìn)行驗(yàn)證。[Opened C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.lang.Object from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.util.ArrayList$SubList from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.util.ListIterator from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.util.ArrayList$SubList$1 from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded DemoMain.TracingClassParamsDemo from file:/D:/GIT-Repositories/GitLab/Demo/out/production/Demo/][Loaded java.lang.Class$MethodArray from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.lang.Void from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.lang.Shutdown from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar][Loaded java.lang.Shutdown$Lock from C:\Program Files\Java\jdk1.8.0_152\jre\lib\rt.jar]結(jié)果分析:我們來(lái)對(duì)類(lèi)的加載日志進(jìn)行分析。第一行:Opened rt.jar。打開(kāi) rt.jar,rt.jar 全稱是 Runtime,該 jar 包含了所有支持 Java 運(yùn)行的核心類(lèi)庫(kù),是類(lèi)加載的第一步;第二行:加載 java.lang.Object。Object 是所有對(duì)象的父類(lèi),是首要加載的類(lèi);第三、四、五行:加載了 ArrayList 的相關(guān)類(lèi),我們的示例代碼中使用到了 ArrayList,因此需要對(duì)該類(lèi)進(jìn)行加載;第六行:加載我們的測(cè)試類(lèi) TracingClassParamsDemo ;第七行:加載 java.lang.Class 類(lèi),并加載類(lèi)方法 MethodArray;第八行:加載 java.lang.Void 類(lèi),因?yàn)槲覀兊?main 函數(shù)是 void 的返回值類(lèi)型,所以需要加載此類(lèi);第九、十行:加載 java.lang.Shutdown 類(lèi), JVM 結(jié)束運(yùn)行后,關(guān)閉 JVM 虛擬機(jī)。從以上對(duì)日志的分析來(lái)看,JVM 對(duì)類(lèi)的加載,不僅僅加載我們代碼中使用的類(lèi),還需要加載各種支持 Java 運(yùn)行的核心類(lèi)。類(lèi)加載的日志量非常龐大,此處僅僅對(duì)重點(diǎn)類(lèi)的加載進(jìn)行日志的解讀,全部的類(lèi)加載日志,請(qǐng)學(xué)習(xí)者自行執(zhí)行代碼進(jìn)行驗(yàn)證。

3.3 在字面量對(duì)象中的使用

和數(shù)組一樣,展開(kāi)語(yǔ)法在字面量對(duì)象中的使用方式也有很多種:const obj1 = {a: 1, b: 2};const obj2 = {...obj1, c: 30};console.log(obj2); // {a:1, b:2, c:30}const obj3 = {b: 20, c: 30};const obj4 = {...obj2, ...obj3}; // 合并對(duì)象console.log(obj4); // {a:1, b:20, c:30}上面的代碼可以看出,使用方式和數(shù)組基本一致,都是把數(shù)組或?qū)ο笾械拿恳豁?xiàng)展開(kāi)到另一個(gè)數(shù)組或?qū)ο笾腥ァ?/p>

4.2 pop (key) 方法

pop (key) 方法刪除字典給定鍵 key 所對(duì)應(yīng)的鍵值對(duì),返回被刪除的值,示例如下:>>> x = {'a':'A', 'b':'B', 'c': 'C'}>>> x.pop('b')'B'>>> x{'a':'A', 'c':'C'}在第 1 行,創(chuàng)建一個(gè)具有 3 個(gè)鍵值對(duì)的字典;在第 2 行,使用方法 pop (‘b’) 從字典中刪除鍵 ‘b’ 對(duì)應(yīng)的鍵值對(duì);在第 3 行,方法 pop (‘b’) 返回鍵 ‘b’ 對(duì)應(yīng)的值 ‘B’;在第 4 行,顯示刪除后的字典;在第 5 行,刪除一個(gè)鍵值對(duì)后,字典僅包含 2 個(gè)鍵值對(duì)。

1. 基本用法

range 可以用來(lái)遍歷的對(duì)象有數(shù)組、切片、map、字符串以及通道。遍歷的對(duì)象不同,range 的返回值也會(huì)有所不同。遍歷數(shù)組、切片和字符串時(shí),它返回的就是數(shù)據(jù)的索引和值。遍歷map時(shí)返回的就是map的key和value。而遍歷通道時(shí)則只返回通道中的數(shù)據(jù)。代碼示例:package mainimport ( "fmt")func main() { str := "Codey" intArray := [5]int{1, 2, 3, 4, 5} intSlice := []int{1, 2, 3, 4, 5} m := map[string]string{"Apple": "蘋(píng)果", "Orange": "橘子", "Banana": "香蕉"} c := make(chan int, 10) c <- 10 c <- 11 c <- 12 c <- 13 c <- 14 fmt.Println("---字符串的遍歷---") //遍歷字符串 for k, v := range str { fmt.Printf("索引:%d,值:%c\n", k, v) } fmt.Println("---數(shù)組的遍歷---") //遍歷數(shù)組 for k, v := range intArray { fmt.Printf("索引:%d,值:%d\n", k, v) } fmt.Println("---切片的遍歷---") //遍歷切片 for k, v := range intSlice { fmt.Printf("索引:%d,值:%d\n", k, v) } fmt.Println("---map的遍歷---") //遍歷map for k, v := range m { fmt.Printf("key:%s,value:%s\n", k, v) } fmt.Println("---通道的遍歷---") //遍歷通道 for v := range c { fmt.Printf("值:%d\n", v) if len(c) == 0 { break } }}執(zhí)行結(jié)果:若是在開(kāi)發(fā)過(guò)程中只想用到遍歷對(duì)象的索引或者值,比如說(shuō)一個(gè)map以汽車(chē)的車(chē)牌號(hào)為key存儲(chǔ)了一些汽車(chē)的信息,但是你只想要操作車(chē)牌號(hào)??梢允褂胈來(lái)接收不需要使用的值。如果是只想用索引的話,可以直接只用一個(gè)參數(shù)接收遍歷對(duì)象傳出的值,默認(rèn)只會(huì)接收索引。代碼示例:package mainimport ( "fmt")func main() { m := map[string]string{"Apple": "蘋(píng)果", "Orange": "橘子", "Banana": "香蕉"} fmt.Println("---map的key值---") //只取key for k := range m { fmt.Printf("key:%s\n", k) } fmt.Println("---map的value值---") //只取value for _, v := range m { fmt.Printf("value:%s\n", v) }}執(zhí)行結(jié)果:

2.1 使用 return+ 返回值返回

和其它語(yǔ)言不同的是,Go 語(yǔ)言可以一次返回多個(gè)值,多個(gè)值直接跟在 return 關(guān)鍵字之后,使用,隔開(kāi)即可。代碼示例:package mainimport "fmt"func SumAndProduct(a, b int) (int, int) { c := a + b d := a * b return c, d //同時(shí)返回c和d兩個(gè)變量}func main() { sum, product := SumAndProduct(1, 2) //接收多返回值的函數(shù)時(shí),也需要用逗號(hào)隔開(kāi)變量 fmt.Println("a + b =", sum) fmt.Println("a * b =", product)}執(zhí)行結(jié)果:

2. 一次不務(wù)正業(yè)的發(fā)明

C 語(yǔ)言的發(fā)明和很多偉大的發(fā)明一樣,都是一個(gè)人或者幾個(gè)人不務(wù)正業(yè)閑著沒(méi)事偶然間發(fā)明的。據(jù)說(shuō)當(dāng)時(shí)有一個(gè)年輕人為了能夠在一臺(tái)上機(jī)費(fèi)更便宜的計(jì)算機(jī)上愉快的進(jìn)行兩人對(duì)戰(zhàn)游戲,但不幸的是,這臺(tái)機(jī)器上原有的操作系統(tǒng)只能支持一個(gè)人在線游戲,于是這位熱愛(ài)游戲的年輕人不得不重新為這臺(tái)機(jī)器編寫(xiě)一個(gè)新的操作系統(tǒng),可以支持多用戶,這樣大家就可以一起同時(shí)在線玩這個(gè)游戲了。而在編寫(xiě)這個(gè)操作系統(tǒng)的過(guò)程中,他們對(duì) B 語(yǔ)言進(jìn)行了升級(jí),于是 C 語(yǔ)言誕生了。這個(gè)發(fā)明 C 語(yǔ)言的年輕人叫丹尼斯?里奇 Dennis M. Ritchie [1]。C 語(yǔ)言派生自 BCPL 語(yǔ)言,并且 C 語(yǔ)言對(duì) BCPL 語(yǔ)言有了長(zhǎng)足的擴(kuò)展。因?yàn)?BCPL 簡(jiǎn)稱為 B 語(yǔ)言,因此 C 語(yǔ)言就采用了字母表中的下一個(gè)字母來(lái)作為語(yǔ)言的名稱。講真這名字起得夠隨意的,不過(guò)話說(shuō)回來(lái)了 B 語(yǔ)言這名字好像就是來(lái)自 A 語(yǔ)言的,有興趣的同學(xué)可以去了解一下這三門(mén)語(yǔ)言之間的淵源,在這里我們就不多贅述了。下面是一個(gè) C 語(yǔ)言發(fā)展歷史的列表:語(yǔ)言年份開(kāi)發(fā)者Algol1960International GroupBCPL1967Martin RichardB1970Ken ThompsonTraditional C1972Dennis RitchieK & R C1978Kernighan & Dennis RitchieANSI C1989ANSI CommitteeANSI/ISO C1990ISO CommitteeC991999Standardization Committee表1: C 語(yǔ)言發(fā)展歷程 [3]圖1: C 語(yǔ)言發(fā)明者 Dennis Ritchie [2]

2.3 合并對(duì)象

let target = {a: 1};let source1 = {b: 2};let source2 = {c: 3};Object.assign(target, source1, source2);console.log(target); // {a: 1, b: 2, c: 3}上面的代碼可以看出,Object.assign () 不會(huì)把目標(biāo)對(duì)象清空,會(huì)合并后面所有的對(duì)象上的值。

2.2 拷貝對(duì)象

let target = {};let source = {a: 1, b: 2, c: 3};Object.assign(target, source);target.d = 4;console.log(target) // {a: 1, b: 2, c: 3, d: 4}console.log(source) // {a: 1, b: 2, c: 3}上面的代碼可以看出,Object.assign () 的主要用法就是把源對(duì)象拷貝到指定的對(duì)象上去,目標(biāo)對(duì)象的更改不會(huì)影響源對(duì)象。

2.LEFT JOIN 左連接

以課程表 course 和 teacher 左連接為例:SELECT c.id AS course_id,c.*,t.* FROM course c LEFT JOIN teacher t ON c.teacher_id=t.id; 執(zhí)行結(jié)果如下圖:Tips:這對(duì)上述 sql 語(yǔ)句說(shuō)明如下:c.id AS course_id 表示將 course表 中 id 字段重命名為 course_id 展示,其目的是為了防止和 teacher表 中 id 字段混淆;c.* 表示 course 表所有字段數(shù)據(jù);t.* 表示 teacher 表字段所有數(shù)據(jù);ON 后面跟著的條件是連接表的條件;course c 表示將 course 簡(jiǎn)寫(xiě)為 c, teacher t 表示將 teacher 簡(jiǎn)寫(xiě)為 t;LEFT JOIN 為左連接,是以左邊的表為’基準(zhǔn)’,若右表沒(méi)有對(duì)應(yīng)的值,用 NULL 來(lái)填補(bǔ)。

2.3 BinaryOutputArchive

BinaryOutputArchive 是二進(jìn)制的序列化方式,這種方式將 Java 對(duì)象轉(zhuǎn)化成二進(jìn)制的格式來(lái)進(jìn)行數(shù)據(jù)傳輸。在它的具體方法中,使用的是 java.io.DataOutputStream 的方法來(lái)完成 Java 對(duì)象到二進(jìn)制的轉(zhuǎn)換,我們來(lái)看看具體實(shí)現(xiàn):/*** 二進(jìn)制的序列化*/public class BinaryOutputArchive implements OutputArchive { // 定義字節(jié)緩沖區(qū)大小 private ByteBuffer bb = ByteBuffer.allocate(1024); // 數(shù)據(jù)輸出接口 DataOutput private DataOutput out; // 使用 OutputStream 初始化 BinaryOutputArchive public static BinaryOutputArchive getArchive(OutputStream strm) { return new BinaryOutputArchive(new DataOutputStream(strm)); } // 構(gòu)造方法傳入 DataOutput public BinaryOutputArchive(DataOutput out) { this.out = out; } // 輸出 byte 類(lèi)型為二進(jìn)制 public void writeByte(byte b, String tag) throws IOException { this.out.writeByte(b); } // 輸出 boolean 類(lèi)型為二進(jìn)制 public void writeBool(boolean b, String tag) throws IOException { this.out.writeBoolean(b); } // 輸出 int 類(lèi)型為二進(jìn)制 public void writeInt(int i, String tag) throws IOException { this.out.writeInt(i); } // 輸出 long 類(lèi)型為二進(jìn)制 public void writeLong(long l, String tag) throws IOException { this.out.writeLong(l); } // 輸出 float 類(lèi)型為二進(jìn)制 public void writeFloat(float f, String tag) throws IOException { this.out.writeFloat(f); } // 輸出 double 類(lèi)型為二進(jìn)制 public void writeDouble(double d, String tag) throws IOException { this.out.writeDouble(d); } // 工具方法:字符串轉(zhuǎn)字節(jié)緩沖區(qū) private ByteBuffer stringToByteBuffer(CharSequence s) { this.bb.clear(); int len = s.length(); for(int i = 0; i < len; ++i) { if (this.bb.remaining() < 3) { ByteBuffer n = ByteBuffer.allocate(this.bb.capacity() << 1); this.bb.flip(); n.put(this.bb); this.bb = n; } char c = s.charAt(i); if (c < 128) { this.bb.put((byte)c); } else if (c < 2048) { this.bb.put((byte)(192 | c >> 6)); this.bb.put((byte)(128 | c & 63)); } else { this.bb.put((byte)(224 | c >> 12)); this.bb.put((byte)(128 | c >> 6 & 63)); this.bb.put((byte)(128 | c & 63)); } } this.bb.flip(); return this.bb; } // 輸出 String 類(lèi)型為二進(jìn)制 public void writeString(String s, String tag) throws IOException { if (s == null) { this.writeInt(-1, "len"); } else { // String 不為空轉(zhuǎn)字節(jié)緩沖區(qū) ByteBuffer bb = this.stringToByteBuffer(s); this.writeInt(bb.remaining(), "len"); // 輸出 字節(jié)數(shù)組 this.out.write(bb.array(), bb.position(), bb.limit()); } } // 輸出 字節(jié)數(shù)組為二進(jìn)制 public void writeBuffer(byte[] barr, String tag) throws IOException { if (barr == null) { this.out.writeInt(-1); } else { this.out.writeInt(barr.length); this.out.write(barr); } }}介紹了序列化的具體實(shí)現(xiàn)類(lèi),接下來(lái)就是反序列化接口 InputArchive 的實(shí)現(xiàn)類(lèi) BinaryInputArchive。

1.2 控制遍歷順序

如果想要改變遍歷的順序,一種是上面案例中提到的,利用 copy 方法來(lái)修改內(nèi)存順序。當(dāng)然,nditer 也提供了 order 參數(shù)來(lái)達(dá)到同樣的目的。案例C order,即是行序優(yōu)先,跟默認(rèn)的遍歷順序一致。print ('以 C 風(fēng)格順序排序:')for i in np.nditer(arr, order="C"): print(i, end=" ")打印結(jié)果為:以 C 風(fēng)格順序排序:0 1 2 3 4 5 Fortran order,即是列序優(yōu)先:print ('以 F 風(fēng)格順序排序:')for i in np.nditer(arr, order="F"): print(i, end=" ")打印結(jié)果為:以 F 風(fēng)格順序排序:0 3 1 4 2 5

2.2 insert() 方法新增數(shù)據(jù)列

insert(loc, column, value, allow_duplicates=False) 函數(shù)可以實(shí)現(xiàn)向指定的列中添加數(shù)據(jù):參數(shù)名說(shuō)明loc指定插入列的序號(hào),從0開(kāi)始column列索引名value插入的列數(shù)據(jù)duplicates是否允許插入已有的數(shù)據(jù),如果為 False 插入重復(fù)數(shù)據(jù)會(huì)報(bào)錯(cuò)# 導(dǎo)入pandas包import pandas as pd# 指定導(dǎo)入的文件地址 默認(rèn)是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小節(jié)/execl數(shù)據(jù)demo.xlsx"data = pd.read_excel(data_path)print(data)# --- 輸出結(jié)果 --- 編程語(yǔ)言 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人0 java 1995年 45.6 James Gosling1 python 1991年 67.0 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.0 Bjarne Stroustrup# 通過(guò) insert() 函數(shù),在第1列插入列索引為 new 的數(shù)據(jù)列data.insert(0,"new",["a","b","c","d","e","f"], allow_duplicates=False)print(data)# --- 輸出結(jié)果 --- new 編程語(yǔ)言 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人0 a java 1995年 45.6 James Gosling1 b python 1991年 67.0 Guido van Rossum2 c C 1972年 33.9 Dennis MacAlistair Ritchie3 d js 1995年 59.5 Brendan Eich4 e php 2012年 69.9 Rasmus Lerdorf5 f C++ 1983年 75.0 Bjarne Stroustrup輸出解析:通過(guò) insert() 函數(shù)操作,我們看到輸出結(jié)果在第一列新增了數(shù)據(jù)列內(nèi)容。

2.3 例子:回顯所有的參數(shù)

編寫(xiě)程序 echo.py,程序顯示所有的參數(shù):import sysfor arg in sys.argv: print(arg)程序遍歷數(shù)組 sys.argv,打印數(shù)組中的參數(shù)。在命令行中運(yùn)行程序:C:\> python echo.py a b cecho.pyabcsys.argv 包括 4 個(gè)參數(shù):‘echo.py’、‘a(chǎn)’、‘b’、‘c’

3. Httpd 安裝

安裝模式有 2 種,手動(dòng)離線安裝和 yum 安裝,由于 httpd 是 C 程序,如果是手動(dòng)安裝的話要先安裝 C 對(duì)應(yīng)的環(huán)境和 httpd 依賴的一些包。yum 的安裝方式相對(duì)比較簡(jiǎn)單。

4. 另一個(gè)分而治之的應(yīng)用介紹

另一個(gè)分治算法的典型應(yīng)用是大整數(shù)相乘問(wèn)題。對(duì)于兩個(gè)以字符串形式表示的長(zhǎng)整數(shù),計(jì)算其相乘結(jié)果。關(guān)于分治法比較核心的一個(gè)問(wèn)題就是,找到如何將子問(wèn)題的解合并成父問(wèn)題的解。我們簡(jiǎn)單描述一下這個(gè)基于分治思想的大數(shù)乘法算法,又叫 Karatsuba 算法。假設(shè) x 和 y 是兩個(gè)要做乘法的十進(jìn)制大數(shù),并且位數(shù)分別為 m 和 n。若將 x 和 y 分別均分成兩部分,則 x 和 y 可以表示如下:x=a?10m2+bx = a*10^{\frac{m}{2}} + bx=a?102m?+by=c?10n2+dy = c*10^{\frac{n}{2}} + dy=c?102n?+d此時(shí)有:x?y=(a?10m2+b)(c?10n2+d)=ac?10m+n2+bc?10n2+ad?10m2+bdx*y=(a*10^{\frac{m}{2}} + b)(c*10^{\frac{n}{2}} + d)=ac*10^{\frac{m+n}{2}}+bc*10^{\frac{n}{2}}+ad*10^{\frac{m}{2}}+bdx?y=(a?102m?+b)(c?102n?+d)=ac?102m+n?+bc?102n?+ad?102m?+bd這樣大整數(shù)乘法就被分解成 4 個(gè)長(zhǎng)度減半的整數(shù)的乘法。如此執(zhí)行下去,直到執(zhí)行的乘法的兩數(shù)足夠小時(shí),然后計(jì)算反推最終結(jié)果。根據(jù)上面的執(zhí)行思路,我們開(kāi)始一步一步得到大整數(shù)相乘的分治代碼。首先處理初始以及最后分治的終止條件:如果 s1 或者 s2 中有一個(gè)為空串,那么相乘結(jié)果為 '0‘,注意輸出字符串;此外,分解到最后 s1 和 s2 字符串的長(zhǎng)度均為1 時(shí),我們可以直接將兩個(gè)字符串強(qiáng)裝成數(shù)字然后進(jìn)行相乘,最后返回的結(jié)果也要再轉(zhuǎn)成字符串:if not s1 or not s2: # 有一個(gè)為空,則結(jié)果為0 return '0'elif len(s1) == 1 and len(s2) == 1: # 終止條件 return str(int(s1) * int(s2))接下來(lái)開(kāi)始對(duì)字符串 s1 和 s2 進(jìn)行分治求解:# 其余情況l1 = len(s1) // 2l2 = len(s2) // 2# 將s1分成兩部分a = s1[:l1] b = s1[l1:]# 將s2分成兩部分c = s2[:l2]d = s2[l2:]接下來(lái)我們分別得到了4個(gè)子串:a、b、c、d。按照前面的公式,我們分別要計(jì)算 ac、bc、ad 和 bd 的值。這些值可以使用遞歸方法得到,要注意相乘結(jié)果的10次冪需要保留,以便后續(xù)能合成最終問(wèn)題的解。mi = len(b) # 對(duì)于a的10次冪ni = len(d) # 對(duì)于c的10次冪# 分別計(jì)算ac, ad, bc, bd,分別補(bǔ)上相應(yīng)的冪次,使用分治計(jì)算x1 = bigDataMultiple(a, c) + '0' * (mi + ni)x2 = bigDataMultiple(a, d) + '0' * mix3 = bigDataMultiple(b, c) + '0' * ni x4 = bigDataMultiple(b, d)最后是計(jì)算 x1+x2+x3+x4 的值便可得到原大問(wèn)題的解,由于 x1~x4 均為字符串,我們按照字符串上每位數(shù)字相加來(lái)進(jìn)行。首先需要將所有字符串的長(zhǎng)度統(tǒng)一,對(duì)于短字符串需要將前面補(bǔ)零:max_len = max(len(x1), len(x2), len(x3), len(x4))x1 = '0' * (max_len - len(x1)) + x1x2 = '0' * (max_len - len(x2)) + x2x3 = '0' * (max_len - len(x3)) + x3x4 = '0' * (max_len - len(x4)) + x4接著從字符串最后一位開(kāi)始,計(jì)算每位上的值,注意進(jìn)位問(wèn)題即可:res = ''c = 0for i in range(max_len - 1, -1, -1): s = int(x1[i]) + int(x2[i]) + int(x3[i]) + int(x4[i]) + c res = str(s % 10) + res c = s // 10# 注意,如果循環(huán)完后進(jìn)位>0,需要補(bǔ)上進(jìn)位值if c > 0: res = str(c) + res然而,通過(guò)提交代碼發(fā)現(xiàn)有時(shí)候在合成最終結(jié)果時(shí),字符串前面會(huì)出現(xiàn) ‘0’。因此下面的代碼就是找到前面非 ‘0’ 開(kāi)頭字符的位置:# 去掉res最前面的'0'k = 0while res and k < len(res) and res[k] == '0': k += 1最后得到大整數(shù)相乘的最終結(jié)果為:res[k:]。綜合前面的分析與討論,得到完成的處理大整數(shù)相乘問(wèn)題的 Python 實(shí)現(xiàn)如下:def bigDataMultiple(s1, s2): """ 計(jì)算 s1 * s2,返回大整數(shù)相乘結(jié)果 """ if not s1 or not s2: # 有一個(gè)為空,則結(jié)果為0 return '0' elif len(s1) == 1 and len(s2) == 1: # 終止條件 return str(int(s1) * int(s2)) # 其余情況 l1 = len(s1) // 2 l2 = len(s2) // 2 # 將s1分成兩部分 a = s1[:l1] b = s1[l1:] # 將s2分成兩部分 c = s2[:l2] d = s2[l2:] mi = len(b) # 對(duì)于a的10次冪 ni = len(d) # 對(duì)于c的10次冪 # 分別計(jì)算ac, ad, bc, bd,分別補(bǔ)上相應(yīng)的冪次,使用分治計(jì)算 x1 = bigDataMultiple(a, c) + '0' * (mi + ni) x2 = bigDataMultiple(a, d) + '0' * mi x3 = bigDataMultiple(b, c) + '0' * ni x4 = bigDataMultiple(b, d) # 將計(jì)算的結(jié)果根據(jù)最長(zhǎng)的補(bǔ)零,方便后面直接相加計(jì)算 max_len = max(len(x1), len(x2), len(x3), len(x4)) x1 = '0' * (max_len - len(x1)) + x1 x2 = '0' * (max_len - len(x2)) + x2 x3 = '0' * (max_len - len(x3)) + x3 x4 = '0' * (max_len - len(x4)) + x4 # 計(jì)算x1+x2+x3+x4的值,也就是原問(wèn)題的解 res = '' c = 0 for i in range(max_len - 1, -1, -1): s = int(x1[i]) + int(x2[i]) + int(x3[i]) + int(x4[i]) + c res = str(s % 10) + res c = s // 10 # 注意,如果循環(huán)完后進(jìn)位>0,需要補(bǔ)上進(jìn)位值 if c > 0: res = str(c) + res # 去掉res最前面的'0' k = 0 while res and k < len(res) and res[k] == '0': k += 1 return res[k:]這道題是??途W(wǎng)上的原題,我實(shí)現(xiàn)的分治算法略微復(fù)雜,大家可以參考上面的一些題解,有非常精簡(jiǎn)和高效的實(shí)現(xiàn)。多參考優(yōu)秀的代碼對(duì)我們提升自己編程能力也是有莫大好處的。

2.2 刪除指定的列

# 導(dǎo)入pandas包import pandas as pd# 指定導(dǎo)入的文件地址data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第7,8,9,10小節(jié)/execl數(shù)據(jù)demo.xlsx"# 解析數(shù)據(jù)data = pd.read_excel(data_path)print(data)# --- 輸出結(jié)果 --- 編程語(yǔ)言 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人0 java 1995年 45.6 James Gosling1 python 1991年 67.0 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.0 Bjarne Stroustrup# 刪除指定列data_res=data.drop(labels=["推出時(shí)間","主要?jiǎng)?chuàng)始人"],axis=1)print(data_res)# --- 輸出結(jié)果 --- 編程語(yǔ)言 價(jià)格0 java 45.61 python 67.02 C 33.93 js 59.54 php 69.95 C++ 75.0輸出解析:通過(guò) labels 設(shè)置刪除指定的列,列索引名要真實(shí)存在,不然會(huì)報(bào)錯(cuò),同時(shí) axis=1 是指定刪除列操作,不能省略。通過(guò)輸出結(jié)果可以看到刪除了推出時(shí)間和主要?jiǎng)?chuàng)始人這兩列的數(shù)據(jù)。

1.3 flatten

numpy.ndarray.flatten返回一份數(shù)組拷貝,并折疊為一維的數(shù)組。對(duì)拷貝所做的修改不會(huì)影響原始數(shù)組,函數(shù)原型如下:ndarray.flatten(order='C')其中,order 可選:‘C’ – 按行,‘F’ – 按列,‘A’ – 原順序,‘K’ – 元素在內(nèi)存中的出現(xiàn)順序。案例將數(shù)組 arr0 以特定順序展開(kāi):print("將arr0以行順序展開(kāi):", arr0.flatten(order='C'))print("將arr0以列順序展開(kāi):", arr0.flatten(order='F'))執(zhí)行結(jié)果為:將arr0以行順序展開(kāi): [0 1 2 3 4 5 6 7]將arr0以列順序展開(kāi): [0 4 1 5 2 6 3 7]

2. Activity 的生命周期

如果你學(xué)習(xí)過(guò) C/C++ 或者 Java 開(kāi)發(fā)應(yīng)該很熟悉main()函數(shù),沒(méi)錯(cuò),一切代碼都是從main()函數(shù)開(kāi)始的。在 Android 中也有類(lèi)似的概念,每個(gè) Android 應(yīng)用程序都有一個(gè)主 Activity(啟動(dòng) Activity),而其中的onCreate()方法就是所有代碼的起點(diǎn)。

3.1 OmniMarkupPreviewer

markdown 文件預(yù)覽插件,安裝如下:快捷鍵使用如下:說(shuō)明Windows/LinuxOSX在瀏覽器里預(yù)覽Ctrl+Alt+O?+?+O導(dǎo)出成 HTMLCtrl+Alt+X?+?+X用 HTML 格式復(fù)制文件Ctrl+Alt+C?+?+C

4. 解構(gòu)字符串

當(dāng)然字符串也是可以被解構(gòu)的,字符串可以當(dāng)作數(shù)組被解構(gòu)。const [a, b, c, d, e] = 'imooc';console.log(a); // "i"console.log(b); // "m"console.log(c); // "o"console.log(d); // "o"console.log(e); // "c"字符串可以被看成類(lèi)數(shù)組的東西,類(lèi)似數(shù)組的對(duì)象都有一個(gè) length 屬性,字符串也可以被當(dāng)作對(duì)象來(lái)解構(gòu),但是由于字符串方法只有 length 屬性,所以只能解構(gòu)出 length 的值。let {length : len} = 'hello';console.log(len); // 5

3.2 文件輸入

通過(guò)openFileInput()可以讀取我們剛剛創(chuàng)建的文件,和FileOutputStream方法類(lèi)似,該方法返回一個(gè)輸入流,接著我們可以從輸入流里讀取數(shù)據(jù),代碼示例如下:FileInputStream in = openFileInput(file);int c;String temp="";// 挨個(gè)讀取字符while( (c = in.read()) != -1){ temp = temp + Character.toString((char)c);}// temp就是從文件中讀取的內(nèi)容in.close();

3.1 os.path 模塊

os.path 模塊是 os 模塊的子模塊,用于處理文件路徑名。路徑名由兩部分構(gòu)成:目錄名和文件名。例如:路徑 C:\Windows\Readme.txt,目錄名為 C:\Windows,文件名為 Readme.txt。

1. 創(chuàng)建項(xiàng)目

創(chuàng)建支持原生代碼的新項(xiàng)目的步驟與創(chuàng)建任何其他 Android Studio 項(xiàng)目的步驟相似,但還需要執(zhí)行一個(gè)額外的步驟:在向?qū)У?Choose your project 部分中,選擇 Native C++ 項(xiàng)目類(lèi)型。點(diǎn)擊 Next。填寫(xiě)向?qū)乱徊糠种械乃衅渌侄?。點(diǎn)擊 Next。在向?qū)У?Customize C++ Support 部分中,您可以使用 C++ Standard 字段來(lái)自定義項(xiàng)目。使用下拉列表選擇您想要使用哪種 C++ 標(biāo)準(zhǔn)化。選擇 Toolchain Default 可使用默認(rèn)的 CMake 設(shè)置。點(diǎn)擊 Finish。至此,項(xiàng)目創(chuàng)建完成,我們可以看到項(xiàng)目中同時(shí)包含了 Java 代碼和 Cpp 代碼。

10. 集合的使用

1. 對(duì)集合進(jìn)行迭代:fun main(args: Array<String>) { val items = list.of("java", "kotlin", "python") for (item in items) { println(item) }}2. 使用 in 運(yùn)算符判斷集合內(nèi)是否包含某個(gè)實(shí)例:when { "java" in items -> println("is good lang") "kotlin" in items -> println("is good good lang") else -> println("python is best lang")}3. 使用 lambda 表達(dá)式來(lái)過(guò)濾(filter)和映射(map)集合:fun main(args: Array<String>) { val langs = listOf("C", "C++", "Java", "Python", "JavaScript") langs.filter { it.startsWith("C") } .sortedBy { it } .map { it.toUpperCase() } .forEach { println(it) }}

1. 創(chuàng)建數(shù)組

數(shù)組由中括號(hào) [] 包裹,每一項(xiàng)之間用逗號(hào) , 分隔。[第一項(xiàng), 第二項(xiàng), 第三項(xiàng), ... , 第n項(xiàng)]創(chuàng)建數(shù)組最常見(jiàn)的方式是使用字面量。var hobby = ['java', 'c', 'c++', 'python', 'javascript', 1, 2, 3, true, false];console.log(hobby);通過(guò)直接描述一個(gè)數(shù)組的方式就可以創(chuàng)建一個(gè)數(shù)組。

2.3 Debugger 標(biāo)簽

我們可以在 Debugger 標(biāo)簽中指定調(diào)試選項(xiàng)。對(duì)于 C 和 C++ 代碼,Android Studio 會(huì)使用 LLDB 調(diào)試程序。除了普通的 Android Studio 界面,調(diào)試程序窗口還有一個(gè) LLDB 標(biāo)簽,讓我們可以在調(diào)試過(guò)程中輸入 LLDB 命令。我們可以輸入與 Android Studio 用于在調(diào)試程序界面中顯示信息的命令相同的命令,還可以執(zhí)行其他操作。對(duì)于 C 和 C++ 項(xiàng)目,我們可以在 Debugger 標(biāo)簽中添加符號(hào)目錄,以及 LLDB 啟動(dòng)與連接后命令。Debug typeJava:僅調(diào)試 Java 代碼;Auto:讓 Android Studio 為我們的項(xiàng)目選擇最合適的調(diào)試類(lèi)型;Native:調(diào)試原生 C 或 C++ 代碼;Dual:在兩個(gè)單獨(dú)的調(diào)試會(huì)話中調(diào)試 Java 和原生代碼;Symbol Directories如果要添加符號(hào)文件來(lái)為調(diào)試程序提供在 Android Studio 外部生成的 C 或 C++ 代碼的信息,我們可以在此處添加一個(gè)或多個(gè)目錄。LLDB Startup Commands添加要在調(diào)試程序連接到進(jìn)程之前執(zhí)行的 LLDB 命令。LLDB Post Attach Commands添加要在調(diào)試程序連接到進(jìn)程之后立即執(zhí)行的 LLDB 命令。Logging:Target channels指定 LLDB 日志選項(xiàng)。Android Studio 會(huì)根據(jù)團(tuán)隊(duì)的經(jīng)驗(yàn)設(shè)置默認(rèn)選項(xiàng),所以速度不會(huì)太慢,但卻包含問(wèn)題排查所需的信息。Android Studio 錯(cuò)誤報(bào)告經(jīng)常需要請(qǐng)求日志。Before Launch定義啟動(dòng)之前的操作。

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

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

幫助反饋 APP下載

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

公眾號(hào)

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