2017.11.13 Dictionary、正則表達(dá)式榜配、 容器介紹蛋褥、 Python烙心、 Flex布局

1. Dictionary

和java中的Map類(lèi)似乏沸,可以用來(lái)存放鍵值對(duì)蹬跃。

說(shuō)明

必須包含名空間System.Collection.Generic
Dictionary里面的每一個(gè)元素都是一個(gè)鍵值對(duì)(由二個(gè)元素組成:鍵和值)
鍵必須是唯一的,而值不需要唯一的
鍵和值都可以是任何類(lèi)型(比如:string, int, 自定義類(lèi)型,等等)
通過(guò)一個(gè)鍵讀取一個(gè)值的時(shí)間是接近O(1)
鍵值對(duì)之間的偏序可以不定義

  • 創(chuàng)建及初始化
 Dictionary<int,string>myDictionary=newDictionary<int,string>();
  • 添加元素
myDictionary.Add(1,"C#");
myDictionary.Add(2,"C++");
myDictionary.Add(3,"ASP.NET"); 
myDictionary.Add(4,"MVC");
  • 通過(guò)Key查找元素
if(myDictionary.ContainsKey(1))
{
Console.WriteLine("Key:{0},Value:{1}","1", myDictionary[1]);
 }
  • 通過(guò)KeyValuePair遍歷元素
foreach(KeyValuePair<int,string>kvp in myDictionary)
...{
Console.WriteLine("Key = {0}, Value = {1}",kvp.Key, kvp.Value);
}
  • 僅遍歷鍵 Keys 屬性
Dictionary<int,string>.KeyCollection keyCol=myDictionary.Keys;
foreach(intkeyinkeyCol)
...{
Console.WriteLine("Key = {0}", key);
}
  • 僅遍歷值 Valus屬性
Dictionary<int,string>.ValueCollection valueCol=myDictionary.Values;
foreach(stringvalueinvalueCol)
...{
Console.WriteLine("Value = {0}", value);
}
  • 通過(guò)Remove方法移除指定的鍵值
myDictionary.Remove(1);
if(myDictionary.ContainsKey(1))
...{
  Console.WriteLine("Key:{0},Value:{1}","1", myDictionary[1]);
}
else
{
Console.WriteLine("不存在 Key : 1"); 
 }

下面是我自己的例子:


image.png
image.png
image.png

2. 正則表達(dá)式/HTML圖片顯示/Select下拉框

2.1 正則表達(dá)式

正則表達(dá)式翁都,又稱(chēng)規(guī)則表達(dá)式柄慰,英文名為Regular Expression,在代碼中常簡(jiǎn)寫(xiě)為regex贼涩、regexp或RE,是計(jì)算機(jī)科學(xué)的一個(gè)概念谤绳。正則表通常被用來(lái)檢索缩筛、替換那些符合某個(gè)模式(規(guī)則)的文本瞎抛。

正則表達(dá)式是對(duì)字符串(包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱(chēng)為“元字符”))操作的一種邏輯公式胎撤,就是用事先定義好的一些特定字符伤提、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”介汹,這個(gè)“規(guī)則字符串”用來(lái)表達(dá)對(duì)字符串的一種過(guò)濾邏輯嘹承。正則表達(dá)式是一種文本模式赶撰,模式描述在搜索文本時(shí)要匹配的一個(gè)或多個(gè)字符串柱彻。


image.png

上圖為控制輸入框的內(nèi)容不能為漢字的正則表達(dá)式哟楷。每個(gè)符號(hào)所代表的意思如下:


image.png
2.2 HTML圖片顯示

在使用<img>標(biāo)簽顯示圖片時(shí)卖擅,如果圖片太大顯示會(huì)超出div的大小惩阶。這回導(dǎo)致頁(yè)面可以橫向滑動(dòng)断楷,但是沒(méi)有圖片的地方div大小正常,被圖片撐大的部分顯示的就是上一個(gè)頁(yè)面的內(nèi)容恐锣。

水平方向撐開(kāi)的解決方法就是添加style=”display:block;width:100%土榴。其中玷禽,display:block;此元素將顯示為塊級(jí)元素,此元素前后會(huì)帶有換行符瑞佩。width:100%炬丸,將寬度設(shè)為100%稠炬,這個(gè)塊級(jí)元素寬度就被固定了首启。該元素不會(huì)被撐開(kāi)撤摸,而是按比例縮小顯示准夷。

