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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
2.3 示例

下面的命令演示了文件管理程序的用法:2.3.1 啟動(dòng)程序C:\> python main.py> 在第 1 行,程序的主文件是 main.py,啟動(dòng)程序在第 2 行,程序啟動(dòng)后,打印提示符 >,等待用戶輸入命令2.3.2 輸入命令 help> helpexit - exit programcat file - print filels - list file in current dirls dir - list file in dircp src dst - copy filerm file - remove file在第 1 行,輸入命令 help,功能是打印各個(gè)命令的用法2.3.3 輸入命令 cat> cat test.txtwwwimooccom在第 1 行,輸入命令 cat test.txt,功能是打印文件 test.txt 的內(nèi)容2.3.4 輸入命令 ls> lsmain.pytest.txt在第 1 行,輸入命令 ls,功能是列出當(dāng)前目錄下的文件> ls C:\Documents and SettingsProgram FilesProgram Files (x86)ProgramDataSystem Volume InformationUsersWindows在第 1 行,輸入命令 ls C:\,功能是列出 C 盤根目錄下的文件2.3.5 輸入命令 cp> cp test.txt test.bak> lsmain.pytest.txttest.bak在第 1 行,輸入命令 cp test.txt test.bak,功能是將文件 test.txt 復(fù)制到 test.bak在第 2 行,輸入命令 ls,列出當(dāng)前目錄下的文件,發(fā)現(xiàn)新增了一個(gè)文件 test.bak2.3.6 輸入命令 rm> rm test.bak> lsmain.pytest.txt在第 1 行,輸入命令 rm test.bak,功能是刪除文件 test.bak在第 2 行,輸入命令 ls,列出當(dāng)前目錄下的文件,發(fā)現(xiàn)文件 test.bak 被刪除了2.3.6 輸入命令 exit> exitC:\>在第 1 行,輸入命令 exit,功能是退出程序在第 2 行,返回到 DOS 命令行模式

5. 優(yōu)化快速排序算法

