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

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
4. Java ServerSocket 類分析

Java 語言抽象了 java.net.ServerSocket 類表示服務(wù)器監(jiān)聽 Socket,此類只用在服務(wù)器端,通過調(diào)用它的 accept 方法來獲取新的連接。accept 方法的返回值是 java.net.Socket 類型,后續(xù)服務(wù)器和客戶端的數(shù)據(jù)收發(fā),都是通過 accept 方法返回的 Socket 對象完成。java.net.ServerSocket 類也提供了一組重載的構(gòu)造方法,方便程序員選擇。 public ServerSocket(int port) throws BindException, IOException public ServerSocket(int port, int queueLength) throws BindException, IOException public ServerSocket(int port, int queueLength, InetAddress bindAddress) throws IOException public ServerSocket() throws IOExceptionport 參數(shù)用于傳入服務(wù)器監(jiān)聽的端口號。如果傳入的 port 是 0,系統(tǒng)會(huì)隨機(jī)選擇一個(gè)端口監(jiān)聽。queueLength 參數(shù)用于設(shè)置連接接收隊(duì)列的長度。不傳入此參數(shù),采用系統(tǒng)默認(rèn)長度。bindAddress 參數(shù)用于將監(jiān)聽 Socket 綁定到一個(gè)本地接口。如果傳入此參數(shù),服務(wù)器會(huì)監(jiān)聽指定的接口地址;如果不指定此參數(shù),默認(rèn)會(huì)監(jiān)聽通配符 IP 地址,比如 IPv4 是 0.0.0.0。提示:可以通過 netstat 命令查看服務(wù)器程序監(jiān)聽的 IP 地址和端口號。如果你是通過無參構(gòu)造方法構(gòu)造 java.net.ServerSocket 類的對象,需要手動(dòng)調(diào)用它的 bind 方法,綁定監(jiān)聽端口和接口地址。創(chuàng)建一個(gè)簡單的服務(wù)器監(jiān)聽 Socket,示例代碼如下:import java.io.*;import java.net.ServerSocket;import java.net.Socket;public class TCPServer { private static final int PORT =56002; public static void main(String[] args) { ServerSocket ss = null; try { // 創(chuàng)建一個(gè)服務(wù)器 Socket ss = new ServerSocket(PORT); // 監(jiān)聽新的連接請求 Socket conn = ss.accept(); System.out.println("Accept a new connection:" + conn.getRemoteSocketAddress().toString()); // 讀取客戶端數(shù)據(jù) BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); StringBuilder inMessage = new StringBuilder(); while(true){ int c = in.read(); if (c == -1 || c == '\n') break; inMessage.append((char)c); } System.out.println("Recv from client:" + inMessage.toString()); // 向客戶端發(fā)送數(shù)據(jù) String rsp = "Hello Client!\n"; BufferedOutputStream out = new BufferedOutputStream(conn.getOutputStream()); out.write(rsp.getBytes()); out.flush(); System.out.println("Send to client:" + rsp); conn.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (ss != null){ try { ss.close(); } catch (IOException e) { e.printStackTrace(); } } } System.out.println("Server exit!"); }}我們創(chuàng)建的阻塞式服務(wù)端,所以 java.net.ServerSocket 的 accept 方法會(huì)阻塞線程,直到新連接返回。同樣,在接收客戶端的消息的時(shí)候注意消息邊界的處理,最后向客戶端發(fā)送響應(yīng)的時(shí)候,需要調(diào)用 flush 方法。

3.2 fillna () 函數(shù)

該函數(shù)用于填充缺失值的操作,返回一個(gè)新的數(shù)據(jù)集,該函數(shù)提供了豐富的參數(shù)可供設(shè)置,下面列舉了常用的幾個(gè)參數(shù):參數(shù)名說明 value 指定用什么值去填充 method 填充的方式,ffill 用前一個(gè)非缺失值填充這個(gè)缺失值,bfill 用下一個(gè)非缺失值填充這個(gè)缺失值,None 默認(rèn)的,指定一個(gè)缺失值去填充 axis 修改填充的方向 ,默認(rèn)是 axis=0 在列的方向填充 limit 指定填充的個(gè)數(shù),在某個(gè)方向如果存在多個(gè)連續(xù)的缺失值,指定填充的幾個(gè)下面通代碼程序來看一個(gè)每個(gè)參數(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é)果 --- 編程語言 推出時(shí)間 價(jià)格 主要?jiǎng)?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# 1. 直接設(shè)置 value 指定填充的內(nèi)容new_data= data.fillna("###")print(new_data)# --- 輸出結(jié)果 --- 編程語言 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人0 java ### 45.6 James Gosling1 python 1991年 67 ###2 ### 1972年 ### Dennis MacAlistair Ritchie3 js ### ### Brendan Eich4 php 2012年 ### Rasmus Lerdorf5 C++ 1983年 75 Bjarne Stroustrup# 結(jié)果解析:通過設(shè)置填充的值為 ### ,可以看到原數(shù)據(jù)集中的缺失值都被填充了該字符# 2. 設(shè)置 method 填充的方向new_data= data.fillna(method="bfill")print(new_data)# --- 輸出結(jié)果 --- 編程語言 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人0 java 1991年 45.6 James Gosling1 python 1991年 67.0 Dennis MacAlistair Ritchie2 js 1972年 75.0 Dennis MacAlistair Ritchie3 js 2012年 75.0 Brendan Eich4 php 2012年 75.0 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup# 結(jié)果解析:這里設(shè)置了填充的方式為 bfill ,默認(rèn)的 axis=0 是在列上,表示用這一列的下一行的非缺失值填充這個(gè)缺失值,通過輸出結(jié)果可看到,缺失值均被填上了內(nèi)容,這里要注意一點(diǎn),如果下一個(gè)數(shù)據(jù)為 NaN,則會(huì)繼續(xù)往下找,直到找到一個(gè)非缺失值的數(shù)據(jù)來填充。# 3. 設(shè)置 axis=1 在橫向上進(jìn)行填充new_data= data.fillna(axis=1,method="bfill")print(new_data)# --- 輸出結(jié)果 --- 編程語言 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人 0 java 45.6 45.6 James Gosling 1 python 1991年 67 NaN2 1972年 1972年 Dennis MacAlistair Ritchie Dennis MacAlistair Ritchie 3 js Brendan Eich Brendan Eich Brendan Eich 4 php 2012年 Rasmus Lerdorf Rasmus Lerdorf5 C++ 1983年 75 Bjarne Stroustrup # 結(jié)果解析:這里程序中設(shè)置了 axis 為橫向,method 為 bfill ,通過輸出結(jié)果可以看到為 NaN 的數(shù)據(jù),用他后面的非缺失值進(jìn)行了填充,如果他后面沒有數(shù)據(jù),則不進(jìn)行填充,仍然為 NaN。# 4. limit 指定出現(xiàn)連續(xù)的缺失值,填充的數(shù)量new_data= data.fillna(axis=0,method="bfill",limit=2)print(new_data)# --- 輸出結(jié)果 --- 編程語言 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人0 java 1991年 45.6 James Gosling1 python 1991年 67.0 Dennis MacAlistair Ritchie2 js 1972年 NaN Dennis MacAlistair Ritchie3 js 2012年 75.0 Brendan Eich4 php 2012年 75.0 Rasmus Lerdorf5 C++ 1983年 75.0 Bjarne Stroustrup# 結(jié)果解析:通過設(shè)置 limit=2 指定出現(xiàn)連續(xù)的缺失值只填充2個(gè)數(shù)據(jù),這里可以看到在"價(jià)格"列中原數(shù)據(jù)出現(xiàn)的連續(xù)三個(gè) NaN 這里按列的方向,只填充了兩個(gè)數(shù)據(jù)。

6.1 常見錯(cuò)誤

在 Windows 操作系統(tǒng)中,使用 Python 輸出中文時(shí),可能會(huì)出現(xiàn)亂碼的的情況,例如,使用 Windows 自帶的記事本編寫程序 chinese.py,內(nèi)容如下:10運(yùn)行該程序,輸出結(jié)果如下:C:\>python chinese.py File "chinese.py", line 1SyntaxError: Non-UTF-8 code starting with '\xd6' in file chinese.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

3. flags 可選參數(shù)

flags 參數(shù)可以接受傳入一個(gè)數(shù)組或元組,它可以接受下列值:參數(shù)描述c_index可以跟蹤 C 順序的索引f_index可以跟蹤 Fortran 順序的索引multi-index每次迭代可以跟蹤多重索引類型external_loop給出的值是具有多個(gè)值的一維數(shù)組,而不是零維數(shù)組

2.6 filterNotNull 和 filterNotNullTo 操作符

filterNotNull 操作符可以過濾集合中為 null 的元素,那么同理 filterNotNullTo 才是真正過濾操作,但是需要從外部傳入一個(gè)可變集合。源碼定義public fun <T : Any> Iterable<T?>.filterNotNull(): List<T> { return filterNotNullTo(ArrayList<T>())}public fun <C : MutableCollection<in T>, T : Any> Iterable<T?>.filterNotNullTo(destination: C): C { for (element in this) if (element != null) destination.add(element) return destination}源碼解析filterNotNull 是集合的擴(kuò)展函數(shù),該集合中的元素是可 null 的 T 泛型,那么這個(gè)篩選條件也就是判斷是否為 null,篩選條件內(nèi)部確定好的。filterNotNull 還是繼續(xù)傳入一個(gè)可變集合,然后在filterNotNullTo 內(nèi)部判斷把 null 的元素直接過濾,其他元素就會(huì)被加入傳入的可變集合中。使用場景filterNotNull 操作符使用場景:一般用于過濾掉集合中為 null 的元素,最后返回一個(gè)不含 null 的元素集合。filterNotNullTo 操作符使用場景: 一般在外部傳入一個(gè)可變的集合,然后過濾多個(gè)集合中為 null 的元素,最后將這些元素放入可變集合中,并返回這個(gè)集合。fun main(args: Array<String>) { val animalList: List<Animal?> = listOf(Bird(name = "Bird1", age = 12), Cat(name = "Cat1", age = 18), Cat(name = "Cat3", age = 20), Dog(name = "Dog2", age = 8), null, Bird(name = "Bird2", age = 14), null, Dog(name = "Dog1", age = 18) ) animalList.filterNotNull().forEach { println("${it.name} is ${it.age} years old and it ${it.eatFood()}") }}

4. 數(shù)據(jù)傳輸

然后我們就用 gin 來寫一個(gè) post 服務(wù) check 用來接收驗(yàn)證登錄頁面發(fā)送過來的賬號密碼。代碼示例:package mainimport ( "fmt" "net/http" "github.com/gin-gonic/gin")func main() { router := gin.Default() router.LoadHTMLGlob("view/*") router.GET("/index", index) router.POST("/check", check) router.Run("127.0.0.1:9300")}func index(c *gin.Context) { c.HTML(http.StatusOK, "index.html", nil)}func check(c *gin.Context) { accountID, _ := c.GetPostForm("username") password, _ := c.GetPostForm("password") fmt.Println(accountID, password) if accountID == "Codey" && password == "12345" { //跳轉(zhuǎn)到主頁 c.HTML(http.StatusOK, "home.html", nil) } else { //跳轉(zhuǎn)到登錄 c.Writer.Write([]byte("<script>alert('賬號或者密碼不正確')</script>")) c.HTML(http.StatusOK, "index.html", nil) }}home.html 代碼如下:<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>Go語言實(shí)戰(zhàn)2</title></head><body> <div> <h3>主頁</h3> 這里是主頁 </div></body></html>執(zhí)行上述 Go 語言代碼,在瀏覽器中輸入127.0.0.1:9300/index。輸入正確的賬號:Codey,密碼:12345然后點(diǎn)擊登錄,會(huì)跳轉(zhuǎn)到主頁若輸入錯(cuò)誤的賬號密碼,則不跳轉(zhuǎn)隨后跳轉(zhuǎn)回登錄頁面在 gin 中一個(gè)簡易的登錄功能就搭建完成了。

1. 示例程序

我們先看一個(gè)最簡單的可以執(zhí)行的 C 語言的程序:378執(zhí)行這個(gè)程序,就會(huì)在我們的命令行中輸出如下內(nèi)容:Welcome to Utopia's lessons!Tips:上述程序在 gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 下通過測試可以執(zhí)行。關(guān)于 gcc 我們在下一個(gè)小節(jié)會(huì)進(jìn)行講解。

3. Ubuntu 下安裝 Docker

如果你自己使用 Ubuntu 發(fā)行版,可以參考如下步驟安裝 Docker:Tips:Ubuntu 的包管理工具是 apt,所以我們使用 apt 來安裝 Docker。1. 安裝 curl:apt install curl -y2. 安裝 Docker:sh -c "$(curl -fsSL https://get.docker.com)"3. 啟動(dòng) Docker 服務(wù):systemctl start docker4. 將 Docker 設(shè)定為開機(jī)啟用:systemctl enable docker

3.1 concat () 函數(shù)

對于多個(gè)數(shù)據(jù)集的合并操作,concat () 函數(shù)提供了豐富的設(shè)置參數(shù),滿足我們靈活的合并需要,這里我們列舉幾個(gè)常用的參數(shù)進(jìn)行詳細(xì)講解。pd.concat(objs, axis='0', join:'outer', ignore_index: 'False', keys='None', levels='None', names='None', verify_integrity: 'False', sort: 'False', copy:'True') 參數(shù)名說明 objs 要合并的數(shù)據(jù)列表,可以是 Series、 DataFrameaxis 合并的方向,axis=0 縱向合并 (默認(rèn)),axis=1 橫向合并 join 數(shù)據(jù)合并的方式,包含 inner 和 outer 兩種,默認(rèn)是 outerignore_index 忽略合并方向上軸的索引值,從 0 開始重新進(jìn)行索引值排序,默認(rèn)為 ignore_index=False下面我們通過代碼程序進(jìn)行詳細(xì)學(xué)習(xí)這些參數(shù)的使用。1. axis 參數(shù)該參數(shù)用于設(shè)置數(shù)據(jù)合并的方向。# data_03,data_04,data_05 是上面從三個(gè)excel表中解析出的數(shù)據(jù)集# concat 函數(shù),axis=0 是縱向上按行合并。data_res=pd.concat([data_03,data_04,data_05],axis=0)print(data_res)# --- 輸出結(jié)果 --- 編程語言 推出時(shí)間 價(jià)格 月平均銷售數(shù)量 主要銷售區(qū)域 月份 發(fā)行地點(diǎn)0 java 1995年 45.6 NaN NaN NaN NaN1 python 1991年 67.0 NaN NaN NaN NaN2 C 1972年 33.9 NaN NaN NaN NaN3 js 1995年 59.5 NaN NaN NaN NaN4 php 2012年 69.9 NaN NaN NaN NaN5 C++ 1983年 75.0 NaN NaN NaN NaN0 NaN 1995年 NaN 134.0 成都 NaN NaN1 NaN 2006年 NaN 231.0 北京 NaN NaN2 NaN 1972年 NaN 67.0 天津 NaN NaN0 NaN 1995年 NaN NaN NaN 12.0 廣州1 NaN 2006年 NaN NaN NaN 2.0 上海2 NaN 1972年 NaN NaN NaN 4.0 南京3 NaN 2017年 NaN NaN NaN 5.0 北京# 輸出解析:通過設(shè)置 axis=0 在縱向上合并數(shù)據(jù),總的行數(shù)據(jù)量是3個(gè)數(shù)據(jù)集的總和,擴(kuò)充了行數(shù)據(jù)。# concat 函數(shù),axis=1 設(shè)置在橫向上合并。data_res=pd.concat([data_03,data_04,data_05],axis=1)print(data_res)# --- 輸出結(jié)果 --- 編程語言 推出時(shí)間 價(jià)格 推出時(shí)間 月平均銷售數(shù)量 主要銷售區(qū)域 推出時(shí)間 月份 發(fā)行地點(diǎn)0 java 1995年 45.6 1995年 134.0 成都 1995年 12.0 廣州1 python 1991年 67.0 2006年 231.0 北京 2006年 2.0 上海2 C 1972年 33.9 1972年 67.0 天津 1972年 4.0 南京3 js 1995年 59.5 NaN NaN NaN 2017年 5.0 北京4 php 2012年 69.9 NaN NaN NaN NaN NaN NaN5 C++ 1983年 75.0 NaN NaN NaN NaN NaN NaN# 輸出解析:通過設(shè)置 axis=1 在橫向上合并數(shù)據(jù),總的列數(shù)據(jù)量是3個(gè)數(shù)據(jù)集的總和,擴(kuò)充了列數(shù)據(jù)。2. join 參數(shù)該參數(shù)設(shè)置數(shù)據(jù)集合并的方式,有兩個(gè)值:inner:數(shù)據(jù)集之間的交集,行合并時(shí)取列索引值的相同的數(shù)據(jù),列合并時(shí)取行索引值相同的數(shù)據(jù);outer:取數(shù)據(jù)集之間的并集,沒有數(shù)據(jù)的用 NaN 進(jìn)行填充,默認(rèn)是這種合并方式。# data_03,data_04,data_05 是上面從三個(gè)excel表中解析出的數(shù)據(jù)集# concat 函數(shù),axis=1,join="outer" 設(shè)置合并的方式。data_res=pd.concat([data_03,data_04,data_05],axis=1,join="outer")print(data_res)# --- 輸出結(jié)果 --- 編程語言 推出時(shí)間 價(jià)格 推出時(shí)間 月平均銷售數(shù)量 主要銷售區(qū)域 推出時(shí)間 月份 發(fā)行地點(diǎn)0 java 1995年 45.6 1995年 134.0 成都 1995年 12.0 廣州1 python 1991年 67.0 2006年 231.0 北京 2006年 2.0 上海2 C 1972年 33.9 1972年 67.0 天津 1972年 4.0 南京3 js 1995年 59.5 NaN NaN NaN 2017年 5.0 北京4 php 2012年 69.9 NaN NaN NaN NaN NaN NaN5 C++ 1983年 75.0 NaN NaN NaN NaN NaN NaN# 輸出解析:這里設(shè)置在橫向上合并列數(shù)據(jù),合并方式為 outer ,所以將所有數(shù)據(jù)集的行索引取了并集,data_03 的行索引值為0-5,data_04 的行索引值為0-2,data_5 的行索引值為0-3,他們的并集就是 data_03 的從0到5,對于 data_04 和 data_05 在對應(yīng)的行索引上不存在數(shù)據(jù)的,則以 NaN 進(jìn)行填充。# concat 函數(shù),axis=0,join="outer" 設(shè)置合并的方式。data_res=pd.concat([data_03,data_04,data_05],axis=0,join="outer")print(data_res)# --- 輸出結(jié)果 --- 編程語言 推出時(shí)間 價(jià)格 月平均銷售數(shù)量 主要銷售區(qū)域 月份 發(fā)行地點(diǎn)0 java 1995年 45.6 NaN NaN NaN NaN1 python 1991年 67.0 NaN NaN NaN NaN2 C 1972年 33.9 NaN NaN NaN NaN3 js 1995年 59.5 NaN NaN NaN NaN4 php 2012年 69.9 NaN NaN NaN NaN5 C++ 1983年 75.0 NaN NaN NaN NaN0 NaN 1995年 NaN 134.0 成都 NaN NaN1 NaN 2006年 NaN 231.0 北京 NaN NaN2 NaN 1972年 NaN 67.0 天津 NaN NaN0 NaN 1995年 NaN NaN NaN 12.0 廣州1 NaN 2006年 NaN NaN NaN 2.0 上海2 NaN 1972年 NaN NaN NaN 4.0 南京3 NaN 2017年 NaN NaN NaN 5.0 北京# 輸出解析: 這里設(shè)置了在縱向上的行合并,合并方式為 outer,在列索引上取了并集,為{“編程語言”,“推出時(shí)間”,“價(jià)格”,“月平均銷售數(shù)量”,“主要銷售區(qū)域”,“月份”,“發(fā)行地點(diǎn)”},合并行中如果不存在對應(yīng)列的數(shù)據(jù),則以 NaN 進(jìn)行填充。# concat 函數(shù),axis=1,join="inner" 設(shè)置合并的方式。data_res=pd.concat([data_03,data_04,data_05],axis=1,join="inner")print(data_res)# --- 輸出結(jié)果 --- 編程語言 推出時(shí)間 價(jià)格 推出時(shí)間 月平均銷售數(shù)量 主要銷售區(qū)域 推出時(shí)間 月份 發(fā)行地點(diǎn)0 java 1995年 45.6 1995年 134 成都 1995年 12 廣州1 python 1991年 67.0 2006年 231 北京 2006年 2 上海2 C 1972年 33.9 1972年 67 天津 1972年 4 南京# 輸出解析:這里設(shè)置了在橫向上合并列數(shù)據(jù),合并方式為 inner ,在行索引值中去交集,data_03 的行索引值為0-5,data_04 的行索引值為0-2,data_5 的行索引值為0-3,他們的交集也就是0到2,可以看到輸出結(jié)果合并了列,取了三行數(shù)據(jù)。# concat 函數(shù),axis=0,join="inner" 設(shè)置合并的方式。data_res=pd.concat([data_03,data_04,data_05],axis=0,join="inner")print(data_res)# --- 輸出結(jié)果 --- 推出時(shí)間0 1995年1 1991年2 1972年3 1995年4 2012年5 1983年0 1995年1 2006年2 1972年0 1995年1 2006年2 1972年3 2017年# 輸出解析:通過設(shè)置在行上進(jìn)行數(shù)據(jù)合并,用的 inner 方式合并,在列的數(shù)據(jù)上,他們的交集只有“推出時(shí)間”,通過輸出可以看到效果。通過上面的代碼演示可以看到,因?yàn)?outer 取得是并集,合并結(jié)果中可能會(huì)出現(xiàn) NaN 的填充數(shù)據(jù),而 inner 取的是交集,合并數(shù)據(jù)結(jié)果集中不會(huì)出現(xiàn) NaN 的缺失數(shù)據(jù)。3. ignore_index 參數(shù)該參數(shù)可以設(shè)置在合并方向上的索引值自動(dòng)生成,從 0 開始的整數(shù)序列。# data_03,data_04,data_05 是上面從三個(gè)excel表中解析出的數(shù)據(jù)集# concat 函數(shù),ignore_index 重新生成索引序列。data_res=pd.concat([data_03,data_04,data_05],axis=1,ignore_index=False)print(data_res)# --- 輸出結(jié)果 ignore_index=False(默認(rèn)的值)--- 編程語言 推出時(shí)間 價(jià)格 推出時(shí)間 月平均銷售數(shù)量 主要銷售區(qū)域 推出時(shí)間 月份 發(fā)行地點(diǎn)0 java 1995年 45.6 1995年 134.0 成都 1995年 12.0 廣州1 python 1991年 67.0 2006年 231.0 北京 2006年 2.0 上海2 C 1972年 33.9 1972年 67.0 天津 1972年 4.0 南京3 js 1995年 59.5 NaN NaN NaN 2017年 5.0 北京4 php 2012年 69.9 NaN NaN NaN NaN NaN NaN5 C++ 1983年 75.0 NaN NaN NaN NaN NaN NaNdata_res=pd.concat([data_03,data_04,data_05],axis=1,ignore_index=True)print(data_res)# --- 輸出結(jié)果 ignore_index=True --- 0 1 2 3 4 5 6 7 80 java 1995年 45.6 1995年 134.0 成都 1995年 12.0 廣州1 python 1991年 67.0 2006年 231.0 北京 2006年 2.0 上海2 C 1972年 33.9 1972年 67.0 天津 1972年 4.0 南京3 js 1995年 59.5 NaN NaN NaN 2017年 5.0 北京4 php 2012年 69.9 NaN NaN NaN NaN NaN NaN5 C++ 1983年 75.0 NaN NaN NaN NaN NaN NaN 輸出解析:這里通過 ignore_index 參數(shù)設(shè)置的對比,可以看到在列索引上的索引值的變化。

1.3 for 循環(huán)嵌套

列表推導(dǎo)中允許 for 循環(huán)嵌套,它的語法定義如下:[expression for x in X for y in Y]可以認(rèn)為它使用如下代碼創(chuàng)建了一個(gè) list:list = []for x in X: for y in Y: list.append(expression)使用列表推導(dǎo)生成一個(gè)包含兩個(gè)字符的字符串列表,代碼如下:>>> [x + y for x in 'ABC' for y in 'XYZ']['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']等價(jià)于使用 append 方法創(chuàng)建列表,代碼如下:>>> list = []>>> for x in 'ABC':... for y in 'XYZ':... list.append(x + y)...>>> list['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']在第 1 行,創(chuàng)建了一個(gè)空列表在第 2 行,在外循環(huán)中,遍歷字符串 ‘ABC’ 中的 3 個(gè)字符 ‘A’、‘B’ 和 ‘C’,循環(huán)變量 x 依次為’A’、‘B’ 和 ‘C’在第 3 行,在內(nèi)循環(huán)中,遍歷字符串 ‘XYZ’ 中的 3 個(gè)字符 ‘X’、‘Y’ 和 ‘Z’,循環(huán)變量 y 依次為’X’、‘Y’ 和 ‘Z’在第 4 行,將表達(dá)式 x + y 作為元素添加到列表中

3.3 @return

在前面的代碼中,可以看到很多次我們在函數(shù)指令中使用了 @return。@return 指令表示作為函數(shù)調(diào)用結(jié)果的值,說的簡單點(diǎn)就是這個(gè)函數(shù)的返回值,這和在 javascript 的函數(shù)中使用 return 很類似。在 Sass 中 @return 指令只能在 @function 中使用,并且每個(gè) @function 都必須以 @return 結(jié)尾! 在 @function 的邏輯代碼中,如遇到 @return 會(huì)立即結(jié)束函數(shù)并返回其結(jié)果,這在一些 @if 判斷的情況下很有用。我們舉例看下:@function a($str: "a") { @if $str == "a" { @return 10px; } @else if $str == "b" { @return 20px; } @else if $str == "c" { @return 30px; } @else { @return 40px; }}p { padding: a(); width: a("f"); height: a("c"); margin: a("b");}從上面的代碼中我們可以可看到,在函數(shù) a 中,我們根據(jù)不同的參數(shù)返回不同的結(jié)果,然后在 p 的樣式中通過傳入不同的參數(shù)來獲取不同的結(jié)果。上面這段代碼會(huì)轉(zhuǎn)換為如下的 CSS 代碼:p { padding: 10px; width: 40px; height: 30px; margin: 20px;}

3.1 通過 instanceof 判斷

instanceof 運(yùn)算符用于檢測構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對象的原型鏈。instanceof 可以用來判斷數(shù)組是否存在,判斷方式如下:var arr = ['a', 'b', 'c'];console.log(arr instanceof Array); // true console.log(arr.constructor === Array;); // true在解釋上面的代碼時(shí),先看下數(shù)組的原型鏈指向示意圖:數(shù)組實(shí)例的原型鏈指向的是 Array.prototype 屬性,instanceof 運(yùn)算符就是用來檢測 Array.prototype 屬性是否存在于數(shù)組的原型鏈上,上面代碼中的 arr 變量就是一個(gè)數(shù)組,所有擁有 Array.prototype 屬性,返回值 true,這樣就很好的判斷數(shù)組類型了。但是,需要注意的是,prototype 屬性是可以修改的,所以并不是最初判斷為 true 就一定永遠(yuǎn)為真。在我們的網(wǎng)站中,腳本可以擁有多個(gè)全局環(huán)境,例如 html 中擁有多個(gè) iframe 對象,instanceof 的驗(yàn)證結(jié)果可能不會(huì)符合預(yù)期,例如:var iframe = document.createElement('iframe');document.body.appendChild(iframe);var iframeArray = window.frames[0].Array;var arr = new iframeArray('a', 'b', 'c');console.log(arr instanceof Array); // falseconsole.log(arr) // ["a", "b", "c"]比如打開一個(gè)網(wǎng)站的控制臺,輸入上面的代碼,先在 body 上創(chuàng)建并添加一個(gè) iframe 對象,并把它插入到當(dāng)前的網(wǎng)頁中。這時(shí)我們可以獲取 iframe 中數(shù)組構(gòu)造函數(shù)。通過這個(gè)構(gòu)造函數(shù)去實(shí)例化一個(gè)數(shù)組,這時(shí)再用 instanceof 去判斷就會(huì)返回 false,但是案例中的 arr 確實(shí)是一個(gè)數(shù)組,這就是 instanceof 判斷數(shù)組所帶來的問題。

3. 小結(jié)

對于 C 語言中的嵌套分支,是解決多個(gè)條件同時(shí)要成立的問題。比如既要高效,又要省錢,又要質(zhì)量好。那么這三個(gè)條件的同時(shí)成立和部分成立的判斷就可以使用嵌套分支。說句實(shí)話,這三點(diǎn)在現(xiàn)實(shí)生活中是沒有辦法同時(shí)成立的,尤其是在軟件開發(fā)過程中。大家要有所權(quán)衡。

7.2 獲取集合的成員

>>> db.scard('set')3>>> db.smembers('set'){'b', 'c', 'a'}在第 1 行,使用方法 scard(‘set’) 獲取集合的元素的數(shù)量在第 3 行,使用方法 smembers(‘set’) 獲取集合的所有元素>>> db.sismember('set', 'b')True>>> db.sismember('set', 'd')False在第 1 行,使用方法 sismember(‘set’, ‘b’) 檢查集合 ‘set’ 是否包含 ‘b’在第 3 行,使用方法 sismember(‘set’, ‘d’) 檢查集合 ‘set’ 是否包含 ‘d’

3. more 命令查看文件內(nèi)容

more 命令也用來查看文件內(nèi)容,下面列舉一些 more 命令的參數(shù):more 命令參數(shù)名稱功能與作用描述+n從第 n 行開始顯示-n定義屏幕大小為 n 行+/pattern在每個(gè)檔案顯示前搜尋該字串 pattern,然后從該字串前兩行之后開始顯示-c從頂部清屏,然后顯示-d提示 Press space to continue,'q' to quit(按空格鍵繼續(xù),按q鍵退出),而禁用響鈴功能-l忽略 Ctrl+l(換頁) 字符-p通過清除窗口而不是滾屏來對文件進(jìn)行換頁,與 -c 選項(xiàng)相似-s把連續(xù)的多個(gè)空行顯示為一行-u把文件內(nèi)容中的下畫線去掉這里以查看 /etc/mtools.conf 文件內(nèi)容為例,命令如下:cd /etcmore mtools.conf執(zhí)行結(jié)果如下圖:Tips : 如圖中所示,可以按空格鍵繼續(xù)瀏覽剩下內(nèi)容,也可以按 q 鍵結(jié)束瀏覽。

2. 常量

講完了字面值之后,我們就可以在這里可以認(rèn)識一下 C 語言中的用英文原文直譯過來的常量是什么了。有些時(shí)候,我們需要反復(fù)使用一些內(nèi)容,比如計(jì)算圓周率的派值。如果程序中很多地方使用,而這個(gè)值始終又是不變的,甚至應(yīng)該是不能隨意改變的。那么這是時(shí)候。我們就會(huì)用到 C 語言中的常量。這里有 2 種方式來定義常量。一種是使用預(yù)處理命令 #define。#define pi 3.1415926這種方式一般出現(xiàn)在程序函數(shù)體的外部。還有一種方式是在函數(shù)體內(nèi)部使用關(guān)鍵字 const。const float pi = 3.1415926;常量定義好之后在程序編譯和執(zhí)行的過程中是永遠(yuǎn)不會(huì)改變的,直接拿來使用即可。

2. uniq

簡介:對于一些重復(fù)輸出的行進(jìn)行去重。語法:uniq [OPTION]... [INPUT [OUTPUT]]選項(xiàng)說明:-c: 打印出現(xiàn)的次數(shù),只能統(tǒng)計(jì)相鄰的;-d: 只打印重復(fù)行;-u: 只打印不重復(fù)行;-D: 只打印重復(fù)行,并且把所有重復(fù)行打印出來。實(shí)例:對/etc/passwd中以:,對最后一列求出現(xiàn)的次數(shù)[root@master ~]# awk -F":" '{print $NF}' /etc/passwd/bin/bash/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/bin/sync/sbin/shutdown/sbin/halt/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/bin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin/sbin/nologin[root@master ~]# awk -F":" '{print $NF}' /etc/passwd |sort |uniq -c |sort -nr 22 /sbin/nologin 1 /sbin/shutdown 1 /sbin/halt 1 /bin/sync 1 /bin/nologin 1 /bin/bash先利用awk打印出最后一列內(nèi)容,之后利用sort 來進(jìn)行排序,將相同的字符規(guī)在一起輸出,最后對相同的行進(jìn)行去重,得出每種不同類型shell出現(xiàn)的次數(shù),最后對數(shù)學(xué)從大到小排序。

5. 使用 Gradle Wrapper 下載 Gradle

使用 Gradle wrapper 下載 Gradle 我們可以點(diǎn)擊 AS 界面上的同步按鈕,也可以使用 gradlew 命令來執(zhí)行 gradle 命令來下載,下面以 Windows 系統(tǒng)為例,我本地distributionUrl配置的 Gradle 版本是gradle-6.0.1-bin.zip,我們現(xiàn)在改為gradle-5.0-all.zip版本,執(zhí)行clean命令,看看有沒有下載 5.0 版本下載:C:\Users\LeiQi PC\Documents\MyApplication>gradlew cleanDownloading https://services.gradle.org/distributions/gradle-5.0-all.zip............10%............20%.............30%............40%............50%.............60%............70%.............80%............90%............100%Welcome to Gradle 5.0!BUILD SUCCESSFUL in 1s2 actionable tasks: 2 up-to-date我們看到這里已經(jīng)下載了 gradle 5.0 版本,那么按照前面所說,再次執(zhí)行命令,直接調(diào)用本地的 Gradle,不會(huì)去下載我們來看下:C:\Users\LeiQi PC\Documents\MyApplication>gradlew cleanDeprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.Use '--warning-mode all' to show the individual deprecation warnings.See https://docs.gradle.org/5.0/userguide/command_line_interface.html#sec:command_line_warningsBUILD SUCCESSFUL in 1s2 actionable tasks: 2 up-to-date我們看到這里沒有再去下載 Gradle 版本了而是直接使用上次下載的緩存下來的。

1. 前言

在 C 語言中,內(nèi)置的基本類型有 char、short、int、long、double 等,對于整型類型來說,還區(qū)分 signed 和 unsigned。在 Java 語言中,內(nèi)置類型也有 char、short、int、long、double 等,只不過 Java 沒有 unsigned 類型。char 類型在 C 語言是占用 1 字節(jié)長度,而在 Java 語言中占用 2 字節(jié)長度。而其他類型不管在 C 語言中,還是在 Java 語言中,都是占用多個(gè)字節(jié)長度。我們知道 CPU 訪問內(nèi)存是通過地址總線完成的,一塊連續(xù)的內(nèi)存空間是經(jīng)過編址的,每一個(gè)地址編號對應(yīng) 1 字節(jié)長度的內(nèi)存空間,地址空間是從低地址到高地址增長的。如果要在內(nèi)存中存儲(chǔ) 0xAABBCCDD 這樣一個(gè)長度為 4 字節(jié)的十六進(jìn)制整數(shù),需要 4 字節(jié)的內(nèi)存空間。內(nèi)存空間示意如下: 100 101 102 103 -------> 內(nèi)存地址由低到高增長的方向 +----+----+----+----+ | | | | | +----+----+----+----+那么 0xAA 是存儲(chǔ)在地址編號為 100 的空間呢?還是存儲(chǔ)在地址編號為 103 的空間呢?這就是本節(jié)要討論的字節(jié)序的問題。字節(jié)序有大端序(Big-Endian)和小端序(Little-Endian)之分。對于前面提到的十六進(jìn)制整數(shù) 0xAABBCCDD 來說,如果按照大端序在內(nèi)存中存儲(chǔ),那么從低地址到高地址的存儲(chǔ)順序依次是 0xAA、0xBB、0xCC、0xDD;如果按照小端序在內(nèi)存中存儲(chǔ),那么從低地址到高地址的存儲(chǔ)順序依次是 0xDD、0xCC、0xBB、0xAA。文字描述還是有些抽象,我們通過一張圖來直觀感受一下內(nèi)存字節(jié)序。

2.1 merge () 函數(shù)

該函數(shù)提供了豐富的參數(shù),靈活的設(shè)置數(shù)據(jù)的連接方式,下面我們列舉了該函數(shù)幾個(gè)常用的參數(shù)。pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)參數(shù)名說明 left 連接的左側(cè)的 DataFrame 數(shù)據(jù)集 right 連接 how 匹配方式的設(shè)置,有 inner,left,right 和 outer 四種模式,默認(rèn)是 inner 模式 on 指定連接鍵 suffixes 傳入元祖,設(shè)置重疊列的索引名的后綴,默認(rèn)是(‘x’,‘y’)1. how 參數(shù)該參數(shù)有四個(gè)值:inner:是默認(rèn)的匹配方式,根據(jù)兩個(gè)表的交集部分進(jìn)行匹配連接;left:以左邊的數(shù)據(jù)表為基礎(chǔ),匹配右邊的數(shù)據(jù)表,匹配不到的通過 NaN 進(jìn)行填充;right:以右邊的數(shù)據(jù)表為基礎(chǔ),匹配左邊的數(shù)據(jù)表,匹配不到的通過 NaN 進(jìn)行填充;outer:將兩個(gè)數(shù)據(jù)表連接匯總成一個(gè)表,有匹配的展示結(jié)果,沒有匹配的填充 NaN。下面我們通過代碼程序詳細(xì)的演示一下四種模式的區(qū)別:# data_01 和 data_02 是從兩個(gè)excel表中解析出的數(shù)據(jù)集# merge 函數(shù),默認(rèn)的 how = “inner”data_res=pd.merge(data_01,data_02,how="inner")print(data_res)# --- 輸出結(jié)果 --- 編程語言 編號 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人 月平均銷售數(shù)量 主要銷售區(qū)域0 java 1995010302 1995年 45.6 James Gosling 134 成都1 C 1972021222 1972年 33.9 Dennis MacAlistair Ritchie 67 天津2 js 1995040903 1995年 59.5 Brendan Eich 199 上海3 C++ 1983070316 1983年 75.0 Bjarne Stroustrup 323 合肥輸出解析:默認(rèn)的 inner 匹配方式,會(huì)通過兩個(gè)數(shù)據(jù)集對應(yīng)的列索引進(jìn)行數(shù)據(jù)的匹配,尋找兩個(gè)數(shù)據(jù)集中在 “編號” 和 “推出時(shí)間” 上匹配的數(shù)據(jù)進(jìn)行連接。因?yàn)閮蓚€(gè)數(shù)據(jù)集在 “編號” 和 “推出時(shí)間” 上,只有四個(gè)共同數(shù)據(jù),通過 inner 方式匹配,結(jié)果只有四行數(shù)據(jù)。# data_01 和 data_02 是從兩個(gè)excel表中解析出的數(shù)據(jù)集# merge 函數(shù), how = “l(fā)eft”data_res=pd.merge(data_01,data_02,how="left")print(data_res)# --- 輸出結(jié)果 --- 編程語言 編號 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人 月平均銷售數(shù)量 主要銷售區(qū)域0 java 1995010302 1995年 45.6 James Gosling 134.0 成都1 python 1991110502 1991年 67.0 Guido van Rossum NaN NaN2 C 1972021222 1972年 33.9 Dennis MacAlistair Ritchie 67.0 天津3 js 1995040903 1995年 59.5 Brendan Eich 199.0 上海4 php 2012092312 2012年 69.9 Rasmus Lerdorf NaN NaN5 C++ 1983070316 1983年 75.0 Bjarne Stroustrup 323.0 合肥輸出解析:left 匹配方式,是以左側(cè)數(shù)據(jù)集的連接鍵值為標(biāo)準(zhǔn),通過連接鍵將右邊的數(shù)據(jù)集進(jìn)行連接,如果數(shù)據(jù)在連接鍵上相匹配,就把數(shù)據(jù)連接進(jìn)來,如果左側(cè)數(shù)據(jù)連接鍵的值沒有找到右側(cè)與之對應(yīng)的數(shù)據(jù),就在右側(cè)數(shù)據(jù)填充 NaN 。# data_01 和 data_02 是從兩個(gè)excel表中解析出的數(shù)據(jù)集# merge 函數(shù), how = “right”data_res=pd.merge(data_01,data_02,how="right")print(data_res)# --- 輸出結(jié)果 --- 編程語言 編號 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人 月平均銷售數(shù)量 主要銷售區(qū)域0 java 1995010302 1995年 45.6 James Gosling 134 成都1 NaN 1991110506 2006年 NaN NaN 231 北京2 C 1972021222 1972年 33.9 Dennis MacAlistair Ritchie 67 天津3 js 1995040903 1995年 59.5 Brendan Eich 199 上海4 NaN 2012092313 2013年 NaN NaN 23 深圳5 C++ 1983070316 1983年 75.0 Bjarne Stroustrup 323 合肥輸出解析:right 匹配方式,是以右側(cè)數(shù)據(jù)集的連接鍵值為標(biāo)準(zhǔn),通過連接鍵將左側(cè)的數(shù)據(jù)集進(jìn)行連接,如果在連接鍵上左側(cè)數(shù)據(jù)和右側(cè)數(shù)據(jù)相匹配,就把左側(cè)的數(shù)據(jù)連接進(jìn)來,右側(cè)數(shù)據(jù)連接鍵上數(shù)據(jù)左側(cè)數(shù)據(jù)沒有與之匹配的數(shù)據(jù),則以 NaN 進(jìn)行填充。# data_01 和 data_02 是從兩個(gè)excel表中解析出的數(shù)據(jù)集# merge 函數(shù), how = “outer”data_res=pd.merge(data_01,data_02,how="outer")print(data_res)# --- 輸出結(jié)果 --- 編程語言 編號 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人 月平均銷售數(shù)量 主要銷售區(qū)域0 java 1995010302 1995年 45.6 James Gosling 134.0 成都1 python 1991110502 1991年 67.0 Guido van Rossum NaN NaN2 C 1972021222 1972年 33.9 Dennis MacAlistair Ritchie 67.0 天津3 js 1995040903 1995年 59.5 Brendan Eich 199.0 上海4 php 2012092312 2012年 69.9 Rasmus Lerdorf NaN NaN5 C++ 1983070316 1983年 75.0 Bjarne Stroustrup 323.0 合肥6 NaN 1991110506 2006年 NaN NaN 231.0 北京7 NaN 2012092313 2013年 NaN NaN 23.0 深圳輸出解析:outer 匹配方式,是以連接鍵為標(biāo)準(zhǔn),將左右兩邊的數(shù)據(jù)集進(jìn)行連接,如果連接鍵存中兩個(gè)數(shù)據(jù)集存在匹配的數(shù)據(jù),則把左右數(shù)據(jù)進(jìn)行連接,如果有一個(gè)數(shù)據(jù)集不存在匹配數(shù)據(jù),則用 NaN 進(jìn)行填充。2. on 參數(shù)該參數(shù)用于指定數(shù)據(jù)集的連接鍵,默認(rèn)的是兩個(gè)數(shù)據(jù)集中共有的列索引,就像我們上面的 data_01 和 data_02 數(shù)據(jù)集,他們都有 “編號” 和 “推出時(shí)間” 列,因此這兩列就是默認(rèn)的連接鍵。當(dāng)然我們也可以用 on 參數(shù)指定其中的一列為連接鍵,如下代碼演示:# data_01 和 data_02 是從兩個(gè)excel表中解析出的數(shù)據(jù)集# merge 函數(shù), on = “編號”data_res=pd.merge(data_01,data_02,on=["編號"])print(data_res)# --- 輸出結(jié)果 --- 編程語言 編號 推出時(shí)間_x 價(jià)格 主要?jiǎng)?chuàng)始人 推出時(shí)間_y 月平均銷售數(shù)量 主要銷售區(qū)域 0 java 1995010302 1995年 45.6 James Gosling 1995年 134 成都 1 C 1972021222 1972年 33.9 Dennis MacAlistair Ritchie 1972年 67 天津2 js 1995040903 1995年 59.5 Brendan Eich 1995年 199 上海 3 C++ 1983070316 1983年 75.0 Bjarne Stroustrup 1983年 323 合肥 輸出解析:這里我們指定了關(guān)鍵鍵為” 編號 “列,因此在數(shù)據(jù)匹配時(shí),將以該列進(jìn)行數(shù)據(jù)的匹配連接操作,因?yàn)閮蓚€(gè)數(shù)據(jù)集中均有” 推出時(shí)間 “列,因此會(huì)默認(rèn)加上后綴 ”x“,”y“ 作為區(qū)分,當(dāng)然后面我們會(huì)講到對后綴的修改操作。Tips:在這里我們需要注意指定連接鍵時(shí)傳入的是列表數(shù)據(jù),可以是多個(gè)數(shù)據(jù)列,但一定要是連接數(shù)據(jù)集中都有的列索引,否則會(huì)報(bào)錯(cuò) KeyError ,如下面代碼所示。# data_01 和 data_02 是從兩個(gè)excel表中解析出的數(shù)據(jù)集# merge 函數(shù), on = “主要?jiǎng)?chuàng)始人”data_res=pd.merge(data_01,data_02,on=["主要?jiǎng)?chuàng)始人"])print(data_res)# --- 輸出結(jié)果 --- …… 1561 values = self.axes[axis].get_level_values(key)._values 1562 else:-> 1563 raise KeyError(key) 1564 1565 # Check for duplicatesKeyError: '主要?jiǎng)?chuàng)始人'輸出解析:這里可以看到,我們指定了連接鍵是 “主要?jiǎng)?chuàng)始人”,并不是兩個(gè)數(shù)據(jù)集中都有的列索引,因此會(huì)報(bào)錯(cuò)。3. suffixes 參數(shù)該參數(shù)用于指定連接后數(shù)據(jù)集中重復(fù)列索引的后綴,默認(rèn)的是(‘x’,‘y’):# data_01 和 data_02 是從兩個(gè)excel表中解析出的數(shù)據(jù)集# merge 函數(shù),suffixesdata_res=pd.merge(data_01,data_02,on=["編號"],suffixes=("AA","BB") )print(data_res)# --- 輸出結(jié)果 --- 編程語言 編號 推出時(shí)間AA 價(jià)格 主要?jiǎng)?chuàng)始人 推出時(shí)間BB 月平均銷售數(shù)量 主要銷售區(qū)域 0 java 1995010302 1995年 45.6 James Gosling 1995年 134 成都1 C 1972021222 1972年 33.9 Dennis MacAlistair Ritchie 1972年 67 天津2 js 1995040903 1995年 59.5 Brendan Eich 1995年 199 上海3 C++ 1983070316 1983年 75.0 Bjarne Stroustrup 1983年 323 合肥輸出解析:通過 suffixes 參數(shù)指定重復(fù)列索引值所添加的后綴值,通過輸出結(jié)果可以看出 “推出時(shí)間” 分別加上上 AA, BB 的后綴。

4. 小結(jié)

比較經(jīng)典的面向過程編程語言有 C。面向?qū)ο缶幊淌蔷幊陶Z言技術(shù)邁出的一大步,面向?qū)ο蟮某霈F(xiàn)讓我們的代碼能夠更好的描述我們的世界?,F(xiàn)在的主流編程語言已經(jīng)紛紛開始支持面向?qū)ο?,所以掌握面向?qū)ο缶幊淌浅蔀橐粋€(gè)好的程序員的基本。