如果加入圖片較小能在一個(gè)頁(yè)面顯示可以按照水平方向的解決方法加上height:100%解決衫嵌,但是如果圖片較大楔绞,需要下拉¤氤可以在頁(yè)面加一個(gè)滾動(dòng)條style="overflow-y: scroll;"原本未加滾動(dòng)條時(shí)结耀,因?yàn)閳D片大將<img>元素?fù)未蟊牵辉谒蜃〉膁iv內(nèi),也能下拉具帮,但是能看到上一頁(yè)面的未覆蓋的內(nèi)容蜂厅。加了y方向的滾動(dòng)條后就能解決這一問(wèn)題掘猿。

2.3 Select下拉框

在 HTML 表單中稠通,<select> 標(biāo)簽每出現(xiàn)一次改橘,一個(gè) Select 對(duì)象就會(huì)被創(chuàng)建。在使用選擇框時(shí)狮惜,如需要默認(rèn)初始值碾篡,添加selected = 'selected'; 屬性耽梅,該選項(xiàng)即為默認(rèn)選項(xiàng)眼姐。


image.png

在制作下拉框時(shí)众旗,需要將默認(rèn)顯示為“請(qǐng)選擇”贡歧,但是選項(xiàng)沒(méi)有“請(qǐng)選擇”項(xiàng)時(shí)利朵,可以使用
image.png

將初始val賦為空,這樣“請(qǐng)選擇”項(xiàng)的val即為空樟遣,世紀(jì)選項(xiàng)就沒(méi)有“請(qǐng)選擇”項(xiàng)了。

源碼:

<input type="text" class="uc-a1" style="border: none;font-size: 
0.8125em;"id="RelaCredNo"onkeyup="value=value.replace(/[^\w\.\/]/ig,'')">
<div class="bc-bg" tabindex="0" data-control="PAGE" id="Page" style="overflow-y: scroll">
$("#show_img").append('<img src="'+relaImage+'" style="display:block;width:100%">');
  var result = JSON.parse(appcan.locStorage.getVal("selectRelaType"));
        var str = "";
        str += "<option value=''  selected = 'selected'>請(qǐng)選擇</option>";
        if (result.indexOf("本人|") < 0) {
            str += "<option value='1'>本人</option>";
        }
        if (result.indexOf("父親|") < 0) {
            str += "<option value='2'>父親</option>";
        }
        if (result.indexOf("母親|") < 0) {
            str += "<option value='3'>母親</option>";
        }
        if (result.indexOf("配偶父|") < 0) {
            str += "<option value='4'>配偶父</option>";
        }
        if (result.indexOf("配偶母|") < 0) {
            str += "<option value='5'>配偶母</option>";
        }
        if (result.indexOf("配偶|") < 0) {
            str += "<option value='6'>配偶</option>";
        }
        str += "<option value='7'>子女</option>";
        $("#RelaType").append(str);
        $('#RelaType').val("");
        $("#RelaCredType").append("<option value=''  selected = 'selected'>請(qǐng)選擇</option>
<option value='1'>身份證</option><option value='2'>護(hù)照</option>");
        $('#RelaCredType').val("");

3. 容器介紹

3.1 Array/ArrayList/List/LinkedList
  • Array

數(shù)組在C#中最早出現(xiàn)的豹悬。在內(nèi)存中是連續(xù)存儲(chǔ)的葵陵,所以它的索引速度非常快瞻佛,而且賦值與修改元素也很簡(jiǎn)單脱篙。

1.  string[] s=new string[2];   
2.    
3.  //賦值   
4.  s[0]="a";   
5.  s[1]="b";   
6.  //修改   
7.  s[1]="a1";   

但是數(shù)組存在一些不足的地方伤柄。在數(shù)組的兩個(gè)數(shù)據(jù)間插入數(shù)據(jù)是很麻煩的,而且在聲明數(shù)組的時(shí)候必須指定數(shù)組的長(zhǎng)度,數(shù)組的長(zhǎng)度過(guò)長(zhǎng),會(huì)造成內(nèi)存浪費(fèi),過(guò)短會(huì)造成數(shù)據(jù)溢出的錯(cuò)誤丢早。如果在聲明數(shù)組時(shí)我們不清楚數(shù)組的長(zhǎng)度,就會(huì)變得很麻煩。

針對(duì)數(shù)組的這些缺點(diǎn),C#中最先提供了ArrayList對(duì)象來(lái)克服這些缺點(diǎn)揖闸。

底層數(shù)據(jù)結(jié)構(gòu)就是數(shù)組。

  • ArrayList

    ArrayList是命名空間System.Collections下的一部分递瑰,在使用該類(lèi)時(shí)必須進(jìn)行引用议惰,同時(shí)繼承了IList接口俯萎,提供了數(shù)據(jù)存儲(chǔ)和檢索。ArrayList對(duì)象的大小是按照其中存儲(chǔ)的數(shù)據(jù)來(lái)動(dòng)態(tài)擴(kuò)充與收縮的。所以,在聲明ArrayList對(duì)象時(shí)并不需要指定它的長(zhǎng)度玄坦。

1.  ArrayList list1 = new ArrayList();   
2.    
3.  //新增數(shù)據(jù)   
4.  list1.Add("cde");   
5.  list1.Add(5678);   
6.    
7.  //修改數(shù)據(jù)   
8.  list[2] = 34;   
9.    
10. //移除數(shù)據(jù)   
11. list.RemoveAt(0);   
12.   
13. //插入數(shù)據(jù)   
14. list.Insert(0, "qwe");   

從上面例子看车伞,ArrayList好像是解決了數(shù)組中所有的缺點(diǎn),為什么又會(huì)有List赂弓?

我們從上面的例子看窃诉,在List中珊膜,我們不僅插入了字符串cde剔氏,而且插入了數(shù)字5678塑陵。這樣在ArrayList中插入不同類(lèi)型的數(shù)據(jù)是允許的阻桅。因?yàn)锳rrayList會(huì)把所有插入其中的數(shù)據(jù)當(dāng)作為object類(lèi)型來(lái)處理俯抖,在我們使用ArrayList處理數(shù)據(jù)時(shí)尤揣,很可能會(huì)報(bào)類(lèi)型不匹配的錯(cuò)誤漫蛔,也就是ArrayList不是類(lèi)型安全的。在存儲(chǔ)或檢索值類(lèi)型時(shí)通常發(fā)生裝箱和取消裝箱操作,帶來(lái)很大的性能耗損益缠。