對(duì)于優(yōu)化快速排序,在這里我們只考慮最簡(jiǎn)單的一種優(yōu)化思路,就是基準(zhǔn)數(shù)的選擇。前面的快排算法中,我們都是選擇列表的第一個(gè)元素作為基準(zhǔn)數(shù),這在列表隨機(jī)的情況下是沒有什么問(wèn)題的,但對(duì)本身有序的列表進(jìn)行排序時(shí),時(shí)間復(fù)雜度就會(huì)退化到 O(n2)O(n^2)O(n2)。我們來(lái)進(jìn)行相關(guān)測(cè)試:# 冒泡排序算法import datetimeimport randomfrom sort_algorithms import get_num_position, quick_sort# python默認(rèn)遞歸次數(shù)有限制,如果不進(jìn)行設(shè)置,會(huì)導(dǎo)致超出遞歸最大次數(shù)import sys sys.setrecursionlimit(1000000)if __name__ == '__main__': # 對(duì)于設(shè)置10000,本人電腦會(huì)出現(xiàn)棧溢出錯(cuò)誤 # nums = [random.randint(10, 10000) for i in range(6000)] nums = [i for i in range(6000)] start = datetime.datetime.now() quick_sort(nums, 0, len(nums) - 1) end = datetime.datetime.now() print('Running time: %s Seconds' % (end-start))第一個(gè)注釋的語(yǔ)言是對(duì) nums 列表隨機(jī)生成,而第二個(gè)直接情況是直接生成有序的列表。我們分別看執(zhí)行結(jié)果:# 隨機(jī)列表快排PS C:\Users\spyinx\Desktop\學(xué)習(xí)教程\慕課網(wǎng)教程\算法慕課教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/學(xué)習(xí)教程/慕課網(wǎng)教程/算法慕課教程/code/test_algorithms.pyRunning time: 0:00:00.027907 Seconds# 有序列表快排PS C:\Users\spyinx\Desktop\學(xué)習(xí)教程\慕課網(wǎng)教程\算法慕課教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/學(xué)習(xí)教程/慕課網(wǎng)教程/算法慕課教程/code/test_algorithms.pyRunning time: 0:00:02.159677 Seconds可以看到明顯的差別,差不多差了 80 倍,這確實(shí)是純快排算法存在的一個(gè)問(wèn)題。如果我們往這個(gè)有序列表中插入少量隨機(jī)數(shù),打破有序的情況,會(huì)看到性能會(huì)有較大提升。這個(gè)問(wèn)題的根源在于基準(zhǔn)數(shù)目的選擇,對(duì)于有序的列表排序時(shí)每次都是選擇的最小或者最大的值,這就是最壞的情況。一個(gè)顯而易見的改進(jìn)策略就是隨機(jī)選擇列表中的值作為基準(zhǔn)數(shù),另一種是從頭 (left)、中 ([left + right] // 2) 和尾 (right) 這三個(gè)元素中取中間值作為基準(zhǔn)數(shù)。我們分別進(jìn)行測(cè)試:import randomdef get_base(nums, left, right): index = random.randint(left, right) if index != left: nums[left], nums[index] = nums[index], nums[left] return nums[left]def get_base_middle(nums, left, right): if left == right: return nums[left] mid = (left + right) >> 1 if nums[mid] > nums[right]: nums[mid], nums[right] = nums[right], nums[mid] if nums[left] > nums[right]: # nums[left]最大,nums[right]中間,所以交換 nums[left], nums[right] = nums[left], nums[mid] if nums[mid] > nums[left]: # 說(shuō)明nums[left]最小, nums[mid]為中間值 nums[left], nums[mid] = nums[mid], nums[left] return nums[left]def get_num_position(nums, left, right): # base = nums[left] # 隨機(jī)基準(zhǔn)數(shù) base = get_base(nums, left, right) # base = get_base_middle(nums, left, right) while left < right: # 和前面相同,以下兩個(gè)while語(yǔ)句用于將基準(zhǔn)數(shù)放到對(duì)應(yīng)位置,使得基準(zhǔn)數(shù)左邊的元素都小于它,右邊的數(shù)都大于它 while left < right and nums[right] >= base: right -= 1 nums[left] = nums[right] while left < right and nums[left] <= base: left += 1 nums[right] = nums[left] # 基準(zhǔn)數(shù)的位置,并返回該位置值 nums[left] = base return left改進(jìn)后的測(cè)試結(jié)果如下:# 有序列表-隨機(jī)基準(zhǔn)值PS C:\Users\spyinx\Desktop\學(xué)習(xí)教程\慕課網(wǎng)教程\算法慕課教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/學(xué)習(xí)教程/慕課網(wǎng)教程/算法慕課教程/code/test_algorithms.pyRunning time: 0:00:00.021890 Seconds# 隨機(jī)列表-隨機(jī)基準(zhǔn)值PS C:\Users\spyinx\Desktop\學(xué)習(xí)教程\慕課網(wǎng)教程\算法慕課教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/學(xué)習(xí)教程/慕課網(wǎng)教程/算法慕課教程/code/test_algorithms.pyRunning time: 0:00:00.026948 Seconds# 有序列表-中位數(shù)基準(zhǔn)值PS C:\Users\spyinx\Desktop\學(xué)習(xí)教程\慕課網(wǎng)教程\算法慕課教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/學(xué)習(xí)教程/慕課網(wǎng)教程/算法慕課教程/code/test_algorithms.pyRunning time: 0:00:00.012944 Seconds# 隨機(jī)列表-中位數(shù)基準(zhǔn)值 PS C:\Users\spyinx\Desktop\學(xué)習(xí)教程\慕課網(wǎng)教程\算法慕課教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/學(xué)習(xí)教程/慕課網(wǎng)教程/算法慕課教程/code/test_algorithms.pyRunning time: 0:00:00.020933 Seconds可以看到使用中位數(shù)基準(zhǔn)值在有序列表情況下排序速度更快。最后還有一個(gè)簡(jiǎn)單的常用優(yōu)化方案,就是當(dāng)序列長(zhǎng)度達(dá)到一定大小時(shí),使用插入排序。# 改造前面的插入排序算法def insert_sort(nums, start, end): """ 插入排序 """ if not nums: return False for i in range(start + 1, end + 1): t = nums[i] for j in range(i - 1, start - 1, -1): k = j if nums[j] <= t: k = k + 1 break nums[j + 1] = nums[j] nums[k] = t return True # ...def quick_sort(nums, start, end): """ 快速排序算法 """ if (end - start + 1 < 10): # 在排序的數(shù)組小到一定程度時(shí),使用插入排序 insert_sort(nums, start, end) return # 找到基準(zhǔn)數(shù)位置,同時(shí)調(diào)整好數(shù)組,使得基準(zhǔn)數(shù)的左邊小于它,基準(zhǔn)數(shù)的右邊都是大于它 pos = get_num_position(nums, start, end) # 遞歸使用快排,對(duì)左邊使用快排算法 quick_sort(nums, start, pos - 1) # 對(duì)右邊元素使用快排算法 quick_sort(nums, pos + 1, end)下面是使用【隨機(jī)基準(zhǔn)+插入排序優(yōu)化】的測(cè)試結(jié)果如下:# 有序列表-[隨機(jī)基準(zhǔn)+使用插入排序優(yōu)化]PS C:\Users\spyinx\Desktop\學(xué)習(xí)教程\慕課網(wǎng)教程\算法慕課教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/學(xué)習(xí)教程/慕課網(wǎng)教程/算法慕課教程/code/test_algorithms.pyRunning time: 0:00:00.010962 Seconds# 無(wú)序列表-[隨機(jī)基準(zhǔn)+使用插入排序優(yōu)化]PS C:\Users\spyinx\Desktop\學(xué)習(xí)教程\慕課網(wǎng)教程\算法慕課教程\code> & "D:/Program Files (x86)/python3/python.exe" c:/Users/spyinx/Desktop/學(xué)習(xí)教程/慕課網(wǎng)教程/算法慕課教程/code/test_algorithms.pyRunning time: 0:00:00.018935 Seconds可以看到這些小技巧在真正大規(guī)模數(shù)據(jù)排序時(shí)會(huì)有非常明顯的效果。更多的優(yōu)化方法以及測(cè)試,讀者可以自行去實(shí)驗(yàn)和測(cè)試,這里就不再繼續(xù)講解了。

