numpy.inner() 函數(shù)返回一維數(shù)組的向量?jī)?nèi)積。對(duì)于更高的維度,它返回最后一個(gè)軸上的元素乘積之和。案例對(duì)大小為 3×2 的矩陣 B、C,求其內(nèi)積:np.inner(B, C)out: array([[ 55, 121, 187], [121, 275, 429], [187, 429, 671]])上述內(nèi)積的計(jì)算過(guò)程為:[ 11*1+22*2=55, 11*3+22*4=121, 11*5+22*6=187 33*1+44*2=121, 33*3+44*4=275, 33*5+44*6=429 55*1+66*2=187, 55*3+66*4=429, 55*5+66*6=671]
以本小節(jié)所有數(shù)據(jù)全部連接查詢?yōu)槔篠ELECT * FROM student a LEFT JOIN student_course b ON a.id=b.student_id RIGHT JOIN course c ON b.course_id=c.id INNER JOIN teacher d ON c.teacher_id=d.id;執(zhí)行結(jié)果如下圖:Tips:多表混合連接查詢時(shí),后面可以把前面執(zhí)行的結(jié)果集整體當(dāng)成一個(gè)表,例如 SELECT * FROM student a LEFT JOIN student_course b ON a.id=b.student_id RIGHT JOIN course c ON b.course_id=c.id 可以理解為 student 和 student_course 左連接查詢之后的結(jié)果集再對(duì) course 右連接查詢。
為文檔 info.docx 設(shè)置頁(yè)眉,代碼如下:from docx import Documentdocument = Document("C:/info.docx") header = document.sections[0].header # 獲取第一個(gè)節(jié)的頁(yè)眉header.add_paragraph('這是第一節(jié)的頁(yè)眉')document.save('C:/info.docx')代碼解釋:代碼中首先讀取上一小節(jié)中完成的 info.docx 文檔,加載完成后,獲取文檔中 sections 部分,索引為 0 即獲取第一部分,根據(jù) header 屬性獲取頁(yè)眉,在頁(yè)眉插入段落。運(yùn)行后,info.docx 文檔的頁(yè)眉效果如下圖所示。
要使用send將參數(shù)發(fā)送給方法,我們需要在方法名稱后指定參數(shù)。我們可以放多少東西沒(méi)有限制。實(shí)例:class ParametersTest def method_with_positional_parameter(a) p a end def method_with_few_positional_parameters(a,b,c) p a,b,c end def method_with_infinity_args(*a) p a end def method_with_keyword_parameter(keyword_parameter:) p keyword_parameter endendtest = ParametersTest.new test.send(:method_with_positional_parameter, "Hello!")test.send(:method_with_few_positional_parameters, "Hi!", "Hello!", "Hola!")test.send(:method_with_infinity_args, "first", "second", "third")test.send(:method_with_keyword_parameter, keyword_parameter: "keywooord parameter")# ---- 輸出結(jié)果 ----"Hello!""Hi!""Hello!""Hola!"["first", "second", "third"]"keywooord parameter"我們可以看到,傳遞塊沒(méi)有什么區(qū)別,在兩種情況下,我們收到的結(jié)果都是相同的。
程序是由一個(gè)個(gè)函數(shù)組成的。我們之前雖然沒(méi)有正式介紹函數(shù),但是我們?cè)缫呀?jīng)開始使用函數(shù)了。因?yàn)殡x開了函數(shù),我們的程序沒(méi)有辦法正常的工作。只不過(guò)我們使用的是 C 語(yǔ)言內(nèi)置的標(biāo)準(zhǔn)函數(shù)庫(kù)。那么函數(shù)是什么?函數(shù)是由一組語(yǔ)句組成完成至少一個(gè)特定任務(wù)的語(yǔ)句的集合。在 C 語(yǔ)言中,我們必須要包含一個(gè)函數(shù),就是我們最開始介紹的 mian 函數(shù)。
CSV 文件,全稱叫做“逗號(hào)分隔值文件”,文件后綴為“.csv”,它是一種表格文件;與 Excel 等文件不同的是,它是以純文本表示的表格文件,而單元格之間用逗號(hào)分隔,因此被稱作逗號(hào)分隔值文件。CSV 文件大體可以分為兩個(gè)部分:列名部分;數(shù)據(jù)部分。比如以下CSV文件: a b c # 列名部分0 1 'a' 89 # 數(shù)據(jù)部分1 3 'f' 882 8 'g' 99該 CSV 文件一共包含三條數(shù)據(jù),每條數(shù)據(jù)包括 a、b、c 三個(gè)字段,而其中 a 和 c 字段是整數(shù),而 b 字段是字符串。在實(shí)際的應(yīng)用之中,一般的 CSV 數(shù)據(jù)會(huì)包含很多冗余的數(shù)據(jù),我們會(huì)根據(jù)自己的需要來(lái)選擇我們所需要的數(shù)據(jù)字段,從而進(jìn)行下一步的工作。
一個(gè)應(yīng)用程序,當(dāng)功能越來(lái)越龐大、邏輯越來(lái)越復(fù)雜、代碼越來(lái)越多時(shí),必然會(huì)采用分而治之的方案。分,容易,如何分才能分得清晰、便于維護(hù),這是一個(gè)與管理有關(guān)的學(xué)問(wèn)。MVC 提出了一種分離的策略,這種想法或思想一問(wèn)世,便讓世人茅塞頓開。MVC 的分離思想:把整個(gè)應(yīng)用程序中和用戶進(jìn)行交互的功能代碼歸納在一起,這部分代碼整體稱為 V (View 或叫視圖層);把專門用來(lái)進(jìn)行數(shù)據(jù)傳遞或數(shù)據(jù)邏輯處理的功能代碼歸納在一起,稱其為 M(Model 或叫l(wèi)模型層)。C 指的是哪一部分功能代碼呢?因?yàn)閂 和 M 是要經(jīng)常交流、溝通的,V 需要展示 M 處理過(guò)的數(shù)據(jù),同時(shí),M 也可能需要 V 提供的用戶交互時(shí)輸入的數(shù)據(jù)。雖然分了,但兩者之間存在依賴關(guān)系。我們不讓 V 和 M 直接交流,而是在兩者之間引入了一個(gè)叫做 C(控制器)的對(duì)象,所以說(shuō) C 就是 V 和 M 之間的橋梁!這個(gè) C(控制器)對(duì)象感覺(jué)在硬生生的拆散別人,不過(guò)這種拆分是善意且友好的。為什么這么說(shuō)?滿足 OOP 中的低耦合性原則,解耦 V 和 M 之間的關(guān)系;M 需要用戶交互時(shí)輸入的數(shù)據(jù)時(shí),可以不用管 V 是誰(shuí),只要有控制器傳數(shù)據(jù)就可以;同時(shí),V 也不用關(guān)心 M 在哪里,只要有數(shù)據(jù)提供給自己就可以。如果現(xiàn)在要編寫一個(gè) WEB 視圖和 Swing 視圖的雙客戶端應(yīng)用程序時(shí),只需要換一個(gè) C 就可以,M 可以重用。
Array.from() 在傳入字符串時(shí),會(huì)把字符串的每一項(xiàng)都拆成單個(gè)的字符串作為數(shù)組中的一項(xiàng)。Array.from('imooc'); // [ "i", "m", "o", "o", "c" ]
在每個(gè) C 語(yǔ)言程序中都需要包含一個(gè) main 函數(shù)。這是程序的主體,每個(gè)可以單獨(dú)執(zhí)行的 C 語(yǔ)言程序都要有一個(gè) mian 函數(shù)作為程序的入口程序,如同每個(gè)建筑物都會(huì)有一個(gè)主要的出入口一樣。這個(gè)函數(shù)由函數(shù)名后的一對(duì)圓括號(hào),以及在圓括號(hào)后面的一對(duì)大括號(hào),和包含在大括號(hào)內(nèi)的一組程序代碼構(gòu)成。這個(gè)圓括號(hào)中可以放置需要在程序啟動(dòng)時(shí)傳入 main 函數(shù)的參數(shù)。可以是一個(gè),或者多個(gè)參數(shù)。而在這之后的大括號(hào)中的部分,就是這個(gè)程序的主體部分。里面是可以執(zhí)行的程序語(yǔ)句或者注釋等相關(guān)內(nèi)容。Tips:按照 C 語(yǔ)言的國(guó)際標(biāo)準(zhǔn),這個(gè)函數(shù)是有一個(gè)返回值的,而且類型只能是 int 類型。但是在一些舊的書籍中,會(huì)有 void 的返回類型寫法。這個(gè)寫法在我目前遇到的編譯器中不會(huì)有問(wèn)題。但是切記,這不是 C 語(yǔ)言標(biāo)準(zhǔn)寫法,在某些新的編譯器中會(huì)產(chǎn)生錯(cuò)誤。程序是一個(gè)需要極其遵守規(guī)則的領(lǐng)域,小聰明總會(huì)付出沉重的代價(jià)。
Android Studio 的編輯器基于 IntelliJ IDEA 而來(lái),可同時(shí)支持 Kotlin,Java和C / C ++ 語(yǔ)言,提供了基本補(bǔ)全、智能補(bǔ)全和語(yǔ)句補(bǔ)全功能,還支持創(chuàng)建自定義代碼補(bǔ)全模板。Android Studio 提供了一個(gè)名為 Lint 的代碼掃描工具,可幫助你發(fā)現(xiàn)并更正代碼結(jié)構(gòu)質(zhì)量的問(wèn)題,而無(wú)需執(zhí)行應(yīng)用或編寫測(cè)試。每次編譯你的應(yīng)用時(shí),Android Studio 都會(huì)運(yùn)行 Lint 來(lái)檢查你的源文件是否有潛在的錯(cuò)誤,以及在正確性、安全性、性能、易用性、無(wú)障礙性和國(guó)際化方面是否需要優(yōu)化改進(jìn)。
創(chuàng)建生產(chǎn)者、計(jì)算者、消費(fèi)者線程:生產(chǎn)者生產(chǎn) 8 個(gè)數(shù)據(jù)計(jì)算者對(duì)生產(chǎn)者輸出的數(shù)據(jù)進(jìn)行加工,將加工后的數(shù)據(jù)送往消費(fèi)者消費(fèi)者取走計(jì)算者輸出的數(shù)據(jù)import threadingimport queueq0 = queue.Queue()q1 = queue.Queue()導(dǎo)入模塊 threading 和模塊 queue使用兩個(gè)共享隊(duì)列連接這三個(gè)線程共享隊(duì)列 q0 連接生產(chǎn)者和計(jì)算者共享隊(duì)列 q1 連接計(jì)算者和消費(fèi)者def produce(): for item in ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']: q0.put(item) print('produce %s' % item)創(chuàng)建生產(chǎn)者線程的入口函數(shù) produce生產(chǎn)者生產(chǎn) 8 個(gè)數(shù)據(jù)調(diào)用 q0.put(item) 將生產(chǎn)的數(shù)據(jù)放入到共享隊(duì)列 q0 中def compute(): for i in range(8): item = q0.get() item = item.upper() q1.put(item)創(chuàng)建計(jì)算者線程的入口函數(shù) compute調(diào)用 q0.get() 讀取生產(chǎn)者輸出數(shù)據(jù),并進(jìn)行加工調(diào)用 q1.put(item) 將加工后的數(shù)據(jù)放入到共享隊(duì)列 q1 中def consume(): for i in range(8): item = q1.get() print(' consume %s' % item)創(chuàng)建消費(fèi)者線程的入口函數(shù) consume消費(fèi)者消費(fèi) 8 個(gè)數(shù)據(jù)調(diào)用 q1.get() 從共享隊(duì)列 q1 中取走數(shù)據(jù)producer = threading.Thread(target=produce, args=())computer = threading.Thread(target=compute, args=())consumer = threading.Thread(target=consume, args=())producer.start()computer.start()consumer.start()producer.join()computer.join()consumer.join()創(chuàng)建生產(chǎn)者線程 producer,線程入口為 produce創(chuàng)建計(jì)算者線程 computer,線程入口為 compute創(chuàng)建消費(fèi)者線程 consumer,線程入口為 consume啟動(dòng)生產(chǎn)者線程、計(jì)算者線程、消費(fèi)者線程,并等待它們結(jié)束運(yùn)行程序,輸出結(jié)果如下:produce aproduce bproduce c consume Aproduce dproduce e consume Bproduce f consume Cproduce g consume Dproduce h consume E consume F consume G consume H生產(chǎn)者生產(chǎn)了 8 個(gè)數(shù)據(jù):a、b、c、d、e、f、g、h計(jì)算者將數(shù)據(jù)加工為:A、B、C、D、E、F、G、H消費(fèi)者取走了 8 個(gè)數(shù)據(jù):A、B、C、D、E、F、G、H
修改單個(gè)數(shù)據(jù)值,是通過(guò)查詢函數(shù)獲取到某個(gè)數(shù)據(jù),然后修改這個(gè)數(shù)據(jù)的內(nèi)容,可以用函數(shù) at[]、iat[]、loc[]、iloc[],但要注意不同的函數(shù)所傳遞參數(shù)的不同,下面我們列舉這四個(gè)函數(shù)的不同之處:函數(shù)說(shuō)明loc[]只能使用標(biāo)簽索引,不能使用整數(shù)索引,通過(guò)標(biāo)簽索引切邊進(jìn)行篩選時(shí)iloc[]只能使用整數(shù)索引,不能使用標(biāo)簽索引,通過(guò)整數(shù)索引切邊進(jìn)行篩選時(shí)at[]只能使用標(biāo)簽索引,使用時(shí)必須輸入兩個(gè)參數(shù),即行索引和列索引iat[]只能使用整數(shù)索引,使用時(shí)必須輸入兩個(gè)參數(shù),即行索引和列索引雖然四種函數(shù)都能獲取單個(gè)數(shù)據(jù)值,進(jìn)而進(jìn)行修改,但從運(yùn)行速度上四種方法從高到底分別為: iat[]、at[]、iloc[]、loc[],這里我們選擇 iat[] 演示對(duì)單個(gè)數(shù)據(jù)值的修改操作:# 導(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# 這里我們對(duì) 第2行,第3列進(jìn)行數(shù)據(jù)修改data.iat[1,2]=3432print(data)# --- 輸出結(jié)果 ---編程語(yǔ)言 推出時(shí)間 價(jià)格 主要?jiǎng)?chuàng)始人0 java 1995年 45.6 James Gosling1 python 1991年 3432.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ò) iat[] 對(duì)第2行,第3列數(shù)據(jù)進(jìn)行修改,通過(guò)輸出結(jié)果可看到原數(shù)據(jù)值為67.0,這里被修改3432.0
對(duì) URL 中的特殊字符進(jìn)行轉(zhuǎn)義。示例如下:{{ value|urlencode }}假設(shè) value 值 為 https://www.example.org/foo?a=b&c=d", 上述過(guò)濾結(jié)果為: "https%3A//www.example.org/foo%3Fa%3Db%26c%3Dd"。
在條件類型 T extends U ? X : Y 中,當(dāng)泛型參數(shù) T 取值為 A | B | C 時(shí),這個(gè)條件類型就等價(jià)于 (A extends U ? X : Y) | (B extends U ? X : Y) | (C extends U ? X : Y),這就是可分配條件類型。可分配條件類型(distributive conditional type)中被檢查的類型必須是裸類型參數(shù)(naked type parameter)。裸類型表示沒(méi)有被包裹(Wrapped) 的類型,(如:Array<T>、[T]、Promise<T> 等都不是裸類型),簡(jiǎn)而言之裸類型就是未經(jīng)過(guò)任何其他類型修飾或包裝的類型。
下面列舉 tar 命令的參數(shù):tar 命令參數(shù)名稱功能與作用描述-c新建立壓縮檔案-x解壓縮-t查看內(nèi)容-u更新原壓縮包的內(nèi)容-zgzip 屬性的-jbz2 屬性的-Zcompress 屬性的-v顯示所有過(guò)程-O將文件解壓縮成標(biāo)準(zhǔn)輸出形式-f使用檔案名字,此參數(shù)都是在最后,其后面跟上一個(gè)檔案的名字Tips:其中 -c、-x、-t、-u 這五個(gè)參數(shù)是獨(dú)立的,每次使用選其中一個(gè),-f 是最后一個(gè)參數(shù),后面跟上檔案名。
C 語(yǔ)言作為一種靜態(tài)語(yǔ)言,在變量使用之前,要確定變量的類型,用來(lái)分配在內(nèi)存中所需要占用的空間。C 語(yǔ)言的類型包含了有符號(hào)型和無(wú)符號(hào)型兩大類。有符號(hào)類型可以表示復(fù)數(shù)。而無(wú)符號(hào)類型只能表示從 0 開始的數(shù)值。不同的計(jì)算機(jī)硬件體系結(jié)構(gòu),使得數(shù)值的表示范圍會(huì)發(fā)生變化。對(duì)于數(shù)值范圍敏感的程序,一定要處理好變量類型,防止數(shù)值過(guò)大造成程序錯(cuò)誤。
Python 程序訪問(wèn)變量時(shí),按照如下規(guī)則查找變量:在局部命名空間中,查找變量如果找不到,則在全局命名空間中,查找變量如果找不到,則在內(nèi)置命名空間中,查找變量如果找不到,則拋出 NameError 異常下面的例子演示了查找順序:a = 1b = 2def function(c, d): e = 5 f = 6 訪問(wèn)某個(gè)變量function(3, 4) 程序包含了 3 個(gè)命名空間內(nèi)置命名空間,包括: max、min、abs 等內(nèi)置函數(shù)全局命名空間,包括:a、b、function局部命名空間,包括:c、d、e、f在第 7 行,訪問(wèn)某個(gè)變量如果訪問(wèn)的變量是 c,則能在局部命名空間中找到如果訪問(wèn)的變量是 a,則能在全部命名空間中找到如果訪問(wèn)的變量是 max,則能在內(nèi)置命名空間中找到如果訪問(wèn)的變量是 x,在以上三個(gè)命名空間中查找不到,拋出異常 NameError
Go 語(yǔ)言可以直接編譯成主流操作系統(tǒng)支持的可執(zhí)行文件,部署服務(wù)只需要扔一個(gè)可執(zhí)行文件上去直接運(yùn)行就好了;Go 語(yǔ)言有不輸于動(dòng)態(tài)語(yǔ)言的豐富靜態(tài)庫(kù)。歸功于強(qiáng)大的官方團(tuán)隊(duì)和社區(qū),目前 Go 語(yǔ)言幾乎什么都可以開發(fā);Go 語(yǔ)言天生支持并發(fā),這是個(gè)近乎無(wú)敵的設(shè)定;Go 語(yǔ)言具有自動(dòng)垃圾回收機(jī)制;Go 語(yǔ)言簡(jiǎn)單易學(xué),因?yàn)樗鼛缀踔С殖S玫恼Z(yǔ)言的所有特性:繼承、封裝等等;Go 語(yǔ)言內(nèi)嵌支持 C 語(yǔ)言,你甚至可以直接在 Go 語(yǔ)言里面寫 C 語(yǔ)言代碼;Go 語(yǔ)言支持交叉編譯,你可以在 Windows 環(huán)境中編譯任何平臺(tái)的 Go 可執(zhí)行程序。但是需要注意的是,如果你在 Go 程序中寫了 C 語(yǔ)言,你就不能只用交叉編譯的特性了,所謂魚和熊掌不可兼得嘛。
我們也許常常聽(tīng)到一句口號(hào) ——“一次編譯,到處執(zhí)行(write once, run anywhere.)”,這里說(shuō)的就是 Java 的跨平臺(tái)性,我們首先來(lái)看下在 c 或 c++ 中,代碼是如何在不同平臺(tái)運(yùn)行的:在 c 或 c++ 中,我們首先要將源代碼文件編譯為機(jī)器代碼文件,然后再去執(zhí)行它。這個(gè)過(guò)程中,機(jī)器代碼文件必須在為其編譯的平臺(tái)才能執(zhí)行(這里的平臺(tái)指的是 Windows、Linux、Mac OS 等),也就是說(shuō),我們的代碼如果希望在多個(gè)平臺(tái)執(zhí)行,那就必須多次編譯程序。這不僅給程序員帶來(lái)了繁瑣的開發(fā)步驟(代碼稍做變更就要重新編譯整個(gè)程序),也給程序帶來(lái)了更大的漏洞風(fēng)險(xiǎn)。當(dāng)代碼已經(jīng)編譯為可執(zhí)行文件時(shí),這個(gè)可執(zhí)行文件不能動(dòng)態(tài)更改,此時(shí)需要更改代碼重新編譯,以替換舊的可執(zhí)行文件。我們來(lái)看看 Java 是如何做的吧:Java 的思想是,將代碼編譯為中間語(yǔ)言,中間語(yǔ)言是字節(jié)碼,解釋器是 Java 虛擬機(jī)(JVM)。字節(jié)碼文件可以通用,JVM 是特定于平臺(tái)的。如下圖所示:每一個(gè)平臺(tái)都需要一個(gè) JVM ,這里 JVM 是實(shí)現(xiàn) “到處執(zhí)行” 的關(guān)鍵前提,所以,在 Java 中,我們只需要生成一個(gè)字節(jié)碼文件,就可以保證我們編寫的程序在任何平臺(tái)都能運(yùn)行了。
下面我們通過(guò)實(shí)際的程序來(lái)看看這些算數(shù)運(yùn)算符是怎么應(yīng)用的。385顯示結(jié)果:a=1, b=2, c=0, f=4, g=3a+b=3a-b=-1a*b=2a/b=0, inth/i=0.500000, floatf/g=1, intj/k=1.333333, floata%b=1b%a=0c=++e,c=11, e=11c=e++,c=10, e=11c=--e,c=9, e=9c=e--,c=10, e=9可以看到,在 C 語(yǔ)言中對(duì)于加法,減法和乘法,與我們平時(shí)算數(shù)中所見(jiàn)的結(jié)果是一致的。除法就要分兩種情況來(lái)討論了。從上面的例子可以看出,當(dāng)除數(shù)和被除數(shù)都是整數(shù)的時(shí)候,他們的結(jié)果會(huì)是整數(shù)。這時(shí)的結(jié)果就是兩者相除的結(jié)果的數(shù)字的整數(shù)部分。在例子中,1/2=0, 4/3=1 ,因?yàn)?1/2 = 0.5 所以整數(shù)部分就是 0 , 4/3 ≈ 1.33333 ,所以整數(shù)部分就是 1 。而在除法中,如果被除數(shù)或者除數(shù)兩者其中有一個(gè)是浮點(diǎn)數(shù),那么這時(shí)顯示的結(jié)果就與我們?cè)谄胀ㄋ銛?shù)中得到的結(jié)果就一致了。但是有一點(diǎn)就是計(jì)算機(jī)不會(huì)顯示循環(huán)小數(shù),就是不能用符號(hào)表示無(wú)限小數(shù)位,所以,只能在顯示的精度范圍內(nèi)截取。所以這里我們看到的就是 1.333333 。模除或者叫做取余的操作就是獲取不能被整數(shù)的剩余的整數(shù)部分。這個(gè)和數(shù)學(xué)中的規(guī)定是一致的。++ 和 -- 分別叫做自加和自減。其本身的作用都是將自己本身數(shù)值加一或者減一。這是一個(gè)只需要一個(gè)變量就可以完成的運(yùn)算,因此大家有時(shí)候也叫這種運(yùn)算為一元運(yùn)算。從示例程序中可以看出,這兩種運(yùn)算符的擺放位置是有兩種的,也就是可以放在變量前,也可以放在變量后。如果只是單獨(dú)執(zhí)行自加和自減,而沒(méi)有同時(shí)有賦值的情況發(fā)生,那么自加和自減的符號(hào)放在前后都是沒(méi)有差異的,大家可以從變量的顯示出來(lái)的數(shù)值看出其都是發(fā)生了加一或者減一的變化的。但是,重點(diǎn)是:當(dāng)我們配合賦值語(yǔ)句使用的時(shí)候,這兩種位置,前置與后置,就會(huì)產(chǎn)生不同的賦值效果。當(dāng)自加與自減前置的時(shí)候,賦值語(yǔ)句獲得的是自加或者自減完成后的數(shù)值;當(dāng)自加與自減后置的時(shí)候,賦值語(yǔ)句獲得的是自加或者自減之前的原始數(shù)值。這點(diǎn)一定要特別小心,以免引起錯(cuò)誤。
os.path.basename 的功能是獲取路徑名中的文件名,該函數(shù)的使用示例:>>> import os>>> os.basename('C:\\Windows\\Readme.txt')'Readme.txt'
具體實(shí)現(xiàn) shell 腳本#!/bin/bash# Description: count file scripts# Auth: kaliarch# Email: kaliarch@163.com# function: count file# Date: 2020-03-28 14:00# Version: 1.0# 定義文件掃描目錄SCAN_DIR=`echo $PATH |sed 's/:/ /g'`SCAN_CMD=`which md5sum`SCAN_FILE_FAIL="/tmp/scan_$(date +%F%H%m)_fall.txt"SCAN_FILE_BIN="/tmp/scan_$(date +%F%H%m)_bin.txt"scan_fall_disk() { echo "正在全盤掃描,請(qǐng)稍等!文件路徑:$SCAN_FILE_FALL" find / -type f ! -path "/proc/*" -exec $SCAN_CMD \{\} \;>> $SCAN_FILE_FAIL 2>/dev/null echo "掃描完成,可利用以下命令后期對(duì)文件進(jìn)行校驗(yàn)" echo "$SCAN_CMD -c $SCAN_FILE_FAIL |grep -v 'OK$'"}scan_bin() { echo "正在掃描$PATH可執(zhí)行文件,請(qǐng)稍等,文件路徑:$SCAN_FILE_BIN" for file in $SCAN_DIR do find $file -type f -exec $SCAN_CMD \{\} \;>> $SCAN_FILE_BIN 2>/dev/null done echo "掃描完成,可利用以下命令后期對(duì)文件進(jìn)行校驗(yàn)" echo "$SCAN_CMD -c $SCAN_FILE_BIN |grep -v 'OK$'"}clearecho "##########################################"echo "# #"echo "# 利用md5sum對(duì)文件進(jìn)行校驗(yàn) #"echo "# #"echo "##########################################"echo "1: 全盤掃描"echo "2: bin path掃描"echo "3: EXIT"# 選擇掃描方式read -p "Please input your choice:" methodcase $method in 1) scan_fall_disk;;2) scan_bin;;3) echo "you choce channel!" && exit 1;;*) echo "input Error! Place input{1|2|3}" && exit 0;;esac測(cè)試[root@xuel-terraform-cvm-0 ~]# bash file_scan.sh########################################### ## 利用md5sum對(duì)文件進(jìn)行校驗(yàn) ## ###########################################1: 全盤掃描2: bin path掃描3: EXITPlease input your choice:2正在掃描/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin可執(zhí)行文件,請(qǐng)稍等,文件路徑:/tmp/scan_2020-03-271703_bin.txt掃描完成,可利用以下命令后期對(duì)文件進(jìn)行校驗(yàn)/usr/bin/md5sum -c /tmp/scan_2020-03-271703_bin.txt |grep -v 'OK$'[root@xuel-terraform-cvm-0 ~]# /usr/bin/md5sum -c /tmp/scan_2020-03-271703_bin.txt |grep -v 'OK$'/sbin/mii-tool: 確定/sbin/wipefs: 確定/sbin/blkdiscard: 確定/sbin/rtmon: 確定/sbin/shutdown: 確定/sbin/aureport: 確定/sbin/plymouthd: 確定/sbin/udevd: 確定/sbin/lvmetad: 確定/sbin/e2undo: 確定...當(dāng)我們輸入數(shù)字 2 的時(shí)候即對(duì) bin 路徑執(zhí)行掃描,掃描完成后會(huì)生成對(duì)應(yīng)的掃描文件,可以執(zhí)行 /usr/bin/md5sum -c /tmp/scan_2020-03-271703_bin.txt |grep -v 'OK$' 來(lái)進(jìn)行后期文件校驗(yàn)。[root@xuel-terraform-cvm-0 ~]# bash file_scan.sh########################################### ## 利用md5sum對(duì)文件進(jìn)行校驗(yàn) ## ###########################################1: 全盤掃描2: bin path掃描3: EXITPlease input your choice:3you choce channel!當(dāng)輸入 3 程序退出,在此就是使用 case 來(lái)完成。[root@xuel-terraform-cvm-0 ~]# bash file_scan.sh########################################### ## 利用md5sum對(duì)文件進(jìn)行校驗(yàn) ## ###########################################1: 全盤掃描2: bin path掃描3: EXITPlease input your choice:1正在全盤掃描,請(qǐng)稍等!文件路徑:掃描完成,可利用以下命令后期對(duì)文件進(jìn)行校驗(yàn)/usr/bin/md5sum -c /tmp/scan_2020-03-271703_fall.txt |grep -v 'OK$'[root@xuel-terraform-cvm-0 ~]# /usr/bin/md5sum -c /tmp/scan_2020-03-271703_fall.txt |grep -v 'OK$' |more/sys/devices/platform/uevent: 確定/sys/devices/platform/power/control: 確定/sys/devices/platform/power/wakeup: 確定/sys/devices/platform/pcspkr/uevent: 確定/sys/devices/platform/pcspkr/modalias: 確定/sys/devices/platform/pcspkr/power/control: 確定/sys/devices/platform/pcspkr/power/wakeup: 確定/sys/devices/platform/platform-framebuffer.0/uevent: 確定/sys/devices/platform/platform-framebuffer.0/modalias: 確定/sys/devices/platform/platform-framebuffer.0/power/control: 確定/sys/devices/platform/platform-framebuffer.0/power/wakeup: 確定/sys/devices/platform/serial8250/uevent: 確定/sys/devices/platform/serial8250/modalias: 確定/sys/devices/platform/serial8250/power/control: 確定/sys/devices/platform/serial8250/power/wakeup: 確定/sys/devices/platform/serial8250/tty/ttyS1/uevent: 確定/sys/devices/platform/serial8250/tty/ttyS1/dev: 確定/sys/devices/platform/serial8250/tty/ttyS1/power/cont
數(shù)組的聲明形式形如var 數(shù)組名 [數(shù)組長(zhǎng)度]數(shù)組類型,其中數(shù)組類型可以是數(shù)組本身,也就是數(shù)組類型的數(shù)組,這樣就構(gòu)成了多維數(shù)組。和變量的聲明相同,數(shù)組在聲明時(shí)會(huì)初始化變量類型的零值。代碼示例package mainimport ( "fmt")func main() { var a [2]int var b [2][2]int var c = [2]int{1, 2} var d = [...]int{3, 4} fmt.Println("a的零值", a) fmt.Println("b的零值", b) fmt.Println("c的值", c) fmt.Println("d的值", d)}第 8 行:聲明一個(gè)長(zhǎng)度為2的一維數(shù)組。自動(dòng)初始化為零值;第 9 行:聲明一個(gè)2行2列的二維數(shù)組。自動(dòng)初始化為零值;第 10 行:聲明并定義一個(gè)長(zhǎng)度為2,值為[1,2]的數(shù)組;第 11 行:使用 ... 表示根據(jù)數(shù)組后值的長(zhǎng)度自動(dòng)初始化長(zhǎng)度。因?yàn)楹竺娴闹凳?[3,4] 數(shù)組自動(dòng)初始化長(zhǎng)度為 2。執(zhí)行結(jié)果:
用于對(duì)象時(shí)返回對(duì)象鍵值作為數(shù)組:var obj = { name: 'imooc', type: 'ES6 Wiki'}console.log(Object.keys(obj));// ["name", "type"]用于數(shù)組類型:var arr = ['a', 'b', 'c'];console.log(Object.keys(arr));// console: ['0', '1', '2']也可以用于類數(shù)組中:var obj = { 0: 'a', 1: 'b', 2: 'c' };console.log(Object.keys(obj)); // ['0', '1', '2']鍵值是數(shù)字和字符串混合時(shí),會(huì)先進(jìn)行數(shù)值的排序,然后再按添加的順序排列字符串:var obj = { name: 'imooc', 10: 'a', 3: 'b', age: 7 };console.log(Object.keys(obj));// ["3", "10", "name", "age"]Object.keys() 不能獲取不可枚舉屬性:// 創(chuàng)建一個(gè)obj對(duì)象帶有一個(gè)不可枚舉屬性var obj = Object.create({}, { getFoo: { value: function () { return this.foo; } }});obj.foo = 1;console.log(Object.keys(obj)); // ['foo']
C 語(yǔ)言在前期是沒(méi)有布爾類型的,但是采用了整數(shù)類型來(lái)直接替代布爾類型使用。一般情況下,非零的值都被認(rèn)為是真值,而零值則被認(rèn)為是假值。這點(diǎn)上與其他的編程語(yǔ)言,如 C#, JAVA 等是不同的。因?yàn)檫@些語(yǔ)言是內(nèi)置有布爾類型的。但是這點(diǎn)在 C99 標(biāo)準(zhǔn)之后有了一個(gè)進(jìn)步,就是提供了 stdbool 這個(gè)程序庫(kù),可以提供布爾類型。但是稍顯遺憾的是,還是沒(méi)有辦法直接輸出布爾類型,只能輸出整數(shù)類型。
同樣,我們展示了通過(guò) C 語(yǔ)言 Socket API 編寫 UDP 客戶端和服務(wù)器程序的步驟,如下:圖中的矩形方框都是 C 函數(shù)。對(duì)比 TCP 客戶端、服務(wù)器的建立過(guò)程,我們發(fā)現(xiàn) UDP 客戶端可以調(diào)用 connect 函數(shù),但是并不會(huì)去連接服務(wù)器,只是和本地接口做綁定;UDP 服務(wù)器是沒(méi)有 listen 和 accept 調(diào)用的。對(duì)于 UDP 客戶端來(lái)說(shuō),connect 函數(shù)的調(diào)用是可選的。接下來(lái),我們就探討一下如何用 Java 語(yǔ)言編寫 UDP 客戶端和服務(wù)器程序。
ES2016 新增了一個(gè)冪運(yùn)算符 ** (也可以說(shuō)是指數(shù)運(yùn)算符)。冪運(yùn)算符返回第一個(gè)操作數(shù)作底數(shù),第二個(gè)操作數(shù)作指數(shù)的乘方。即,var1^var2,其中 var1 和 var2 是其兩個(gè)操作數(shù)。冪運(yùn)算符是右結(jié)合的。a ** b ** c 等同于 a ** (b ** c)。3 ** 2 // 93 ** 3 // 27指數(shù)運(yùn)算符可以與等號(hào)結(jié)合,形成一個(gè)新的賦值運(yùn)算符(**=)。let a = 1.5;a **= 2;// 等同于 a = a * a;let b = 4;b **= 3;// 等同于 b = b * b * b;指數(shù)運(yùn)算符與 Math.pow() 基本相同,不過(guò)使用冪運(yùn)算符更加方便簡(jiǎn)潔。Math.pow(99, 99)// 3.697296376497268e+19799 ** 99// 3.697296376497268e+197
假設(shè)我們一共有 n 種物品,每種物品 i 的價(jià)值為 vi,重量為 wi,我們有一個(gè)背包,背包的容量為 c(最多可以放的物品重量不能超過(guò) c),我們需要選擇物品放入背包中,使得背包中選擇的物品中總價(jià)值最大,在這里每個(gè)物品可以只選擇部分。這便是我們常說(shuō)的背包問(wèn)題背包問(wèn)題是一種常見(jiàn)的可以用貪心算法進(jìn)行求解的問(wèn)題,接下來(lái),就讓我們看看如何利用貪心算法解決背包問(wèn)題。
在日常的生活學(xué)習(xí)中,分治算法一般可以用來(lái)解決很多實(shí)際問(wèn)題。下面,我們來(lái)看兩個(gè)分治算法求解問(wèn)題的實(shí)例。實(shí)例 1: 二分搜索二分搜索是一種很常見(jiàn)的搜索策略,他的核心思想也是利用到分治算法。二分搜索是在一個(gè)有序的數(shù)組中,通過(guò)均勻二分,每次折半查找,就是應(yīng)用到分治法中將大問(wèn)題縮減到小問(wèn)題,這個(gè)小問(wèn)題的最后結(jié)果就是剛好找到需要查找搜索的元素,這樣小問(wèn)題得出解,這個(gè)解也是最開始的待搜索的元素。實(shí)例 2: 全排列問(wèn)題現(xiàn)實(shí)生活中,我們經(jīng)常會(huì)遇見(jiàn)這樣的場(chǎng)景,比如有 3 個(gè)小朋友排成一列,問(wèn)你一共有多少種可以排列的情況,這個(gè)問(wèn)題類似于數(shù)學(xué)中的全排列問(wèn)題,這個(gè)時(shí)候利用分治算法也可以很好地進(jìn)行求解。先依次從三個(gè)小朋友中選擇一位排在隊(duì)列最前面,剩下的兩個(gè)小朋友可以進(jìn)行全排列,也可以繼續(xù)拆分,二者選擇其一進(jìn)行即可,這個(gè)時(shí)候其實(shí)很清楚,他們只有兩種排列情況了,然后跟前面的小朋友排列組合在一起。比如我們用 A,B,C 代表三個(gè)小朋友,他們的排列情況演示如下://初始需要排列的元素[A,B,C] //依次從三個(gè)小朋友中選擇一位排在隊(duì)列最前面,剩下的兩個(gè)小朋友全排列A[B,C]; B[A,C]; C[A,B] //剩下的兩個(gè)小朋友排列情況只有兩種,與之前的合并在一起 ABC,ACB,BAC,BCA,CAB,CBA 在現(xiàn)實(shí)工作和學(xué)習(xí)中會(huì)經(jīng)常遇見(jiàn),這是一種解決問(wèn)題的思路與方法,將待求解的大問(wèn)題拆分成小問(wèn)題,然后解決小問(wèn)題,再將小問(wèn)題的解合并得出整個(gè)問(wèn)題的解。
多重循環(huán)嵌套是我們之前講過(guò)的幾種不同的循環(huán)控制語(yǔ)句的組合,可以有不同的組合形式。在這里,我們給大家舉例講解。