裝箱與拆箱的概念:
裝箱:就是將值類(lèi)型的數(shù)據(jù)打包到引用類(lèi)型的實(shí)例中比如將string類(lèi)型的值abc賦給object對(duì)象obj

1.  String i=”abc”;   
2.  object obj=(object)i; 

拆箱:就是從引用數(shù)據(jù)中提取值類(lèi)型

比如將object對(duì)象obj的值賦給string類(lèi)型的變量i酌媒。

1.  object obj=”abc”;   
2.  string i=(string)obj;   

裝箱與拆箱的過(guò)程是很損耗性能的雨席。

底層數(shù)據(jù)結(jié)構(gòu)就是數(shù)組特占。類(lèi)似于C++里面沒(méi)有泛型的Vector。

  • 泛型List

因?yàn)锳rrayList存在不安全類(lèi)型與裝箱拆箱的缺點(diǎn),所以出現(xiàn)了泛型的概念茂缚。List類(lèi)是ArrayList類(lèi)的泛型等效類(lèi),它的大部分用法都與ArrayList相似,因?yàn)長(zhǎng)ist類(lèi)也繼承了IList接口。最關(guān)鍵的區(qū)別在于,在聲明List集合時(shí),我們同時(shí)需要為其聲明List集合內(nèi)數(shù)據(jù)的對(duì)象類(lèi)型。

比如:

1.  List<string> list = new List<string>();   
2.  //新增數(shù)據(jù)   
3.  list.Add(“abc”);   
4.  //修改數(shù)據(jù)   
5.  list[0] = “def”;   
6.  //移除數(shù)據(jù)   
7.  list.RemoveAt(0);   

上例中坛悉,如果我們往List集合中插入int數(shù)組123轩猩,IDE就會(huì)報(bào)錯(cuò)浊猾,且不能通過(guò)編譯。這樣就避免了前面講的類(lèi)型安全問(wèn)題與裝箱拆箱的性能問(wèn)題了椒涯。

底層數(shù)據(jù)結(jié)構(gòu)就是數(shù)組。類(lèi)似于C++里面的Vector。

  • LinkedList

用雙鏈表實(shí)現(xiàn)的List该贾,特點(diǎn)是插入刪除快六荒,查找慢

LinkedList<T> 提供 LinkedListNode<T> 類(lèi)型的單獨(dú)節(jié)點(diǎn)砚亭,因此插入和移除的運(yùn)算復(fù)雜度為 O(1)。

可以移除節(jié)點(diǎn),然后在同一列表或其他列表中重新插入它們硝烂,這樣在堆中便不會(huì)分配額外的對(duì)象啥酱。由于該列表還維護(hù)內(nèi)部計(jì)數(shù),因此獲取 Count 屬性的運(yùn)算復(fù)雜度為 O(1)厨诸。