1.12 length

返回輸入值的長度,輸入的可以是字符串和列表。示例如下:{{ value|length }}如果 value 的值為:[‘a(chǎn)’, ‘b’, ‘c’, ‘d’] 或者 ‘a(chǎn)bcd’,輸出都是4。對于未定義的變量值,輸出為0。它的實(shí)現(xiàn)代碼也是非常簡單,如下:@register.filter(is_safe=False)def length(value): """Return the length of the value - useful for lists.""" try: return len(value) except (ValueError, TypeError): return 0

1.4 字符串

字符串就是由一些列的字符用雙引號包圍。例如:Tips:這里的雙引號(" ")是在英文輸入法下輸入的引號,不是中文輸入法中的引號。這點(diǎn)在系統(tǒng)中同時(shí)有中文和英文輸入法的環(huán)境下很容易引起錯(cuò)誤。"hello world!""This is a lesson for C language."

2. 示例程序

#include <stdio.h>#include <string.h>int main(){ char a[100] = "Welcome to our wiki!"; char b[] = "It is a interest place."; char c[20] = ""; printf("string length = %lu\n", strlen(a)); printf("Compare a to a : %d\n", strcmp(a, a)); printf("Compare a to b : %d\n", strcmp(a, b)); printf("Compare b to a : %d\n", strcmp(b, a)); printf("Before copy : %s\n", c); strcpy(c, a); printf("After copy : %s\n", c); char *pchar; pchar = strchr(a, 'o'); printf("Character : %s\n", pchar); pchar = strstr(a, "our"); printf("String : %s\n", pchar); strcat(a, b); printf("After concatenate strings : %s\n", a); return 0;}運(yùn)行結(jié)果:string length = 20Compare a to a : 0Compare a to b : 14Compare b to a : -14Before copy :After copy : Welcome to our wiki!Character : ome to our wiki!String : our wiki!After concatenate strings : Welcome to our wiki!It is a interest place.在示例程序中,我們展示了常用的字符串函數(shù)的使用。在獲取字符串大小的函數(shù)中,我們統(tǒng)計(jì)的字符串的大小是包含空格和符號的。但是不包含字符數(shù)組中的最后一個(gè)表示字符串結(jié)束的 \0 字符。比較字符串的大小其實(shí)是比較其里面字符編碼的數(shù)值大小求差值,所以兩個(gè)相同的字符差值是 0 ,如果前面的字符編碼值小于后面的,那么就會(huì)出現(xiàn)負(fù)值,反之就是一個(gè)正值。。但是具體的比較方式留在這里大家通過嘗試不同的值猜測一下。拷貝字符串,就是將一個(gè)真的復(fù)制生成一個(gè)副本。而不是如同我們之前提及的使用數(shù)組給函數(shù)傳遞參數(shù)的時(shí)候一樣,只是傳遞的函數(shù)本體,而不是副本。因此你在復(fù)制字符串完成后,即使修改了原有字符串,也不會(huì)影響到新生成的字符串。字符的查找與字符串的查找基本是類似的,通過示例可以看出,我們通過字符查找 o 那么會(huì)返回第一個(gè)出現(xiàn) o 的位置的指針,而通過字符串查找,只有完全匹配字符的情況下才返回指針,所以會(huì)跳過字符查找出現(xiàn)的位置,繼續(xù)查找,直到找到 our 這個(gè)字符串。拼接字符串就是將兩個(gè)字符串拼接,這里同樣需要注意。前面是數(shù)組大小要足夠大,可以容納被拼接的字符串,否則會(huì)出現(xiàn)問題。