3.GROUP BY HAVING

以 student_course、course、student 表內(nèi)連接查詢?yōu)槔篠ELECT * FROM student_course a INNER JOIN student b ON a.student_id=b.id INNER JOIN course c ON a.course_id=c.id;查詢結(jié)果如下圖:使用 AVG 函數(shù)取分組數(shù)據(jù)平均年齡:SELECT a.course_id,c.course_name,AVG(age) FROM student_course a INNER JOIN student b ON a.student_id=b.id INNER JOIN course c ON a.course_id=c.idGROUP BY a.course_id,c.course_name;執(zhí)行結(jié)果如下圖 :可以使用 HAVING 對(duì)上述結(jié)果篩選,例如選出選課學(xué)生平均年齡大于 20 的課程數(shù)據(jù):SELECT a.course_id,c.course_name,AVG(age) FROM student_course a INNER JOIN student b ON a.student_id=b.id INNER JOIN course c ON a.course_id=c.idGROUP BY a.course_id,c.course_nameHAVING AVG(age) >= 20;執(zhí)行結(jié)果如下圖:Tips:如上圖所示,演示的是使用 AVG() 函數(shù)對(duì)分組數(shù)據(jù)進(jìn)行篩選,同理,可以分別使用 COUNT()、MIN()、MAX()、SUM() 這四種聚合函數(shù)取出分組的數(shù)據(jù),并且都可以使用 HAVING 后面的條件對(duì)分組聚合函數(shù)的值進(jìn)行篩選。

1.2 插入頁(yè)腳

為文檔 info.docx 設(shè)置頁(yè)腳,代碼如下:from docx import Documentdocument = Document("C:/info.docx") footer = document.sections[0].footer # 獲取第一個(gè)節(jié)的頁(yè)腳footer.add_paragraph('這是第一節(jié)的頁(yè)腳') # 為第一頁(yè)添加頁(yè)腳document.save('C:/info.docx')代碼解釋:代碼中首先讀取上一小節(jié)中完成的 info.docx 文檔,加載完成后,獲取文檔中 sections 部分,索引為 0 即獲取第一部分,根據(jù) footer 屬性獲取頁(yè)腳,在頁(yè)腳插入段落。運(yùn)行后代碼后 info.docx 文檔的頁(yè)腳效果如下圖所示。

3. 數(shù)據(jù)的合并操作

除了連接數(shù)據(jù)集,我們有時(shí)候需要對(duì)數(shù)據(jù)集在行或者列上進(jìn)行數(shù)據(jù)的拓展,這就要涉及到多個(gè)數(shù)據(jù)集的合并操作了,Pandas 中提供了 concat () 函數(shù)用于數(shù)據(jù)集的合并操作。同樣的在正式講解該函數(shù)使用之前,我們先準(zhǔn)備一下數(shù)據(jù)源。數(shù)據(jù)文件:execl 數(shù)據(jù) demo03.xlsx數(shù)據(jù)文件:execl 數(shù)據(jù) demo04.xlsx數(shù)據(jù)文件:execl 數(shù)據(jù) demo05.xlsx通過(guò) Pandas 將數(shù)據(jù)解析出來(lái),數(shù)據(jù)對(duì)象分別為:data_03 ,data_04 ,data_05# 導(dǎo)入pandas包import pandas as pddata_path_03="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第14小節(jié)/execl數(shù)據(jù)demo03.xlsx"data_path_04="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第14小節(jié)/execl數(shù)據(jù)demo04.xlsx"data_path_05="C:/Users/13965/Documents/myFuture/IMOOC/pandasCourse-progress/data_source/第14小節(jié)/execl數(shù)據(jù)demo05.xlsx"# 解析數(shù)據(jù)data_03 = pd.read_excel(data_path_03)data_04 = pd.read_excel(data_path_04)data_05 = pd.read_excel(data_path_05)print(data_03)# --- 輸出結(jié)果 data_03 --- 編程語(yǔ)言 推出時(shí)間 價(jià)格0 java 1995年 45.61 python 1991年 67.02 C 1972年 33.93 js 1995年 59.54 php 2012年 69.95 C++ 1983年 75.0print(data_04)# --- 輸出結(jié)果 data_04--- 推出時(shí)間 月平均銷售數(shù)量 主要銷售區(qū)域0 1995年 134 成都1 2006年 231 北京2 1972年 67 天津print(data_05)# --- 輸出結(jié)果 --- 推出時(shí)間 月份 發(fā)行地點(diǎn)0 1995年 12 廣州1 2006年 2 上海2 1972年 4 南京3 2017年 5 北京輸出解析:我們構(gòu)造了三個(gè)數(shù)據(jù)集,他們都有 "推出時(shí)間" 數(shù)據(jù)列,其他列名均不一樣,在數(shù)據(jù)的量上也存在差異,data_03 有 6 條數(shù)據(jù),data_04 有 3 條數(shù)據(jù),data_05 有 4 條數(shù)據(jù)。