LinkedList<T> 對(duì)象中的每個(gè)節(jié)點(diǎn)都屬于 LinkedListNode<T> 類(lèi)型镶殷。由于 LinkedList<T> 是雙向鏈表,因此每個(gè)節(jié)點(diǎn)向前指向 Next 節(jié)點(diǎn)微酬,向后指向 Previous 節(jié)點(diǎn)绘趋。

1.  LinkedList<string> list = new LinkedList<string>();  
2.  list.AddFirst("Data Value 1");  
3.  list.AddLast("Data Value 6");  

關(guān)于List和LonkedList的一個(gè)性能比較

  • 增加 刪除

在List<T>中增加、刪除節(jié)點(diǎn)的速度颗管,大體上快于使用LinkedList<T>時(shí)的相同操作陷遮。將 List<T>.Add方法和LinkedList<T>的Add*方法相比較,真正的性能差別不在于Add操作垦江,而在LinkedList<T>在給GC(垃圾回收機(jī)制)的壓力上帽馋。一個(gè)List<T>本質(zhì)上是將其數(shù)據(jù)保存在一個(gè)堆棧的數(shù)組上,而LinkedList<T>是將其所有節(jié)點(diǎn)保存在堆棧上(人家是一個(gè)比吭,我是一系列)绽族。這就使得GC需要更多地管理堆棧上LinkedList<T>的節(jié)點(diǎn)對(duì)象。注意衩藤,List<T>.Insert方法比在LinkedList<T>中使用Add方法在任何地方添加一個(gè)節(jié)點(diǎn)可能要慢吧慢。然而,這個(gè)依賴(lài)于List<T>插入對(duì)象的位置赏表。Insert方法必須使所有在插入點(diǎn)后面的元素往后移動(dòng)一位检诗。如果新元素被插在List<T>最后或接近最后的位置,那么相對(duì)于GC維護(hù)LinkedList<T>節(jié)點(diǎn)的總的開(kāi)銷(xiāo)來(lái)說(shuō)瓢剿,其開(kāi)銷(xiāo)是可以被忽略的逢慌。

  • 索引

另一個(gè)List<T>性能優(yōu)于LinkedList<T>的地方是你在使用索引進(jìn)行訪(fǎng)問(wèn)的時(shí)候。在List<T>中间狂,你可以使用索引值(indexer)直接定位到某個(gè)具體的元素位置攻泼。而在LinkedList<T>中,卻沒(méi)有這樣的奢侈品前标。在LinkedList<T>中坠韩,你必須通過(guò)Previous或Next屬性遍歷整個(gè)List,直到找到你想要的節(jié)點(diǎn)炼列。

3.2 HashSet/HashTable/Dictionary

這三個(gè)容器的底層都是Hash表只搁。

  • HashSet

MSDN很簡(jiǎn)單的解釋?zhuān)罕硎局档募?/p>

HashSet<T> 類(lèi)提供了高性能的集運(yùn)算。一組是一個(gè)集合俭尖,不包含任何重復(fù)的元素氢惋,且的元素順序不分先后洞翩。

用了hash table來(lái)儲(chǔ)存數(shù)據(jù),是為了用O(n)的space來(lái)?yè)Q取O(n)的時(shí)間焰望,也就是查找元素的時(shí)間是O(1)骚亿。

它包含一些集合的運(yùn)算

HashSet<T> 提供了許多數(shù)學(xué)設(shè)置操作例如,組添加 (聯(lián)合)熊赖,并設(shè)置減法来屠。下表列出了所提供 HashSet<T> 操作和及其數(shù)學(xué)等效項(xiàng)。

 UnionWith - Union 或?qū)⑵湓O(shè)置的添加
IntersectWith - 交集
ExceptWith - Set 減法
SymmetricExceptWith - 余集

列出的集操作中震鹉,除了 HashSet<T> 類(lèi)還提供了方法來(lái)確定 set 是否相等俱笛、 重疊的集,以及一組是否為子集或另一個(gè)集的超集传趾。

example

1.   HashSet<int> evenNumbers = new HashSet<int>();  
2.  HashSet<int> oddNumbers = new HashSet<int>();  
3.    
4.  for (int i = 0; i < 5; i++)  
5.  {  
6.       // Populate numbers with just even numbers.  
7.        evenNumbers.Add(i * 2);  
8.       // Populate oddNumbers with just odd numbers.  
9.       oddNumbers.Add((i * 2) + 1);  
10. }  
11.  // Create a new HashSet populated with even numbers.  
12. HashSet<int> numbers = new HashSet<int>(evenNumbers);  
13.  numbers.UnionWith(oddNumbers);  
  • HashTable

表示根據(jù)鍵的哈希代碼進(jìn)行組織的鍵/值對(duì)的集合迎膜。