4. 同步生產(chǎn)者與消費(fèi)者的推進(jìn)速度

在生產(chǎn)者、消費(fèi)者模型中,可能會(huì)存在兩者推進(jìn)速度不匹配的問題:生產(chǎn)者生產(chǎn)數(shù)據(jù)的速度較快,但是,消費(fèi)者取走數(shù)據(jù)的速度較慢??梢允褂?queue 的 task_done() 方法和 join() 方法同步生產(chǎn)者與消費(fèi)者的推進(jìn)速度:生產(chǎn)者調(diào)用 join() 方法,等待隊(duì)列中所有的數(shù)據(jù)被取走消費(fèi)者調(diào)用 task_done() 方法,表示取走了隊(duì)列中的一項(xiàng)數(shù)據(jù),當(dāng)隊(duì)列為空時(shí),喚醒阻塞在 join() 方法中的生產(chǎn)者import threadingimport queueq = queue.Queue()導(dǎo)入 threading 模塊和 queue 模塊創(chuàng)建共享隊(duì)列 qdef produce(): for item in ['A', 'B', 'C', 'D']: q.put(item) print('produce %s' % item) q.join() print('------------ q is empty') for item in ['E', 'F', 'G', 'H']: q.put(item) print('produce %s' % item) q.join() print('------------ q is empty')創(chuàng)建生產(chǎn)者線程的入口函數(shù) produce首先,生產(chǎn) 4 個(gè)數(shù)據(jù):A、B、C、D調(diào)用 q.put(item) 將它們放入到隊(duì)列 q 中調(diào)用 q.join() 等待消費(fèi)者將它們?nèi)咳∽呷缓螅a(chǎn) 4 個(gè)數(shù)據(jù):E、F、G、G調(diào)用 q.put(item) 將它們放入到隊(duì)列 q 中調(diào)用 q.join() 等待消費(fèi)者將它們?nèi)咳∽遜ef consume(): for i in range(8): item = q.get() print(' consume %s' % item) q.task_done()創(chuàng)建消費(fèi)者線程的入口函數(shù) consume調(diào)用 q.get() 從隊(duì)列 q 中取走一個(gè)數(shù)據(jù)調(diào)用 q.task_done(),表示已經(jīng)從隊(duì)列 q 中取走了一個(gè)數(shù)據(jù),當(dāng)隊(duì)列為空時(shí),喚醒生產(chǎn)者producer = threading.Thread(target=produce, args=())consumer = threading.Thread(target=consume, args=())producer.start()consumer.start()創(chuàng)建生產(chǎn)者線程 producer,線程入口為 produce創(chuàng)建消費(fèi)者線程 consumer,線程入口為 consume啟動(dòng)生產(chǎn)者線程和消費(fèi)者線程,并等待它們結(jié)束運(yùn)行程序,輸出結(jié)果如下:produce Aproduce B consume A consume Bproduce C consume Cproduce D consume D------------ q is emptyproduce E consume Eproduce F consume Fproduce Gproduce H consume G consume H------------ q is empty生產(chǎn)者生產(chǎn)第一批數(shù)據(jù) A、B、C、D,消費(fèi)者將其取走當(dāng)?shù)谝慌鷶?shù)據(jù)完全被消費(fèi)者取走后,生產(chǎn)者才開始生產(chǎn)第二批數(shù)據(jù)生產(chǎn)者生產(chǎn)第二批數(shù)據(jù) E、F、G、H,消費(fèi)者將其取走

