通過JavaScript的由來可以知道,兩個語言本質上沒有太大的關系,僅僅只為了讓他們像,才讓 JavaScript 的名字中有了 Java ,才讓他的內部的一些設計機制像 Java。事實上 JavaScript 上在設計上還融合了C語言的語法,Self語言的原型設計等。
在 Python 交互模式下,用戶輸入命令 exit() 后,注意請輸入 exit() 而不是 exit,退出交互模式,如下圖所示:退出 Python 交互模式 從圖中可以看出,退出 Python 交互模式后,命令行提示符從 >>> 變?yōu)?C:\>,表示現在處于 Windows 命令模式下。
當合并的源對象是基本類型時,這些基本類型會作為最后對象上的值,而鍵則以數字遞增,其中如果值是 null 和 undefined 時會被忽略??慈缦聦嵗簐ar s1 = "abc";var s2 = true;var s3 = 10;var s4 = Symbol("foo")var obj = Object.assign({}, s1, null, s2, undefined, s3, s4);console.log(obj); // { "0": "a", "1": "b", "2": "c" }
功能說明Windows/LinuxMac復制F5F5移動F6F6安全刪除Alt+DeleteCommand+Delete重命名Shift+F6Shift+F6更改簽名Ctrl+F6Command+F6內嵌Ctrl+Alt+NCommand+Option+N提取方法Ctrl+Alt+MCommand+Option+M提取變量Ctrl+Alt+VCommand+Option+V提取字段Ctrl+Alt+FCommand+Option+F提取常量Ctrl+Alt+CCommand+Option+C提取參數Ctrl+Alt+PCommand+Option+P
按區(qū)間查詢主要用到了英文狀態(tài)下的冒號 “ : ” ,冒號左側是區(qū)間的開始位置,右側是結束位置。# 這里的 data 是上面我們從 Excel 中解析出來的數據print(data.loc[0:5,["編程語言","價格"]])# --- 輸出結果 --- 編程語言 價格0 java 45.61 python 67.02 C 33.93 js 59.54 php 69.95 C++ 75.0輸出解析: 這里的行索引我們傳入的是區(qū)間 0:5,從結果中可以看到數據內容正是這5行的數據,其中是包含區(qū)間兩端的值的。這里的行索引和列索引都可以設置為區(qū)間查找:# 這里的 data 是上面我們從 Excel 中解析出來的數據print(data.loc[3:5,"推出時間":"主要創(chuàng)始人"])# --- 輸出結果 --- 推出時間 價格 主要創(chuàng)始人3 1995年 59.5 Brendan Eich4 2012年 69.9 Rasmus Lerdorf5 1983年 75.0 Bjarne Stroustrup輸出解析:通過設置區(qū)間為條件,可以看到查詢的結果正是對應行索引和列索引所包含內的是數據。
Python 語言要求在需要表達代碼層次關系的場景中,必須使用縮進。如果不使用縮進,程序運行時則會報告錯誤。例如,編寫程序 no-indent.py 如下:if 2 > 1:print('2 > 1 is true')運行 no-indent.py,輸出結果如下:C:\> python no-indent.py File "no-indent.py", line 2 print('2 > 1 is true') ^IndentationError: expected an indented block輸出表明在程序的第 2 行缺乏縮進(expected an indented block)。
下面我們通過示例來看下 Array.isArray() 是怎樣判斷數組的。// 下面的函數調用都返回 trueArray.isArray([]);Array.isArray([10]);Array.isArray(new Array());Array.isArray(new Array('a', 'b', 'c'))// 鮮為人知的事實:其實 Array.prototype 也是一個數組。Array.isArray(Array.prototype); // 下面的函數調用都返回 falseArray.isArray();Array.isArray({});Array.isArray(null);Array.isArray(undefined);Array.isArray(17);Array.isArray('Array');Array.isArray(true);Array.isArray(false);Array.isArray(new Uint8Array(32))Array.isArray({ __proto__: Array.prototype });上面的代碼中對 JavaScript 中的數據類型做驗證,可以很好地區(qū)分數組類型。
編寫程序 select.py 如下:13在第 1 行,將用戶輸入的字符串保存在變量 color 中在第 2 行,執(zhí)行條件判斷:color 是否等于 ‘red’,如果成立則執(zhí)行第 3 行對應的分支在第 4 行,執(zhí)行條件判斷:color 是否等于 ‘green’,如果成立則執(zhí)行第 5 行對應的分支在第 6 行,執(zhí)行條件判斷:color 是否等于 ‘blue’,如果成立則執(zhí)行第 7 行對應的分支在第 8 行,如果以上條件判斷都不成立,則執(zhí)行第 9 行對應的分支運行程序 select.py,結果如下:C:\> python select.pygreencolor is green程序運行時,輸入字符串 green滿足程序第 4 行的條件判斷,輸出結果為 color is green再次運行程序 select.py,結果如下:C:\> python select.pyyellowyellow is other程序運行時,輸入字符串 yellow第 2 行、第 4 行、第 6 行的條件判斷均不成功,執(zhí)行第 9 行,輸出結果為 yellow is other
通過單鏈表實現堆棧,圖示如下:通過單鏈表實現堆棧 在上圖中,每個節(jié)點有兩個字段: item 和 next,item 用于存儲數據,next 指向下一個節(jié)點,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é)點在第 6 行,定義了類 Stack 描述堆棧在第 8 行,定義了頭指針 head,指向鏈表中的首個節(jié)點在第 10 行,定義了成員方法 push,將元素壓如到堆棧中在第 11 行,創(chuàng)建一個新節(jié)點 node在第 12 行,新節(jié)點 node 的 next 指向頭結點在第 13 行,頭結點指向新節(jié)點在第 15 行,創(chuàng)建一個對象 stack在第 16 行到第 18 行,依次壓入 3 個元素 ‘a’、‘b’、‘c’
Go 語言是強類型語言,各個雖然同是整型,但是不同整型的變量不允許直接賦值,需要進行強制類型轉換,同時長度大的整型向長度小的整型轉換時,要考慮溢出問題。而且不同類的整型無法進行運算,想要進行運算必須要進行強制類型轉換,使他們都變成同一類型之后,再運算。舉一個int8和int16類型的變量賦值與計算的例子:package mainimport ( "fmt" "math")func main() { var a int8 = math.MaxInt8 var b int16 = math.MaxInt8 + 1 fmt.Println(a, b) a = int8(b) fmt.Println(a, b) //因為b長度過長,在轉換為int8的過程中溢出了 //整型變量可以和常數進行計算 a = a + 1 b = b + 1 fmt.Println(a, b) //不同類型的整型變量計算必須強轉為相同類型,一般轉換為長度大的來計算 c := int16(a) + b fmt.Println(c)}輸出結果:各類型互相轉換輸出結果
泛型擦除會帶來什么影響,這里以 Kotlin 舉例,因為 Java 遇到的問題,Kotlin 同樣需要面對。看個例子:fun main(args: Array<String>) { val list1: List<Int> = listOf(1,2,3,4) val list2: List<String> = listOf("a","b","c","d") println(list1) println(list2)}上面兩個集合分別存儲了 Int 類型的元素和 String 類型的元素,但是在編譯后的 class 文件中的他們被替換成了 List 原生類型,一起來看下反編譯后的 Java 代碼:@Metadata( mv = {1, 1, 11}, bv = {1, 0, 2}, k = 2, d1 = {"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\b\u0002\u001a\u0019\u0010\u0000\u001a\u00020\u00012\f\u0010\u0002\u001a\b\u0012\u0004\u0012\u00020\u00040\u0003¢\u0006\u0002\u0010\u0005¨\u0006\u0006"}, d2 = {"main", "", "args", "", "", "([Ljava/lang/String;)V", "Lambda_main"})public final class GenericKtKt { public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, "args"); List list1 = CollectionsKt.listOf(new Integer[]{1, 2, 3, 4});//List原生類型 List list2 = CollectionsKt.listOf(new String[]{"a", "b", "c", "d"});//List原生類型 System.out.println(list1); System.out.println(list2); }}我們看到編譯后 listOf 函數接收的是 Object 類型,不再是具體的 String 和 Int 類型了。
在說自動排序問題前,我們先來看下三個例子:var obj1 = {99: '九十九', 5: '五', 7: '七'}Object.keys(obj1) // ["5", "7", "99"]var obj2 = {c: 'z', a: 'x', b: 'y'}Object.keys(obj2) // ["c", "a", "b"]var obj3 = { name: 'imooc', 10: 'a', 3: 'b', age: 7 };Object.keys(obj3); // ["3", "10", "name", "age"]上面的例子可以看出當鍵值是數字時返回的值會自動排序,即使在混合情況下也會先進行排序后把數字項放在數組中前面,而鍵值對是字符串時則不會被排序。那當 Object.keys() 被調用時內部都發(fā)生了什么呢?通過查閱 ECMA262 規(guī)范知道,Object.keys 在內部會根據對象的屬性名 key 的類型進行不同的排序邏輯。分三種情況:如果屬性名的類型是 Number,那么 Object.keys 返回值是按照 key 從小到大排序;如果屬性名的類型是 String,那么 Object.keys 返回值是按照屬性被創(chuàng)建的時間升序排序;如果屬性名的類型是 Symbol,那么邏輯同 String 相同。那內部到底發(fā)生了什么呢?
#include <stdio.h>int main(){ int a = 10; int b[10]; int c[] = {1, 2, 3, 4, 5}; int d[10] = {1, 2, 3, 4, 5}; int e[20] = {1, 2, 3, 4, 5, [8] = 8, 9, 10, 11, [19] = 19}; int f[a]; for (int i = 0; i < 10; i++) { printf("b[%d] = %d\n", i, b[i]); } for (int i = 0; i < 5; i++) { printf("c[%d] = %d\n", i, c[i]); } for (int i = 0; i < 10; i++) { printf("d[%d] = %d\n", i, d[i]); } for (int i = 0; i < 20; i++) { printf("e[%d] = %d\n", i, e[i]); } for (int i = 0; i < 10; i++) { printf("f[%d] = %d\n", i, f[i]); } return 0;}運行結果b[0] = -692187488b[1] = 32767b[2] = -692187472b[3] = 32767b[4] = -1365075304b[5] = 32673b[6] = 0b[7] = 0b[8] = 0b[9] = 0c[0] = 1c[1] = 2c[2] = 3c[3] = 4c[4] = 5d[0] = 1d[1] = 2d[2] = 3d[3] = 4d[4] = 5d[5] = 0d[6] = 0d[7] = 0d[8] = 0d[9] = 0e[0] = 1e[1] = 2e[2] = 3e[3] = 4e[4] = 5e[5] = 0e[6] = 0e[7] = 0e[8] = 8e[9] = 9e[10] = 10e[11] = 11e[12] = 0e[13] = 0e[14] = 0e[15] = 0e[16] = 0e[17] = 0e[18] = 0e[19] = 19f[0] = 0f[1] = 0f[2] = 1700966438f[3] = 0f[4] = -1365075304f[5] = 32673f[6] = -692187320f[7] = 32767f[8] = -692187264f[9] = 32767在上面的例子中,展示了數組的聲明,初始化和使用。通過循環(huán)語句逐個訪問數組中的元素,并將這個元素的值打印在屏幕上。這里面還展示了如果不進行初始化會發(fā)生什么,也就是數組中存儲的數據是不確定的。因此只有初始化的數組還有使用的價值。這個和很多編程語言是不同的。當然,我們也可以在聲明完數組后直接使用,但是只能訪問自己賦值過的部分,因為沒有賦值過的部分值仍然是不確定的。
本節(jié)內容主要是對 Unsafe 類方法進行介紹,JDK jar 包中的 Unsafe 類提供了硬件級別的原子性操作,Unsafe 類中的方法都是 native 方法,它們使用 JNI 的方式訪問本地 C++實現庫。本節(jié)我們來了解一下 Unsafe 提供的幾個主要的方法進行介紹。為我們后續(xù)對 Unsafe 方法的使用奠定良好的基礎。
命令 pip3 install package-name 安裝名稱為 package-name 的第三方模塊。命令 pip install 從網站 pypi.org 下載指定名稱的第三方模塊然后自動安裝,非常方便。安裝名為 django 的第三方模塊,示例如下:C:\>pip3 install djangoCollecting django Downloading https://files.pythonhosted.org/packages/9d/04/04abb097c84c770180eeebe7ed920ce42f9917ab5ad4de01ff8ed11bc25b/Django-3.0.6-py3-none-any.whl (7.5MB) 34% |███████████▏ | 2.6MB 144kB/s eta 0:00:34 34% |███████████▏ | 2.6MB 108kB/s eta 0:00:45 35% |███████████▏ | 2.6MB 108kB/s eta 0:00:45 ...
pymysql 是 python 訪問 mysql 數據庫的模塊。首先檢查是否已經安裝了 pymsql 模塊,在 python 交互模式下 import pymysql,如下所示:>>> import pymysqlTraceback (most recent call last): File "<stdin>", line 1, in <module>ModuleNotFoundError: No module named 'pymysql'如果出現錯誤:ModuleNotFoundError,則表示還沒有安裝 pymysql,使用 pip3 install mysql 安裝 pymysql,如下所示:C:\Users\Administrator>pip3 install pymysqlCollecting pymysql...Installing collected packages: pymysqlSuccessfully installed pymysql-0.9.3
delete 操作符用于刪除對象的某個屬性;如果沒有指向這個屬性的引用,那它最終會被釋放。(MDN)delete 操作符可以刪除對象的一個屬性。JavaScript 中的關鍵字與其他語言略有不同,如 C++ 中的 delete 關鍵字會釋放內存,JavaScript中不會,只有當一個值的引用歸零時,才會被釋放。
// 服務端現有接口,進行 post 請求Ajax({ method: 'post', url: '/simple/post', data: { a:1, b:2 }}).then(data => { console.log(data)}).catch(e => { console.log('/simple/post', e)})// 服務端暫時沒有的接口, 進行 post 請求Ajax({ method: 'post', url: '/test/post', data: { a:1, b:2 }}).then(data => { console.log(data)}).catch(e => { console.log('/test/post', e)})// 服務端現有接口, 進行 get 請求Ajax({ url: '/simple/get', params: { c:1, d:2 }}).then(data => { console.log(data)}).catch(e => { console.log('/simple/get', e)})
前面兩小節(jié)討論的都是 CPU、Java 虛擬機的字節(jié)序,通常叫做主機(host)字節(jié)序。在網絡編程中,字節(jié)流在網絡中傳輸是遵循大端序的,也叫網絡字節(jié)序。由于 Java 虛擬機的字節(jié)序和網絡字節(jié)序是一致的,對于 Java 程序員來說,通常不太關心字節(jié)序的問題。然而,當 Java 程序和 C 程序進行通信的時候,需要關心字節(jié)序的問題。
上述介紹的 IPC 方式都是同一個主機內進程的交互方式,都是本地通信,套接字(Socket)一般用來處理不同主機進程之間的通信,也就是遠程通信,是網絡通信最常用的方式。Socket 通信需要 TCP 或者 UDP 協(xié)議的支持。使用 C 語言創(chuàng)建 Socket 的示例:#include <sys/types.h> #include <sys/socket.h> //引入頭文件int socket(int domain, int type, int protocol); //創(chuàng)建一個socket
我們這里自建了一個 pandasDataDemo.txt 數據文件,通過 Pandas 讀取該文件數據,進行上述各項參數的詳細講解。1. 讀取數據首先這里我們通過默認的文件讀取類型,讀取我們的 pandasDataDemo.txt 數據文件# 導入pandas包import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"data = pd.read_csv(data_path)print(data)# --- 輸出結果 --- 書名 作者 出版日期 價格0 python從入門到實戰(zhàn) 埃里克 2020 851 python數據分析 丹尼爾 2020 802 python爬蟲技術 李寧 2020 793 瘋狂python講義 李剛 2019 1134 大數據處理 石宣化 2018 435 人工智能 史蒂芬 2018 976 深度學習 伊恩 2017 1527 人工智能算法 杰弗瑞 2020 538 人工智能簡史 尼克 2017 24可以看到輸出結果數據內容和我們 TXT 中的數據一樣,在數據的格式上進行了行和列的解析,并自動生成了行索引 0-8,共 9 行數據。2. 參數 sepsep 參數的作用是指定數據的分隔符,默認是 “,”。我們首先將 pandasDataDemo.txt 中的數據列改成以 “=” 進行分割:書名=作者=出版日期=價格python從入門到實戰(zhàn)=埃里克=2020=85python數據分析=丹尼爾=2020=80python爬蟲技術=李寧=2020=79瘋狂python講義=李剛=2019=113大數據處理=石宣化=2018=43人工智能=史蒂芬=2018=97深度學習=伊恩=2017=152人工智能算法=杰弗瑞=2020=53人工智能簡史=尼克=2017=24接下來我們通過 sep 設置解析列的分隔符:# 導入pandas包import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"# 這里我們傳入參數 sepdata = pd.read_csv(data_path,sep="=")print(data)# --- 輸出結果 --- 書名 作者 出版日期 價格0 python從入門到實戰(zhàn) 埃里克 2020 851 python數據分析 丹尼爾 2020 802 python爬蟲技術 李寧 2020 793 瘋狂python講義 李剛 2019 1134 大數據處理 石宣化 2018 435 人工智能 史蒂芬 2018 976 深度學習 伊恩 2017 1527 人工智能算法 杰弗瑞 2020 538 人工智能簡史 尼克 2017 24通過指定 sep 參數將數據以 “=” 進行各列的分割。3. 參數 header指定數據的解析,從哪一行開始,指定的這一行將默認的作為列索引。# 導入pandas包import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"# 這里我們傳入參數 header,指定從第4行開始解析data = pd.read_csv(data_path,sep="=",header=3)print(data)# --- 輸出結果 --- python爬蟲技術 李寧 2020 79 #該行數據在源文件中是 第4行0 瘋狂python講義 李剛 2019 1131 大數據處理 石宣化 2018 432 人工智能 史蒂芬 2018 973 深度學習 伊恩 2017 1524 人工智能算法 杰弗瑞 2020 535 人工智能簡史 尼克 2017 24輸出解析:這里可以看到,我們參數 header 傳的是 3,輸出結果的第一行為“python 爬蟲技術 李寧 2020 79”,在源數據中是第4行數據,因為 Pandas 解析數據的行數是從0下標開始的,并且將第4行默認作為列索引的值。如果不使用數據中的某行作為列名,要聲明 header=None ,Pandas 會默認以數字編號為各列名稱。# 導入pandas包import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"# 這里我們傳入參數 header=Nonedata = pd.read_csv(data_path,sep="=",header=None)print(data)# --- 輸出結果 --- 0 1 2 30 書名 作者 出版日期 價格1 python從入門到實戰(zhàn) 埃里克 2020 852 python數據分析 丹尼爾 2020 803 python爬蟲技術 李寧 2020 794 瘋狂python講義 李剛 2019 1135 大數據處理 石宣化 2018 436 人工智能 史蒂芬 2018 977 深度學習 伊恩 2017 1528 人工智能算法 杰弗瑞 2020 539 人工智能簡史 尼克 2017 244. 參數 names通過該參數,我們可以為解析的數據,添加列索引值。# 導入pandas包import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"# 這里我們傳入參數 names,傳入列名稱data = pd.read_csv(data_path,sep="=",header=None,names=["AA","BB","CC","DD"])print(data)# --- 輸出結果 --- AA BB CC DD0 書名 作者 出版日期 價格1 python從入門到實戰(zhàn) 埃里克 2020 852 python數據分析 丹尼爾 2020 803 python爬蟲技術 李寧 2020 794 瘋狂python講義 李剛 2019 1135 大數據處理 石宣化 2018 436 人工智能 史蒂芬 2018 977 深度學習 伊恩 2017 1528 人工智能算法 杰弗瑞 2020 539 人工智能簡史 尼克 2017 24輸出解析:通指定 names 的值,我們看到輸出中列名稱已經變成我們指定的 AA,BB,CC,DD了。5. 參數 nrows指定解析數據的行數:# 導入pandas包import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"# 這里我們傳入參數 nrowsdata = pd.read_csv(data_path,sep="=",nrows=3)print(data)# --- 輸出結果 --- 書名 作者 出版日期 價格0 python從入門到實戰(zhàn) 埃里克 2020 851 python數據分析 丹尼爾 2020 802 python爬蟲技術 李寧 2020 79輸出解析:這里可以看到輸出結果,包含了數據文件中的四行,而不是 3 行數據,這是因為默認的數據的第一行解析為列索引后,然后再進行 3 行數據的解析。Tips:read_csv() 函數解析數據的邏輯為,根據里面參數設置,逐行的去解析文件中的數據,如果不指定 names,會先把第一行的數據解析為 列索引,然后再去根據條件,繼續(xù)向下解析。下面我們通過設置 names 的值(或者設置 names=None),并傳入解析的 nrows 數量,看一下輸出結果:import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"# 這里我們傳入參數 nrows 和 namesdata = pd.read_csv(data_path,sep="=",nrows=3,names=["AA","BB","CC","DD"])print(data)# --- 輸出結果 --- AA BB CC DD0 書名 作者 出版日期 價格1 python從入門到實戰(zhàn) 埃里克 2020 852 python數據分析 丹尼爾 2020 80輸出解析:可以看到這里的 3 行正是我們數據文件中的前三行數據。6. 參數 skiprows解析數據,從數據開始忽略多少行開始解析:# 導入pandas包import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"# 這里我們傳入參數 skiprowsdata = pd.read_csv(data_path,sep="=",skiprows=5)print(data)# --- 輸出結果 --- 大數據處理 石宣化 2018 430 人工智能 史蒂芬 2018 971 深度學習 伊恩 2017 1522 人工智能算法 杰弗瑞 2020 533 人工智能簡史 尼克 2017 24輸出解析:這里可以看到數據在忽略了 5 行之后,將第 6 行數據解析為列名稱,繼續(xù)向下進行數據的解析。7. 參數 skipfooter ,encoding ,engineskipfooter 參數:解析數據,忽略從后向前說多少條的數據行;encoding 參數:制定解析的編碼方式;engine 參數:指定解析的引擎類型;# 導入pandas包import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"# 這里我們傳入參數 skiprowsdata = pd.read_csv(data_path,sep="=",skipfooter=7)print(data)# --- 輸出結果 --- 涔﹀悕 浣滆?? 鍑虹増鏃ユ湡 浠鋒牸0 python浠庡叆闂ㄥ埌瀹炴垬 鍩冮噷鍏? 2020 851 python鏁版嵁鍒嗘瀽 涓瑰凹灝? 2020 80<ipython-input-7-44f2a64e80bb>:6: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support skipfooter; you can avoid this warning by specifying engine='python'. data = pd.read_csv(data_path,sep="=",skipfooter=7)輸出解析:這里可以看到輸出結果存在的問題,首先根據提示可以看出是 c 引擎不支持 skipfooter 的解析;其實是存在中文亂碼的問題,為了解決這兩個問題,我們通過 encoding 和 engine 分別制定編碼方式和引擎類型。# 導入pandas包import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"# 這里我們傳入參數 skiprows,engine,encodingdata = pd.read_csv(data_path,sep="=",skipfooter=7, engine='python',encoding='utf-8')print(data)# --- 輸出結果 --- 書名 作者 出版日期 價格0 python從入門到實戰(zhàn) 埃里克 2020 851 python數據分析 丹尼爾 2020 80輸出解析:這里我們通過指定編碼 encoding=‘utf-8’ 和解析引擎 engine=‘python’ ,可以看到修復了上面存在的問題,并且看到結果是忽略了數據的后7行,只解析了前 3 行數據。Tips:所謂引擎,最通俗的理解就是動力的來源,我們這里提到的 C 引擎和 Python 引擎,主要是指在 Pandas 解析數據時,解析函數最底層主要運行程序的編寫語言,在使用這兩個解析器引擎時,C引擎的速度更快,但是 Python 引擎的功能更多更齊全。8. 參數 na_filter該參數可配置解析文件時是否檢查(空字符串或者是空值),如果一個文件比較大的話,指定 na_filter 能有效的提高解析數據的速度:首先我們將源數據最后兩行的作者這一列刪掉內容,如下所示:書名=作者=出版日期=價格python從入門到實戰(zhàn)=埃里克=2020=85python數據分析=丹尼爾=2020=80python爬蟲技術=李寧=2020=79瘋狂python講義=李剛=2019=113大數據處理=石宣化=2018=43人工智能=史蒂芬=2018=97深度學習=伊恩=2017=152人工智能算法==2020=53人工智能簡史==2017=24針對缺失值,read_csv() 函數默認是將缺失值解析后,展示為 NaN ,這里我們看一下解析出來的數據結果:# 導入pandas包import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"data = pd.read_csv(data_path,sep="=", engine='python',encoding='utf-8')print(data)# ---輸出結果--- 書名 作者 出版日期 價格0 python從入門到實戰(zhàn) 埃里克 2020 851 python數據分析 丹尼爾 2020 802 python爬蟲技術 李寧 2020 793 瘋狂python講義 李剛 2019 1134 大數據處理 石宣化 2018 435 人工智能 史蒂芬 2018 976 深度學習 伊恩 2017 1527 人工智能算法 NaN 2020 538 人工智能簡史 NaN 2017 24 # 這里看到最后良好的作者都解析為 NaN下面我們在 read_csv() 函數中,加入 na_filter=False屬性:# 導入pandas包import pandas as pd# 指定導入的文件地址 默認是file,這里的路徑中省略了 file:/data_path="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/pandasDataDemo.txt"# 這里我們傳入參數 na_filterdata = pd.read_csv(data_path,sep="=",na_filter=False, engine='python',encoding='utf-8')print(data)# ---輸出結果--- 書名 作者 出版日期 價格0 python從入門到實戰(zhàn) 埃里克 2020 851 python數據分析 丹尼爾 2020 802 python爬蟲技術 李寧 2020 793 瘋狂python講義 李剛 2019 1134 大數據處理 石宣化 2018 435 人工智能 史蒂芬 2018 976 深度學習 伊恩 2017 1527 人工智能算法 2020 538 人工智能簡史 2017 24輸出解析:這里可以看到,通過 na_filter=False 參數指定后,read_csv() 函數將不對缺失值進行解析。
#include <stdio.h>int main(int a, char *b[]){ printf("Arguments Count: %d\n", a); for (int i = 0; i < a; ++i) printf("Argment %d: %s\n", i, b[i]); return 0;}程序中的變量名沒有按照約定,因為這里是想給大家展示一下變量名是隨意的,不會影響運行結果。因為很多書籍中沒有這方面的說明,很容易給初學者造成困惑。這里只是 C 語言中。在有的時候會出現約定大于配置的情況。這個不在 C 語言課程的討論范圍內。運行結果:utopia@DESKTOP:~$ ./testArguments Count: 1Argment 0: ./testutopia@DESKTOP:~$ /home/utopia/testArguments Count: 1Argment 0: /home/utopia/testutopia@DESKTOP:~$ ./test a da sdsArguments Count: 4Argment 0: ./testArgment 1: aArgment 2: daArgment 3: sds這段程序首先直接打印出變量 a 的數值,也就是傳入 main 函數的變量的數量。然后采用循環(huán)方式,一次輸出數組中存儲的值。從上面的運行結果可以看出。作為第一個變量傳入的是程序的名稱。其余變量在其后面依次傳入。
Go 語言是強類型語言,各個雖然同是無符號整型,但是不同無符號整型的變量不允許直接賦值,需要進行強制類型轉換,同時長度大的無符號整型向長度小的無符號整型轉換時,要考慮溢出問題。而且不同類的整型無法進行運算,想要進行運算必須要進行強制類型轉換,使他們都變成同一類型之后,再運算。舉一個 uint8 和 uint16 類型的變量賦值與計算的例子:package mainimport ( "fmt" "math")func main() { var a uint8 = math.MaxUint8 var b uint16 = math.MaxUint8 + 1 fmt.Println(a, b) a = uint8(b) fmt.Println(a, b) //因為b長度過長,在轉換為uint8的過程中溢出了 //無符號整型變量可以和常數進行計算 a = a + 1 b = b + 1 fmt.Println(a, b) //不同類型的無符號整型變量計算必須強轉為相同類型,一般轉換為長度大的來計算 c := uint16(a) + b fmt.Println(c)}輸出結果:各類型相互轉換輸出結果
數組是一組數據構成的列表。數組由中括號包裹,每一項通過逗號進行分隔:var arr = [1, '2', 3, 4, 5];console.log(arr[0]); // 輸出:1console.log(arr[1]); // 輸出:"2"和對象一樣的是,數組的每一項也可以是任意類型的數據。如果需要訪問數組中的每一項可以通過數組[下標]的格式進行訪問。下標就是數組每一項的編號,這個編號從0開始,第一項為0,第二項為1,以此類推。數組可以理解成一種特殊的對象,他原生具有一些方法,如遍歷數組:var arr = ['a', 'b', 'c'];arr.forEach(function(item, index) { console.log(item, index); // "a" 0, "b" 1, "c" 2});通過數組.forEach的方式就可以遍歷數組,forEach方法接受一個函數,這個函數在遍歷到每一項的時候會被調用,并將每一項的值和下標作為參數傳遞過來。既然具有一些方法,同樣的也具有一些屬性,最常用的就是length屬性:var arr = [1, 2, 3];console.log(arr.length); // 輸出:3數組的 length 屬性會返回數組的長度。
動態(tài)內存分配可以說是 C 語言程序員的噩夢。我們可能會遇到如果分配了內存,但是在最后沒有回收內存。這種情況就如同內存空洞存在,會不斷的使系統(tǒng)的可用內存減少,因此稱之為內存泄露。這是非常常見的內存分配的錯誤。很多著名的軟件也都會存在這種問題。最簡單的解決辦法就是通過定期重啟程序來解決。還有一種常見錯誤就是使用沒有成功分配的內存地址。這也會引起莫名的錯誤。同時使用分配內存的函數會消耗一定的資源,因為這會讓 C 語言調用與系統(tǒng)之間的 API ,會拖慢程序的運行。大量的調用會產生性能問題。所以在進行涉及計算機或者其他設備硬件資源操作的時候,一定要謹慎。因為這些資源是有限的,一旦被占用了,可利用的資源數量就會減少。直至資源的耗盡。
Json 內部只有對象和數組兩種類型,如下是一個 Json 對象的數據樣例:{ "Engineer": { "skill": "Android", "language": "Java", "years": 5 } } 上面簡短的 Json 數據對應一個“工程師”對象,里面包含技術、開發(fā)語言和工齡。再來看一個工程師對象數組:{"Engineers": [ { "skill": "Android", "language": "Java", "years": "5" }, { "skill": "iOS", "language": "Object C", "years": "2" }, { "skill": "Server", "language": "php", "years": "8" }]}以上 Json 數據就是一個包含 3 個“工程師”的對象數組。
經常替換操作都是簡單的某個字符串替換。Vim 中提供了很多便捷的小技巧來滿足需求快捷鍵含義備注r替換光標下單個字符cw修改單個單詞c$修改光標之后行內內容R進入替換模式來看下下面這個案例:進入替換模式,替換單個字符并修改單個單詞
命令 pip3 search package-name 在 pypi.org 上根據 package-name 搜索第三方包。輸出所有包含有關鍵字 requests 的第三方模塊,并給出模塊的功能簡介,示例如下:C:\> pip3 search requestsrequests-auth (5.1.0) - Authentication for Requestspydantic-requests (0.1.3) - A pydantic integration with requests.Requests-OpenTracing (0.2.0) - OpenTracing support for Requestsyamlsettings-requests (1.0.0) - YamlSettings Request Extensionrequests-aws4auth (0.9) - AWS4 authentication for Requestspycopy-requests (0.0.0) - Dummy requests module for Pycopyjupyter-requests (0.0.3) - Send requests to a Jupyter server.requests-middleware (0.1.2) - Composable HTTP middleware for requests...
6.2.1 pop 方法pop 方法會刪除數組最后一項,并將刪除項作為返回值。var arr = ['c++', 'java', 'javascript'];var lastOne = arr.pop();console.log(lastOne); // 輸出:"javascript"如果數組是空的,調用 pop 會返回 undefined 。6.2.2 shift 方法shift 方法會刪除數組的第一項,并將刪除項作為返回值。var arr = ['996', '007'];const first = arr.shift();console.log(first); // 輸出:"996"與 pop 一樣,如果是數組為空的情況下,會返回 undefined 。
作為 C 語言運算符中比較特殊的一員,三目運算符起到的作用更像是條件句。但是卻更加的精簡。當條件成立與不成立的時候分別執(zhí)行冒號分隔前和冒號分隔后面的語句,而判斷的條件,則是由問號與后面的語句進行分隔。這個運算符經常會嵌入語句中執(zhí)行。