Hashtable是System.Collections命名空間提供的一個(gè)容器,用于處理和表現(xiàn)類(lèi)似key/value的鍵值對(duì)浆兰,其中key通晨慕觯可用來(lái)快速查找,同時(shí)key是區(qū)分大小寫(xiě)簸呈;value用于存儲(chǔ)對(duì)應(yīng)于key的值榕订。

Hashtable中key/value鍵值對(duì)均為object類(lèi)型,所以Hashtable可以支持任何類(lèi)型的key/value鍵值對(duì).

他內(nèi)部維護(hù)很多對(duì)Key-Value鍵值對(duì)蝶棋,其還有一個(gè)類(lèi)似索引的值叫做散列值(HashCode)卸亮,它是根據(jù)GetHashCode方法對(duì)Key通過(guò)一定算法獲取得到的,所有的查找操作定位操作都是基于散列值來(lái)實(shí)現(xiàn)找到對(duì)應(yīng)的Key和Value值的

當(dāng)前HashTable中的被占用空間達(dá)到一個(gè)百分比的時(shí)候就將該空間自動(dòng)擴(kuò)容玩裙,在.net中這個(gè)百分比是72%,也叫.net中HashTable的填充因子為0.72。例如有一個(gè)HashTable的空間大小是100段直,當(dāng)它需要添加第73個(gè)值的時(shí)候?qū)?huì)擴(kuò)容此HashTable.

這個(gè)自動(dòng)擴(kuò)容的大小是多少呢吃溅?答案是當(dāng)前空間大小的兩倍最接近的素?cái)?shù),例如當(dāng)前HashTable所占空間為素?cái)?shù)71鸯檬,如果擴(kuò)容决侈,則擴(kuò)容大小為素?cái)?shù)131.

1.   Hashtable openWith = new Hashtable();  
2.    
3.  // Add some elements to the hash table. There are no   
4.  // duplicate keys, but some of the values are duplicates.  
5.  openWith.Add("txt", "notepad.exe");  
6.  openWith.Add("bmp", "paint.exe");  
7.  openWith.Add("dib", "paint.exe");  
8.  openWith.Add("rtf", "wordpad.exe");  

HashTable也有Boxing和Unboxing的開(kāi)銷(xiāo)。

然后就有了

  • Dictionary

Dictionary也是鍵值容器喧务,存入對(duì)象是需要與[key]值一一對(duì)應(yīng)的存入該泛型赖歌。相對(duì)于HashTable,類(lèi)似于List和ArrayList的關(guān)系功茴。它是類(lèi)型安全的庐冯。

1.  Dictionary<string, string> myDic = new Dictionary<string, string>();  
2.  myDic.Add("aaa", "111");  
3.  myDic.Add("bbb", "222");  
4.  myDic.Add("ccc", "333");  
5.  myDic.Add("ddd", "444");  
  • 小結(jié)

數(shù)組的容量是固定的,您只能一次獲取或設(shè)置一個(gè)元素的值坎穿,而ArrayList或List<T>的容量可根據(jù)需要自動(dòng)擴(kuò)充展父、修改返劲、刪除或插入數(shù)據(jù)。

數(shù)組可以具有多個(gè)維度栖茉,而 ArrayList或 List< T> 始終只具有一個(gè)維度篮绿。但是,您可以輕松創(chuàng)建數(shù)組列表或列表的列表吕漂。特定類(lèi)型(Object 除外)的數(shù)組 的性能優(yōu)于 ArrayList的性能亲配。 這是因?yàn)?ArrayList的元素屬于 Object 類(lèi)型;所以在存儲(chǔ)或檢索值類(lèi)型時(shí)通常發(fā)生裝箱和取消裝箱操作惶凝。不過(guò)弃榨,在不需要重新分配時(shí)(即最初的容量十分接近列表的最大容量),List< T> 的性能與同類(lèi)型的數(shù)組十分相近梨睁。

在決定使用 List<T> 還是使用ArrayList 類(lèi)(兩者具有類(lèi)似的功能)時(shí)鲸睛,記住List<T> 類(lèi)在大多數(shù)情況下執(zhí)行得更好并且是類(lèi)型安全的。如果對(duì)List< T> 類(lèi)的類(lèi)型T 使用引用類(lèi)型坡贺,則兩個(gè)類(lèi)的行為是完全相同的官辈。但是,如果對(duì)類(lèi)型T使用值類(lèi)型遍坟,則需要考慮實(shí)現(xiàn)和裝箱問(wèn)題拳亿。
所以基本不怎么用ArrayList.

還要注意的一點(diǎn)