4. 小結(jié)

編程語言的輸入與輸出是編程語言的基本組成部分。C 語言的語言的標(biāo)準(zhǔn)的輸入和輸出都指通過鍵盤輸入和向顯示器輸出結(jié)果的過程。這里面經(jīng)常用到的函數(shù)包含:輸入函數(shù)。 scanf, fgets 等。輸出函數(shù)。 printf, puts 等。

3.2 求解思路詳解

首先,我們將 3.1 節(jié)中的求解思路用下圖表示:如圖,我們可以更清楚地明白求解一個(gè)數(shù)組的最大子數(shù)組問題就是對 3.1 節(jié)中的步驟 2 中的三種情況的分別求解, 步驟 2 中的情況 a 和情況 b 可以通過遞歸求解得出結(jié)果,所以我們現(xiàn)在先看一下情況 c 的具體求解過程。情況 c 的求解很容易在線性時(shí)間內(nèi)就可以得出結(jié)果,他并不是原問題的一個(gè)規(guī)模更小的實(shí)例,因?yàn)榍闆r c 中加入了一個(gè)限制(求出的子數(shù)組必須跨越下標(biāo)為 mid 的中間節(jié)點(diǎn))。如上圖的右邊圖形所示,情況 c 的求解結(jié)果都會(huì)有兩個(gè)子數(shù)組 A [i,mid] 和 A [mid+1,j] 組成,其中 low <= i <= mid <= j <=high。因此,我們只需要找出形如 A [i,mid] 和 A [mid+1,j] 的最大子數(shù)組,然后將其合并即可。我們用下面的偽代碼 FindMaxCrossSubarray 描述 3.1 節(jié)中 步驟 2 中的情況 c 具體實(shí)現(xiàn)過程:FindMaxCrossSubarray(A, low, mid ,high): leftSum = minInteger; //設(shè)置左邊的最大連續(xù)和初始值為最小整數(shù)值 sum =0; maxLeft = mid; //記錄左邊最大子數(shù)組的下標(biāo)位置,初始化為mid for (i=mid; i>=low; i--){ sum = sum + A[i]; if (sum > leftSum){ leftSum = sum; maxtLeft = i; } } rightSum = minInteger; //設(shè)置右邊的最大連續(xù)和初始值為最小整數(shù)值 sum = 0; maxtRight = mid + 1; //記錄右邊最大子數(shù)組的下標(biāo)位置,初始化為mid+1 for (j=mid+1; j<=low; j++){ sum = sum + A[j]; if (sum > rightSum){ rightSum = sum; maxtRight = j;//記錄左邊最大子數(shù)組的下標(biāo)位置 } } //返回結(jié)果是一個(gè)三元組數(shù)據(jù),分別是最大子數(shù)組的開始下標(biāo),結(jié)束下標(biāo),求和的值 return (maxLeft,maxRight,leftSum+rightSum); 上述偽代碼的描述中的第 2 至第 11 行,是求解左半部分 A [low,mid] 的最大子數(shù)組的過程,因?yàn)楸仨毎聵?biāo)為 mid 的元素,所以從下標(biāo)為 mid 的中間節(jié)點(diǎn)開始逐步遞減到下標(biāo)為 low 的元素,對應(yīng)偽代碼中的第 5 至第 11 行的 for 循環(huán)結(jié)構(gòu),循環(huán)的過程中會(huì)記錄下左邊部分的最大子數(shù)組的具體值及左半部分的下標(biāo)位置。同理,上述偽代碼的第 12 至第 21 行對應(yīng)的是求解右半部分 A [mid+1,high] 的最大子數(shù)組的過程。最后,偽代碼中的第 23 行綜合左右兩邊求解結(jié)果,返回必須跨越下標(biāo)為 mid 的中間元素時(shí),對應(yīng)的原數(shù)組 A 的最大子數(shù)組結(jié)果。當(dāng)我們可以清楚地知道步驟 2 中的情況 c 的求解過程時(shí),我們就可以綜合知道對于數(shù)組 A 求解最大子數(shù)組的整體過程,用偽代碼 FindMaxSubarray 描述如下:FindMaxSubarray(A,low,high): if (high == low){ return new Result(low,high,A[low]); //基礎(chǔ)情況,只有一個(gè)元素時(shí)候的處理情況 }else { //對應(yīng)2.1節(jié)中步驟1,找到中間元素 int mid = (low + high)/2; //對應(yīng)2.1節(jié)中步驟2,分別對應(yīng)a,b,c三種情況求解最大子數(shù)組結(jié)果 (leftLow,leftHigh,leftSum) = FindMaxSubarray(A,low,mid); (rightLow,rightHigh,rightSum) = FindMaxSubarray(A,mid+1,high); (crossLow,crossHigh,crossSum) = FindMaxCrossSubarray(A,low,mid,high); //對應(yīng)2.1節(jié)中步驟3,比較得出最后結(jié)果 if(leftSum >= righSum && leftSum >= crossSum){ return (leftLow,leftHigh,leftSum); }else if (rightSum >= leftSum && rightSum >= crossSum){ return (rightLow,rightHigh,rightSum); }else { return (crossLow,crossHigh,crossSum); } }上述求解數(shù)組 A 的最大子數(shù)組的整體過程偽代碼,主要就是由我們在 2.1 節(jié)中描述的三大步驟而來。代碼第 2 至第 4 行,主要表明了最基礎(chǔ)的情況的處理方式。代碼第 4 至第 18 行對應(yīng)著具體的實(shí)現(xiàn)方式,第 8 行和第 9 行分別是對子問題的遞歸求解,第 10 行調(diào)用 FindMaxCrossSubarray 過程,求解跨越中間節(jié)點(diǎn)的最大子數(shù)組求解方式,最后第 12 至 18 行對比三種情況的結(jié)果得出最終結(jié)果。