1. 概述

CMake 構(gòu)建腳本是一個(gè)純文本文件,我們必須將其命名為 CMakeLists.txt,并在其中包含 CMake 構(gòu)建我們的 C/C++ 庫(kù)時(shí)需要使用的命令。如果我們的原生源代碼文件還沒有 CMake 構(gòu)建腳本,我們需要自行創(chuàng)建一個(gè),并在其中包含適當(dāng)?shù)?CMake 命令。下面我們將學(xué)習(xí)應(yīng)該在構(gòu)建腳本中包含哪些基本命令,以便指示 CMake 在創(chuàng)建原生庫(kù)時(shí)使用哪些源代碼文件。如需了解詳情,請(qǐng)參閱介紹 CMake 命令的官方文檔。

3. Ubuntu 下安裝 GCC 編譯器

在類 Linux 中編譯 C 語(yǔ)言是一件簡(jiǎn)單的事情。只要打開一個(gè)終端窗口安裝 gcc 編譯器即可。對(duì)于基于 Ubuntu 系統(tǒng)的用戶,安裝編譯所需的軟件只需要執(zhí)行如下命令:sudo apt install build-essentialTips:對(duì)于 RPM 包管理的 Linux 發(fā)行版(如 CentOS,OpenSUSE 等),會(huì)有類似的軟件組,只不過(guò)名稱和安裝時(shí)所使用的命令不同。在安裝結(jié)束后可以查看 gcc 的版本。gcc --vresion會(huì)有類似如下的信息輸出:gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0Copyright (C) 2017 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.這時(shí)候可以把之前一直使用的示例程序編譯一下。379首先將上面的命令保存為文件名 test.c。編譯 C 語(yǔ)言的命令如下:gcc test.c -o test這個(gè)命令的意思是將 test.c 文件名的程序源碼,編譯為名稱 test 二進(jìn)制程序。

2.5 filterNot 和 filterNotTo 操作符

從一個(gè)集合篩選出符合條件之外的元素,并以一個(gè)新集合返回,它是 filter 操作符取反操作。源碼定義public inline fun <T> Iterable<T>.filterNot(predicate: (T) -> Boolean): List<T> { return filterNotTo(ArrayList<T>(), predicate)}public inline fun <T, C : MutableCollection<in T>> Iterable<T>.filterNotTo(destination: C, predicate: (T) -> Boolean): C { for (element in this) if (!predicate(element)) destination.add(element) return destination}源碼解析實(shí)際上 filterNot 沒什么可說(shuō)的,它也是借助于 filterNotTo 操作具體,和 filterTo 唯一區(qū)別就是判斷條件取反。原理圖解使用場(chǎng)景使用場(chǎng)景就是 filter 使用的取反條件使用,當(dāng)然你也可以繼續(xù)使用 filter 操作符,并且篩選條件為取反條件。

2.3 連接線

2.3.1 基本連接線在流程圖中,不同節(jié)點(diǎn)之間需要通過(guò)連接線來(lái)描述其相關(guān)性。實(shí)例 6:基本的連接線語(yǔ)法。?```mermaidgraph LR A-->B?```其渲染結(jié)果如下:2.3.2 連接線的種類不同種類的連接線可以表示不同類型的關(guān)系,例如,無(wú)方向的連接線可用來(lái)表示相關(guān)性、有方向的連接線可以表示數(shù)據(jù)流向或者節(jié)點(diǎn)間的依賴關(guān)系;用實(shí)線表示強(qiáng)關(guān)聯(lián)、用虛線表示弱關(guān)聯(lián)等待。實(shí)例 7:無(wú)向線段連接線。?```mermaidgraph LR A --- B -- 帶文字連接線 --- C?```點(diǎn)狀連接線。?```mermaidgraph LR A -.- B -. 帶文字連接線 .-> C?```粗實(shí)連接線。?```mermaidgraph LR A ==> B == 帶文字連接線 ==> C?```