在單線(xiàn)程的時(shí)候使用Dictionary更好一些,多線(xiàn)程的時(shí)候使用HashTable更好愿伴。

因?yàn)镠ashTable可以通過(guò)Hashtable tab = Hashtable.Synchronized(new Hashtable());獲得線(xiàn)程安全的對(duì)象肺魁。


網(wǎng)上找的C#學(xué)習(xí)內(nèi)容:

HTML---css/div---- SQL----C#----面向?qū)ο?----設(shè)計(jì)模式----MVC----EntityFramework-----C#深入了解-----WebForm-----javascript----jquery----angularJS----.netCore------現(xiàn)在。隔节。鹅经。。

往后我可能要繼續(xù)學(xué)習(xí)-----架構(gòu)----深入理解設(shè)計(jì)模式------.netCore-----NodeJs.------Git-----Docker
還有Unity3D------操作系統(tǒng)-----編譯原理-----數(shù)據(jù)結(jié)構(gòu)等怎诫。瘾晃。。幻妓。蹦误。。肉津。


4. Python多線(xiàn)程與多線(xiàn)程中join()的用法

Python多線(xiàn)程與多進(jìn)程中join()方法的效果是相同的强胰。

下面僅以多線(xiàn)程為例:

首先需要明確幾個(gè)概念:

  • 知識(shí)點(diǎn)一:
    當(dāng)一個(gè)進(jìn)程啟動(dòng)之后,會(huì)默認(rèn)產(chǎn)生一個(gè)主線(xiàn)程妹沙,因?yàn)榫€(xiàn)程是程序執(zhí)行流的最小單元偶洋,當(dāng)設(shè)置多線(xiàn)程時(shí),主線(xiàn)程會(huì)創(chuàng)建多個(gè)子線(xiàn)程初烘,在python中涡真,默認(rèn)情況下(其實(shí)就是setDaemon(False))分俯,主線(xiàn)程執(zhí)行完自己的任務(wù)以后,就退出了哆料,此時(shí)子線(xiàn)程會(huì)繼續(xù)執(zhí)行自己的任務(wù)缸剪,直到自己的任務(wù)結(jié)束,例子見(jiàn)下面一东亦。

  • 知識(shí)點(diǎn)二:
    當(dāng)我們使用setDaemon(True)方法杏节,設(shè)置子線(xiàn)程為守護(hù)線(xiàn)程時(shí),主線(xiàn)程一旦執(zhí)行結(jié)束典阵,則全部線(xiàn)程全部被終止執(zhí)行奋渔,可能出現(xiàn)的情況就是,子線(xiàn)程的任務(wù)還沒(méi)有完全執(zhí)行結(jié)束壮啊,就被迫停止嫉鲸,例子見(jiàn)下面二。

  • 知識(shí)點(diǎn)三:
    此時(shí)join的作用就凸顯出來(lái)了歹啼,join所完成的工作就是線(xiàn)程同步玄渗,即主線(xiàn)程任務(wù)結(jié)束之后,進(jìn)入阻塞狀態(tài)狸眼,一直等待其他的子線(xiàn)程執(zhí)行結(jié)束之后藤树,主線(xiàn)程在終止,例子見(jiàn)下面三拓萌。

  • 知識(shí)點(diǎn)四:
    join有一個(gè)timeout參數(shù):

  1. 當(dāng)設(shè)置守護(hù)線(xiàn)程時(shí)岁钓,含義是主線(xiàn)程對(duì)于子線(xiàn)程等待timeout的時(shí)間將會(huì)殺死該子線(xiàn)程,最后退出程序微王。所以說(shuō)屡限,如果有10個(gè)子線(xiàn)程,全部的等待時(shí)間就是每個(gè)timeout的累加和骂远。簡(jiǎn)單的來(lái)說(shuō)囚霸,就是給每個(gè)子線(xiàn)程一個(gè)timeout的時(shí)間,讓他去執(zhí)行激才,時(shí)間一到,不管任務(wù)有沒(méi)有完成额嘿,直接殺死瘸恼。
  2. 沒(méi)有設(shè)置守護(hù)線(xiàn)程時(shí),主線(xiàn)程將會(huì)等待timeout的累加和這樣的一段時(shí)間册养,時(shí)間一到东帅,主線(xiàn)程結(jié)束,但是并沒(méi)有殺死子線(xiàn)程球拦,子線(xiàn)程依然可以繼續(xù)執(zhí)行靠闭,直到子線(xiàn)程全部結(jié)束帐我,程序退出。
4.1 Python多線(xiàn)程的默認(rèn)情況
import threading
import time

def run():
    time.sleep(2)
    print('當(dāng)前線(xiàn)程的名字是: ', threading.current_thread().name)
    time.sleep(2)