3. 小結(jié)

C 語言程序是由一個(gè)個(gè)函數(shù)組成的,其中唯一的主函數(shù)叫做 main。它是程序的入口,負(fù)責(zé)組織整個(gè)程序。每個(gè)函數(shù)包含主函數(shù)都是由函數(shù)返回值,函數(shù)名稱,函數(shù)傳入變量,內(nèi)部的變量與常量,被調(diào)用的外部函數(shù)等組成。只不過 main 函數(shù)的名稱特殊了一點(diǎn)而已。

6. 小結(jié)

Python 中的循環(huán)控制語句只有 for 和 While 兩種,不同于 C 或者 Java 等其他編程語言還有 do…while。循環(huán)控制語句和分級結(jié)構(gòu)語句一樣在工作中經(jīng)常會(huì)用到。大家多想想在編程中有什么地方是需要用到 循環(huán)控制語句的,想到之后不妨用代碼實(shí)現(xiàn)一下。

2.6 自動(dòng)垃圾回收機(jī)制

在常規(guī)語言(例如 C 和 C++)中,程序員必須確保已分配的內(nèi)存被釋放。防止造成內(nèi)存泄漏的麻煩。內(nèi)存資源或緩沖區(qū)具有特定的操作模式以獲得最佳性能。一旦緩沖區(qū)中充滿了數(shù)據(jù),就需要在不再使用其內(nèi)容之后將其清除。如果程序員忘記清除其代碼中的內(nèi)容,則內(nèi)存很容易過載。Java 使用自動(dòng)垃圾收集器來管理對象生命周期中的內(nèi)存。程序員確定何時(shí)創(chuàng)建對象,一旦不再使用對象,Java 運(yùn)行時(shí)將負(fù)責(zé)恢復(fù)內(nèi)存。一旦沒有了對對象的引用,則垃圾回收器將自動(dòng)釋放無法訪問的內(nèi)存。自動(dòng)垃圾回收機(jī)制,讓使用 Java 編寫的代碼更加健壯,降低了內(nèi)存泄漏和溢出的風(fēng)險(xiǎn)。程序員唯一需要注意的是對象創(chuàng)建的速度。如果應(yīng)用程序創(chuàng)建對象的速度超過了垃圾收集器釋放對象的速度,則可能導(dǎo)致內(nèi)存相關(guān)問題。

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

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

幫助反饋 APP下載

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

公眾號

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