1.11 join

使用指定字符串連接輸出的列表或者字符串,就像 python 中字符串的 join() 方法。示例用法如下:{{ value|join:" // " }}假設(shè)輸入的值為['a', 'b', 'c'],那么輸出為 “a // b // c”。它的實(shí)現(xiàn)代碼如下:@register.filter(is_safe=True, needs_autoescape=True)def join(value, arg, autoescape=True): """Join a list with a string, like Python's ``str.join(list)``.""" try: if autoescape: value = [conditional_escape(v) for v in value] # 最核心的處理是使用字符串的join()方法 data = conditional_escape(arg).join(value) except TypeError: # Fail silently if arg isn't iterable. return value return mark_safe(data)

1. nil 是特殊的零值

在 Go 語(yǔ)言中,任何一個(gè)變量在聲明之后會(huì)自動(dòng)被賦予一個(gè)零值。數(shù)值類型的變量零值為0,字符串為"",而指針、切片、map、通道、函數(shù)和接口的零值就是nil。代碼示例package mainimport ( "fmt")func main() { var m map[int]string var p *int var c chan int var s []int var f func() var i interface{} fmt.Printf("map:%#v\n", m) fmt.Printf("指針:%#v\n", p) fmt.Printf("通道:%#v\n", c) fmt.Printf("切片:%#v\n", s) fmt.Printf("函數(shù):%#v\n", f) fmt.Printf("接口:%#v\n", i)}執(zhí)行結(jié)果:

2. 傳統(tǒng) TCP 客戶端和服務(wù)器建立過(guò)程

為了更好地理解編寫 TCP 客戶端和服務(wù)器程序的步驟,下圖展示了通過(guò) C 語(yǔ)言 Socket API 編寫客戶端和服務(wù)器程序的過(guò)程。圖中的矩形方框都是 C 函數(shù),很好的展示了客戶端和服務(wù)器 Socket 的建立過(guò)程。對(duì)于 Java 語(yǔ)言來(lái)說(shuō),只是應(yīng)用面向?qū)ο蟮乃季S對(duì)上面的過(guò)程進(jìn)行了抽象,下來(lái)我們就探討一下如何編寫 Java 客戶端和服務(wù)器程序。

1.10 first

該過(guò)濾器會(huì)返回輸入列表中的第一項(xiàng)。示例如下:{{ value|first }}如果是輸入的是列表 [‘a(chǎn)’, ‘b’, ‘c’],那么輸出的為 ‘a(chǎn)’。和 first 指令相反作用的過(guò)濾器為 last,對(duì)于本次輸出的結(jié)果為 ‘c’。first 和 last 過(guò)濾器的實(shí)現(xiàn)代碼如下,非常簡(jiǎn)單:@register.filter(is_safe=False)def first(value): """Return the first item in a list.""" try: return value[0] except IndexError: return '' @register.filter(is_safe=True)def last(value): """Return the last item in a list.""" try: return value[-1] except IndexError: return ''

1.1 each_key 和 each_value

對(duì)于哈希,我們還可以只迭代其值或者鍵。這里我們有2個(gè)方法,一個(gè)是each_key,一個(gè)是each_value,它們分別迭代哈希的所有鍵和所有值:實(shí)例:{a: '1', b: '2', c: '3', d: '4', e: '5'}.each_key do |key| puts "key:#{key}"end# ---- 輸出結(jié)果 ----key:a class: Symbolkey:b class: Symbolkey:c class: Symbolkey:d class: Symbolkey:e class: Symbol實(shí)例:{a: '1', b: '2', c: '3', d: '4', e: '5'}.each_value do |value| puts "value:#{value} class: #{value.class}"end# ---- 輸出結(jié)果 ----value:1 class: Stringvalue:2 class: Stringvalue:3 class: Stringvalue:4 class: Stringvalue:5 class: String

5.1 正確寫法