if __name__ == '__main__':

    start_time = time.time()

    print('這是主線(xiàn)程:', threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)

    for t in thread_list:
        t.start()

    print('主線(xiàn)程結(jié)束愧膀!' , threading.current_thread().name)
    print('一共用時(shí):', time.time()-start_time)

其執(zhí)行結(jié)果如下

C:\Users\yuanyizhang\AppData\Local\Programs\Python\Python36-32\python.exe 
C:/Users/yuanyizhang/PycharmProjects/untitled/test.py

這是主線(xiàn)程: MainThread
主線(xiàn)程結(jié)束拦键! MainThread
一共用時(shí): 0.0020051002502441406
當(dāng)前線(xiàn)程的名字是:  Thread-1
當(dāng)前線(xiàn)程的名字是:  Thread-5
當(dāng)前線(xiàn)程的名字是:  Thread-4
當(dāng)前線(xiàn)程的名字是:  Thread-3
當(dāng)前線(xiàn)程的名字是:  Thread-2

Process finished with exit code 0
關(guān)鍵點(diǎn):
  1. 我們的計(jì)時(shí)是對(duì)主線(xiàn)程計(jì)時(shí),主線(xiàn)程結(jié)束檩淋,計(jì)時(shí)隨之結(jié)束芬为,打印出主線(xiàn)程的用時(shí)。
  2. 主線(xiàn)程的任務(wù)完成之后蟀悦,主線(xiàn)程隨之結(jié)束媚朦,子線(xiàn)程繼續(xù)執(zhí)行自己的任務(wù),直到全部的子線(xiàn)程的任務(wù)全部結(jié)束日戈,程序結(jié)束询张。
4.2 設(shè)置守護(hù)線(xiàn)程
import threading
import time

def run():

    time.sleep(2)
    print('當(dāng)前線(xiàn)程的名字是: ', threading.current_thread().name)
    time.sleep(2)


if __name__ == '__main__':

    start_time = time.time()

    print('這是主線(xiàn)程:', threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)

    for t in thread_list:
        t.setDaemon(True)
        t.start()

    print('主線(xiàn)程結(jié)束了!' , threading.current_thread().name)
    print('一共用時(shí):', time.time()-start_time)

其執(zhí)行結(jié)果如下浙炼,注意請(qǐng)確保setDaemon()在start()之前份氧。

C:\Users\yuanyizhang\AppData\Local\Programs\Python\Python36-32\python.exe 
C:/Users/yuanyizhang/PycharmProjects/untitled/test.py

這是主線(xiàn)程: MainThread
主線(xiàn)程結(jié)束了! MainThread
一共用時(shí): 0.0010030269622802734

Process finished with exit code 0

關(guān)鍵點(diǎn):
  1. 非常明顯的看到鼓拧,主線(xiàn)程結(jié)束以后半火,子線(xiàn)程還沒(méi)有來(lái)得及執(zhí)行,整個(gè)程序就退出了季俩。

4.3 join的作用

import threading
import time

def run():

    time.sleep(2)
    print('當(dāng)前線(xiàn)程的名字是: ', threading.current_thread().name)
    time.sleep(2)


if __name__ == '__main__':

    start_time = time.time()

    print('這是主線(xiàn)程:', threading.current_thread().name)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)

    for t in thread_list:
        t.setDaemon(True)
        t.start()

    for t in thread_list:
        t.join()

    print('主線(xiàn)程結(jié)束了钮糖!' , threading.current_thread().name)
    print('一共用時(shí):', time.time()-start_time)

其執(zhí)行結(jié)果如下:

這是主線(xiàn)程: MainThread
當(dāng)前線(xiàn)程的名字是:  Thread-1
當(dāng)前線(xiàn)程的名字是:  Thread-2
當(dāng)前線(xiàn)程的名字是:  Thread-4
當(dāng)前線(xiàn)程的名字是:  Thread-5
當(dāng)前線(xiàn)程的名字是:  Thread-3
主線(xiàn)程結(jié)束了! MainThread
一共用時(shí): 4.004054546356201
關(guān)鍵點(diǎn):
  1. 可以看到酌住,主線(xiàn)程一直等待全部的子線(xiàn)程結(jié)束之后店归,主線(xiàn)程自身才結(jié)束,程序退出酪我。
  2. 可以通過(guò)join(time)設(shè)置時(shí)間 控制主線(xiàn)程是否等待子線(xiàn)程結(jié)束再結(jié)束消痛,設(shè)置時(shí)間較小時(shí),等待時(shí)間不足都哭,主線(xiàn)程會(huì)先結(jié)束(本例可設(shè)置join(0.3))秩伞,時(shí)間足夠長(zhǎng)時(shí),主線(xiàn)程等待足夠時(shí)間欺矫,子線(xiàn)程可以全部結(jié)束(本例設(shè)置join(1))