實(shí)例:public class ServerChatGroupHandler extends ChannelInboundHandlerAdapter { //映射關(guān)系 private static Map<Integer, Channel> map=new HashMap<Integer, Channel>(); //連接斷開,觸發(fā)該事件 @Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { //1.獲取Channel Channel channel=ctx.channel(); //2.從map里面,根據(jù)Channel找到對(duì)應(yīng)的userid Integer userid=null; for(Map.Entry<Integer, Channel> entry : map.entrySet()){ Integer uid=entry.getKey(); Channel c=entry.getValue(); if(c==channel){ userid=uid; } } //3.如果userid不為空,則需要做以下處理 if(userid!=null){ //3.1.刪除映射 map.remove(userid); //3.2.移除標(biāo)識(shí) ctx.channel().attr(AttributeKey.valueOf("userid")).remove(); } }}

4.1 語(yǔ)法

要對(duì)齊 infile.apk 并將其保存為 outfile.apk,請(qǐng)運(yùn)行以下命令:zipalign [-f] [-v] <alignment> infile.apk outfile.apk要確認(rèn) existing.apk 的對(duì)齊方式,請(qǐng)運(yùn)行以下命令:zipalign -c -v <alignment> existing.apkalignment 是一個(gè)整數(shù),用于定義字節(jié)對(duì)齊邊界。此值必須始終為 4(可提供 32 位對(duì)齊),否則實(shí)際將不會(huì)執(zhí)行任何操作。標(biāo)記:-f:覆蓋現(xiàn)有的 outfile.zip-v:詳細(xì)輸出-p:outfile.zip 應(yīng)對(duì) infile.zip 中的所有共享對(duì)象文件使用相同的頁(yè)面對(duì)齊方式-c:確認(rèn)給定文件的對(duì)齊方式

Lambda 表達(dá)式簡(jiǎn)介

大家好,今天我們開始一個(gè)新專題 —— Java Lambda 表達(dá)式。這是在 Java 8 中出現(xiàn)的一個(gè)新特性,但它并不是 Java 獨(dú)有的,JavaScript、C#、C++ 等在 Java 8 之前就支持 Lambda 表達(dá)式的特性,現(xiàn)在的大多數(shù)程序語(yǔ)言也都支持 Lambda 表達(dá)式。這個(gè)專題中我們學(xué)習(xí)函數(shù)式編程的概念、Lambda 表達(dá)式的語(yǔ)法、以及如何在我們的代碼中使用 Lambda 表達(dá)式。本文我們主要先介紹下 Lambda 表達(dá)式是什么?

6.1 字符串的值

Kotlin 有兩種類型的字符串字面值:轉(zhuǎn)義字符串可以有轉(zhuǎn)義字符, 以及原始字符串可以包含換行以及任意文本。以下是轉(zhuǎn)義字符串的一個(gè)示例:val s = "Hello, world!\n"轉(zhuǎn)義采用傳統(tǒng)的反斜杠方式。字符串使用三個(gè)引號(hào)(""")分界符括起來(lái),內(nèi)部沒有轉(zhuǎn)義并且可以包含換行以及任何其他字符:val text = """ for (c in "foo") print(c)"""還可以通過(guò) trimMargin() 函數(shù)去除前導(dǎo)空格:val text = """ |Tell me and I forget. |Teach me and I remember. |Involve me and I learn. |(Benjamin Franklin) """.trimMargin()

2. 區(qū)分父組件、子組件

父組件、子組件是一對(duì)相對(duì)的名詞,只是為了來(lái)更方便的區(qū)分組件,一個(gè)組件既可以是父組件,也可以是子組件。比如某個(gè)頁(yè)面組件A引入一個(gè)自定義組件B,其中這個(gè)頁(yè)面組件A就是父組件,引入的這個(gè)自定義組件B就是子組件。如果這個(gè)自定義組件B中還引入了另外一個(gè)自定義組件C,那么自定義組件B就是自定義組件C的父組件,自定義組件C就是自定義組件B的子組件??赡芪淖植惶美斫?,下面我們來(lái)舉個(gè)實(shí)際開發(fā)中的例子。上一小節(jié)我們創(chuàng)建了一個(gè)自定義登錄彈窗組件 login.vue,并在首頁(yè) index.vue 文件中引用了這個(gè)組件。其中index.vue 就是父組件,而被引用的登錄彈窗組件 login.vue 就是子組件。

2. 實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型

創(chuàng)建生產(chǎn)者線程和消費(fèi)者線程,使用一個(gè)共享隊(duì)列連接這兩個(gè)線程,代碼如下:import threadingimport queueq = queue.Queue()導(dǎo)入 threading 模塊和 queue 模塊創(chuàng)建共享隊(duì)列 qdef produce(): for item in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']: q.put(item) print('produce %s' % item)創(chuàng)建生產(chǎn)者線程的入口函數(shù) produce生產(chǎn)者生產(chǎn) 8 個(gè)數(shù)據(jù)調(diào)用 q.put(item) 將生產(chǎn)的數(shù)據(jù)放入到共享隊(duì)列 q 中def consume(): for i in range(8): item = q.get() print(' consume %s' % item)創(chuàng)建消費(fèi)者線程的入口函數(shù) consume消費(fèi)者消費(fèi) 8 個(gè)數(shù)據(jù)調(diào)用 q.get() 從共享隊(duì)列 q 中取走數(shù)據(jù)producer = threading.Thread(target=produce, args=())consumer = threading.Thread(target=consume, args=())producer.start()consumer.start()producer.join()consumer.join()創(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 aproduce c consume b consume cproduce d consume dproduce e consume eproduce f consume fproduce g consume gproduce h consume h生產(chǎn)者生產(chǎn)了 8 個(gè)數(shù)據(jù):a、b、c、d、e、f、g、h消費(fèi)者取走了 8 個(gè)數(shù)據(jù):a、b、c、d、e、f、g、h

3.4 服務(wù)端代碼實(shí)現(xiàn)

3.4.1 Pipeline 管理鏈表.childHandler(new ChannelInitializer<NioSocketChannel>() { protected void initChannel(NioSocketChannel ch) { //1.拆包器 ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,5,4)); //2.自定義解碼器 ch.pipeline().addLast(new MyDecoder()); //3.業(yè)務(wù)Handler ch.pipeline().addLast(new ServerChatHandler()); //4.自定義編碼器 ch.pipeline().addLast(new MyEncoder()); }});3.4.2 業(yè)務(wù) Handlerpublic class ServerChatHandler extends ChannelInboundHandlerAdapter{ //1.定義一個(gè)Map(key是用戶ID,value是連接通道) private static Map<Integer, Channel> map=new HashMap<Integer, Channel>(); @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if(msg instanceof LoginReqBean){ //1.登錄請(qǐng)求 login((LoginReqBean) msg,ctx.channel()); }else if(msg instanceof MsgReqBean){ //2.發(fā)送消息請(qǐng)求 sendMsg((MsgReqBean)msg,ctx.channel()); } } //登錄處理方法 private void login(LoginReqBean bean, Channel channel){ LoginResBean res=new LoginResBean(); //從map里面根據(jù)用戶ID獲取連接通道 Channel c=map.get(bean.getUserid()); if(c==null){ //通道為空,證明該用戶沒有在線 //1.添加到map map.put(bean.getUserid(),channel); //2.給通道賦值 channel.attr(AttributeKey.valueOf("userid")).set(bean.getUserid()); //3.響應(yīng) res.setStatus(0); res.setMsg("登錄成功"); res.setUserid(bean.getUserid()); channel.writeAndFlush(res); }else{ //通道不為空,證明該用戶已經(jīng)在線了 res.setStatus(1); res.setMsg("該賬戶目前在線"); channel.writeAndFlush(res); } } //消息發(fā)送處理方法 private void sendMsg(MsgReqBean bean,Channel channel){ Integer touserid=bean.getTouserid(); Channel c=map.get(touserid); if(c==null){ MsgResBean res=new MsgResBean(); res.setStatus(1); res.setMsg(touserid+",不在線"); channel.writeAndFlush(res); }else{ MsgRecBean res=new MsgRecBean(); res.setFromuserid(bean.getFromuserid()); res.setMsg(bean.getMsg()); c.writeAndFlush(res); } }}

1.20 slice

類似于 python 列表的 slice() 方法。示例如下:{# 相當(dāng)于some_list[:2] #}{{ some_list|slice:":2" }}假設(shè)輸入列表 [‘a(chǎn)’, ‘b’, ‘c’],那么上述結(jié)果輸出 [‘a(chǎn)’, ‘b’]。

2. Redis底層數(shù)據(jù)結(jié)構(gòu)

面試官提問(wèn): 你有看過(guò) Redis 源碼嗎?Redis 底層是用什么數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的?題目解析:這里談到的數(shù)據(jù)結(jié)構(gòu)不是 Redis 的五種對(duì)外基本數(shù)據(jù)結(jié)構(gòu):String(字符串類型)、Hash(哈希類型)、List(鏈表類型)、Set(集合類型)、ZSet(有序集合類型),而是更為底層的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),例如雙向鏈表、字典、壓縮列表等。Redis 底層是用標(biāo)準(zhǔn) C 語(yǔ)言編寫的,下面我們會(huì)結(jié)合 C 代碼分析。

1. 為什么需要分支結(jié)構(gòu)

分支結(jié)構(gòu)作為 C 語(yǔ)言結(jié)構(gòu)中流控制的一種結(jié)構(gòu),應(yīng)用極其廣泛。C 語(yǔ)言中的分支主要由 if 語(yǔ)句組成,這是一個(gè)大類,除此之外還有 switch 語(yǔ)句。分支語(yǔ)句控制著程序在遇到不同條件的時(shí)候,可以根據(jù)條件判斷來(lái)執(zhí)行不同的語(yǔ)句。使得程序不再是從頭到尾的順序執(zhí)行。這就如同人類在面對(duì)不同問(wèn)題需要做出不同的選擇一樣,你的選擇決定了接下來(lái)要進(jìn)行的行動(dòng)。

3. 字符串的初始化

字符串的初始化可以直接使用雙引號(hào)的方式,也可以遵循數(shù)組初始化的方式,但是,有一點(diǎn)特別。就是在使用單個(gè)字符逐個(gè)賦值的時(shí)候,最后一個(gè)元素一定是 \0 ,而且最需要注意的是,數(shù)組的容量一定要比你實(shí)際存儲(chǔ)的字符的數(shù)量多一,因?yàn)槟阋米詈笠晃粊?lái)存儲(chǔ) \0 。char a[] = "We are family.";char b[5] = "abcd";char c[5] = {'a', 'b', 'c', 'd', '\0'}; // 請(qǐng)注意這個(gè)初始化方式,和之前的數(shù)組初始化方式一致。

4.2 如何使用

因?yàn)橛写a塊的提示功能,我們寫css通常只用寫幾個(gè)字母即可按下Tab補(bǔ)全。css相關(guān)c -> color:b -> background: z -> z-index: ...

3.3 參數(shù)為字符串

values() 傳入的對(duì)象如果是一個(gè)字符串時(shí),則會(huì)把字符拆成數(shù)組中的單個(gè)項(xiàng),如下:Object.values('abc') // ['a', 'b', 'c']

C 語(yǔ)言中的 if 語(yǔ)句

這節(jié)課我們來(lái)學(xué)習(xí)下程序中另外一個(gè)非常重要的語(yǔ)句:if。

2.1 Python 的歷史

Python 的創(chuàng)始人為荷蘭人 Guido van Rossum。1982年,Guido 從阿姆斯特丹大學(xué)(University of Amsterdam)獲得了數(shù)學(xué)和計(jì)算機(jī)碩士學(xué)位。Python 的創(chuàng)始人 Guido van Rossum 在80年代,個(gè)人電腦的配置很低,比如早期的 Macintosh,只有 8MHz 的 CPU 主頻和 128KB 的 RAM。為了增進(jìn)程序的運(yùn)行效率,程序語(yǔ)言也迫使程序員像計(jì)算機(jī)一樣思考,以便能寫出充分利用計(jì)算機(jī)性能的程序。Guido 使用 C 語(yǔ)言的過(guò)程中,感受到 C 語(yǔ)言的開發(fā)效率很低,需要耗費(fèi)大量的時(shí)間編寫 C 程序。他的另一個(gè)選擇是 Shell。 Shell 是 UNIX 操作系統(tǒng)提供的腳本語(yǔ)言。UNIX 的管理員常常用 Shell 去寫一些簡(jiǎn)單的腳本,以進(jìn)行一些系統(tǒng)維護(hù)的工作,比如定期備份。Shell 可以像膠水一樣,將 UNIX 下的許多功能連接在一起。許多 C 語(yǔ)言下上百行的程序,在 Shell 下只用幾行就可以完成。Shell 的本質(zhì)是調(diào)用命令來(lái)完成復(fù)雜的功能,它缺乏編程語(yǔ)言的若干重要特性。例如,Shell 缺乏復(fù)雜的數(shù)據(jù)結(jié)構(gòu):列表、字典、結(jié)構(gòu)體,因此不適用于實(shí)現(xiàn)復(fù)雜的功能。Guido 希望有一種語(yǔ)言,這種語(yǔ)言能夠像 C 語(yǔ)言那樣,具備完整的編程語(yǔ)言特性,又可以像 Shell 那樣,具有很高的開發(fā)效率。1989 年圣誕節(jié)期間,在阿姆斯特丹,Guido 為了打發(fā)圣誕節(jié)的無(wú)趣,決心開發(fā)一個(gè)新的程序語(yǔ)言 Python。Guido 將 Python(大蟒蛇)作為該編程語(yǔ)言的名字,是取自英國(guó) 20 世紀(jì) 70 年代首播的電視喜劇《蒙提.派森的飛行馬戲團(tuán)》(Monty Python’s Flying Circus),因此 Python 語(yǔ)言的 logo 是一條蟒蛇。Python 語(yǔ)言的 logo1991 年,第一個(gè) Python 解釋器誕生,它是用 C 語(yǔ)言實(shí)現(xiàn)的,又被稱為 CPython。Python 從一開始就具有良好的可擴(kuò)展性,可以用 C 語(yǔ)言編寫模塊,在 Python 程序中使用這些使用 C 語(yǔ)言開發(fā)的模塊。1999 年,Guido 向 DARPA 提交了一條名為 “Computer Programming for Everybody” 的資金申請(qǐng),并在后來(lái)說(shuō)明了他對(duì) Python 的目標(biāo):一門簡(jiǎn)單直觀的語(yǔ)言并與主要競(jìng)爭(zhēng)者一樣強(qiáng)大開源,以便任何人都可以為它做貢獻(xiàn)代碼像純英語(yǔ)那樣容易理解適用于短期開發(fā)的日常任務(wù)這些想法中的基本都已經(jīng)成為現(xiàn)實(shí),Python 已經(jīng)成為一門流行的編程語(yǔ)言。

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

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

幫助反饋 APP下載

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

公眾號(hào)

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