5. Flex布局

flex 做布局太容易了纱新,尤其是在垂直居中這方面

布局的傳統(tǒng)解決方案,基于盒狀模型穆趴,依賴(lài) display 屬性 + position屬性 + float屬性脸爱。它對(duì)于那些特殊布局非常不方便,比如未妹,垂直居中就不容易實(shí)現(xiàn)簿废。

Flex 是 Flexible Box 的縮寫(xiě)空入,意為"彈性布局",用來(lái)為盒狀模型提供最大的靈活性族檬。

任何一個(gè)容器都可以指定為 Flex 布局歪赢。

.box{
  display: flex;
}

行內(nèi)元素也可以使用 Flex 布局。

.box{
  display: inline-flex;
}

Webkit 內(nèi)核的瀏覽器导梆,必須加上-webkit前綴轨淌。

注意,設(shè)為 Flex 布局以后看尼,子元素的float递鹉、clear和vertical-align屬性將失效。


image.png

容器默認(rèn)存在兩根軸:水平的主軸(main axis)和垂直的交叉軸(cross axis)藏斩。主軸的開(kāi)始位置(與邊框的交叉點(diǎn))叫做main start躏结,結(jié)束位置叫做main end;交叉軸的開(kāi)始位置叫做cross start狰域,結(jié)束位置叫做cross end媳拴。

項(xiàng)目默認(rèn)沿主軸排列。單個(gè)項(xiàng)目占據(jù)的主軸空間叫做main size兆览,占據(jù)的交叉軸空間叫做cross size屈溉。

容器的屬性

以下6個(gè)屬性設(shè)置在容器上。

flex-direction
flex-wrap
flex-flow
justify-content
align-items

具體各個(gè)屬性值與作用參考
http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抬探,一起剝皮案震驚了整個(gè)濱河市子巾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌小压,老刑警劉巖线梗,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異怠益,居然都是意外死亡仪搔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)蜻牢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)烤咧,“玉大人,你說(shuō)我怎么就攤上這事抢呆∷柘鳎” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵镀娶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我揪罕,道長(zhǎng)梯码,這世上最難降的妖魔是什么宝泵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮轩娶,結(jié)果婚禮上儿奶,老公的妹妹穿的比我還像新娘。我一直安慰自己鳄抒,他們只是感情好闯捎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著许溅,像睡著了一般瓤鼻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贤重,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天茬祷,我揣著相機(jī)與錄音,去河邊找鬼并蝗。 笑死祭犯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滚停。 我是一名探鬼主播沃粗,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼键畴!你這毒婦竟也來(lái)了最盅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤镰吵,失蹤者是張志新(化名)和其女友劉穎檩禾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體疤祭,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盼产,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勺馆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戏售。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖草穆,靈堂內(nèi)的尸體忽然破棺而出灌灾,到底是詐尸還是另有隱情,我是刑警寧澤悲柱,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布锋喜,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嘿般。R本人自食惡果不足惜段标,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炉奴。 院中可真熱鬧逼庞,春花似錦、人聲如沸瞻赶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)砸逊。三九已至璧南,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痹兜,已是汗流浹背穆咐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留字旭,地道東北人对湃。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像遗淳,于是被迫代替她去往敵國(guó)和親拍柒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法屈暗,類(lèi)相關(guān)的語(yǔ)法拆讯,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法养叛,異常的語(yǔ)法种呐,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,625評(píng)論 18 399
  • java筆記第一天 == 和 equals ==比較的比較的是兩個(gè)變量的值是否相等,對(duì)于引用型變量表示的是兩個(gè)變量...
    jmychou閱讀 1,497評(píng)論 0 3
  • (一)Java部分 1弃甥、列舉出JAVA中6個(gè)比較常用的包【天威誠(chéng)信面試題】 【參考答案】 java.lang;ja...
    獨(dú)云閱讀 7,101評(píng)論 0 62
  • 很累爽室、很糗 一縷浮光 風(fēng)景還在 很美
    阿拉斯加的霾閱讀 160評(píng)論 0 0
  • 作者:健美頌 §1 驅(qū)車(chē)風(fēng)動(dòng)石的路上阔墩,美景如畫(huà),讓突然掠過(guò)眼前的“寡婦村”三個(gè)字顯得格格不入瓶珊。 “老而無(wú)夫謂之寡”...
    健美頌閱讀 245評(píng)論 0 0