❶ 設A是由n個不同整數構成的序列,設計演算法求A中最長的單調遞增子序列
#include <vector>
using namespace std;
/* Finds longest strictly increasing subsequence. O(n log k) algorithm. */
void find_lis(vector<int> &a, vector<int> &b)
{
vector<int> p(a.size());
int u, v;
if (a.empty()) return;
b.push_back(0);
for (size_t i = 1; i < a.size(); i++)
{
// If next element a[i] is greater than last element of current longest subsequence a[b.back()], just push it at back of "b" and continue
if (a[b.back()] < a[i])
{
p[i] = b.back();
b.push_back(i);
continue;
}
// Binary search to find the smallest element referenced by b which is just bigger than a[i]
// Note : Binary search is performed on b (and not a). Size of b is always <=k and hence contributes O(log k) to complexity.
for (u = 0, v = b.size()-1; u < v;)
{
int c = (u + v) / 2;
if (a[b[c]] < a[i]) u=c+1; else v=c;
}
// Update b if new value is smaller then previously referenced value
if (a[i] < a[b[u]])
{
if (u > 0) p[i] = b[u-1];
b[u] = i;
}
}
for (u = b.size(), v = b.back(); u--; v = p[v]) b[u] = v;
}
/* Example of usage: */
#include <cstdio>茄差
int main()
{
int a[] = { 1, 9, 3, 8, 11, 4, 5, 6, 4, 19, 7, 1, 7 };
vector<顫腔皮int> seq(a, a+sizeof(a)/sizeof(a[0])); // seq : Input Vector
vector<int> lis; //圓游 lis : Vector containing indexes of longest subsequence
find_lis(seq, lis);
//Printing actual output
for (size_t i = 0; i < lis.size(); i++)
printf("%d ", seq[lis[i]]);
printf("\n");
return 0;
}
❷ java開發,list排序的問題
可以通過Collections類的靜態運殲舉方法sort(List<T> list, Comparator<? super T> c)來做排序,你需要的就是寫一個Comparator比較器實例,重寫它的compare(T o1, T o2)方法,在其中完成你自己的排序比較邏輯,根據第一改租個參數o1小於、等於或大於第二個參數o2分別返回負整數、零或正整數旁碧。
❸ 什麼是醫院HIS LIS PACS
HIS系統英文是Hospital Information System,中文是醫院滑啟信息系統,用電子計算機和通訊設備,為醫院所屬各部門提供病人診療信息和行政管理信息的收集、存儲、處理、提取和數據交換的能力,並滿足所有授權用戶的功能需求。HIS中主要覆蓋包括門急診、住院的兩類業務,門急診業務一般包括:醫療卡管理、掛號預約、門診分診、門診醫生工作站、門診收費系統、門診發葯系統、急診留觀系統等;住院業務一般包括:住院登記、住院收費、護士工作站、醫生工作站、病案編目、病案流通、病案質量控制。
LIS系統英文是Laboratory Information Management System,中文是實驗室信息管理系統,是專為醫院檢驗科設計的一套信息管理系統,能將實驗儀器與計算機組成網路,使病人樣品登錄、實驗數據存取、報告審核、列印分發,實驗數據統計分析等繁雜的操作過程實現了智能化、自動化和規范化管理。有助於提高實驗室的整體管理水平,減少漏洞,提高檢驗質量。
醫學影像報告(PACS)管理系統 從各種醫學影像檢查設備中獲取、存儲、處理影像數據,傳輸到體檢信息系統中,生成圖文並茂的體檢報告,滿足體檢中心高水準、高效率影像處理的需要。
關於飛博科技
武漢飛博科技有限公司前身起源於華中科技大學產學研共同合作項目,是1998年創始人張開方與華中科技大學教授共同發起。公司於2005年正式成立,為大型醫院提供專業醫療衛生信息系統的設計、建設及運維服務,至今已在行業積累23年,公司成立之初就建立了低代碼開發軟體應用敬埋的理念並發展至今。
目前,武漢飛博科技有限公司是具備顛覆性創新的低代碼快速開發開源平台的高新技術企業。已經深耕智慧醫療信息化行業二十餘年!致力於打造工具智造時代的軟體智慧工廠,以亮讓螞B/S架構、雲平台、物聯網、大數據,為底層演算法,顛覆客戶參與模式、交付模式及後續開發模式,通過」要素共性提煉、核心技術封裝、關鍵元素一鍵生成「等獨有技術路徑,使客戶總體開發速度、客戶響應及時度、應用體驗幸福感多倍提升,從而為客戶創造信息價值和成本價值!
❹ 如何統計一個二叉樹每一層的節點個數請寫出演算法代碼急。。。
//廣搜實現
//nod[i]存儲的是第i層的結點數
// 輸入n為結點數, 接下來n-1條邊,每一行x,y表示x,y 之間有邊相連。
#include<stdio.h>
#define maxn 100001
long n,o=0;
struct ind
{
long l,nex;
};
struct ind lis[maxn];
long hed[maxn],que[maxn],vis[maxn];
long cot[maxn],nod[maxn];
void Bfs(void)
{
long i,s=0,t=1; que[1]=1; vis[1]=1; cot[1]=1; nod[1]=1;
while(s<t)
{
s++;
for(i=hed[que[s]]; i ;i=lis[i].nex) if(!vis[lis[i].l])
{
que[++t]=lis[i].l; vis[lis[i].l]=1;
cot[t]=cot[s]+1; nod[cot[t]]++;
}
}
}
void Init(void)
{
long i,j,x,y; scanf("%ld",&n);
for(i=1; i<n; i++)
{
scanf("%ld%ld",&x,&y);
lis[++o].l=y; lis[o].nex=hed[x]; hed[x]=o;
lis[++o].l=x; lis[o].nex=hed[y]; hed[y]=o;
}
}
int main(void)
{
freopen("hello.in","r",stdin);
freopen("hello.out","w",stdout);
Init(); Bfs();
return 0;
}
❺ 智能優化演算法:灰狼優化演算法
@[toc]
摘要:受 灰 狼 群 體 捕 食 行 為 的 啟 發,Mirjalili等[1]於 2014年提出了一種新型群體智能優化演算法:灰狼優化演算法。GWO通過模擬灰狼群體捕食行為,基於狼群群體協作的機制來達到優化的目的。 GWO演算法具有結構簡單、需要調節的參數少,容易實現等特點,其中存在能夠自適應調整的收斂因子以及信息反饋機制,能夠在局部尋優與全局搜索之間實現平衡,因此在對問題的求解精度和收斂速度方面都有良好的性能。
灰狼屬於犬科動物,被認為是頂級的掠食者,它們處於生物圈食物鏈的頂端。灰狼大多喜歡群居,每個群體中平均有5-12隻狼。特別令人感興趣的是,它們具有非常嚴格的社會等級層次制度,如圖1所示。金字塔第一層為種群中的領導者,稱為 α 。在狼群中 α 是具有管理能力的個體,主要負責關於狩獵、睡覺的時間和地方、食物分配等群體中各項決策的事務。金字塔第二層是 α 的智囊團隊,稱為 β 。 β 主要負責協助α 進行決策。當整個狼群的 α 出現空缺時,β 將接替 α 的位置。 β 在狼群中的支配權僅次於 α,它將 α 的命令下達給其他成員,並將其他成員的執行情況反饋給 α 起著橋梁的作用。金字塔第三層是 δ ,δ 聽從 α 和 β 的決策命令,主要負責偵查、放哨、看護等事務。適應度不好的 α 和 β 也會降為 δ 。金字塔最底層是 ω ,主要負責種群內部關系的平衡。
<center>圖1.灰狼的社會等級制度
此外,集體狩獵是灰狼的另一個迷人的社會行為。灰狼的社會等級在群體狩獵過程中發揮著重要的作用,捕食的過程在 α 的帶領下完成。灰狼的狩獵包括以下 3個主要部分:
1)跟蹤、追逐和接近獵物;
2)追捕、包圍和騷擾獵物,直到它停止移動;
3)攻擊獵物
在狩獵過程中,將灰狼圍捕獵物的行為定義如下:
式(1)表示個體與獵物間的距離,式(2)是灰狼的位置更新公式。其中, 是目前的迭代代數, 和 是系數向量, 和 分別是獵物的位置向量和灰狼的位置向量。 和 的計算公式如下:
其中, 是收斂因子,隨著迭代次數從2線性減小到0, 和 的模取[0,1]之間的隨機數。
灰狼能夠識別獵物的位置並包圍它們。當灰狼識別出獵物的位置後,β 和 δ 在 α 的帶領下指導狼群包圍獵物。在優化問題的決策空間中,我們對最佳解決方案(獵物的位置)並不了解。因此,為了模擬灰狼的狩獵行為,我們假設 α ,β 和 δ 更了解獵物的潛在位置。我們保存迄今為止取得的3個最優解決方案,並利用這三者的位置來判斷獵物所在的位置,同時強迫其他灰狼個體(包括 ω )依據最優灰狼個體的位置來更新其位置,逐漸逼近獵物。狼群內個體跟蹤獵物位置的機制如圖2所示。
<center>圖2.GWO 演算法中灰狼位置更新示意圖
灰狼個體跟蹤獵物位置的數學模型描述如下:
其中, 分別表示分別表示 α , β 和 δ 與其他個體間的距離。 分別代表 α , β 和 δ 的當前位置; 是隨機向量, 是當前灰狼的位置。
式(6)分別定義了狼群中 ω 個體朝向 α ,β 和 δ 前進的步長和方向,式(7)定義了 ω 的最終位置。
當獵物停止移動時,灰狼通過攻擊來完成狩獵過程。為了模擬逼近獵物, 的值被逐漸減小,因此 的波動范圍也隨之減小。換句話說,在迭代過程中,當 的值從2線性下降到0時,其對應的 的值也在區間[-a,a]內變化。如圖3a所示,當 的值位於區間內時,灰狼的下一位置可以位於其當前位置和獵物位置之間的任意位置。當 時,狼群向獵物發起攻擊(陷入局部最優)。
灰狼根據 α ,β 和 δ 的位置來搜索獵物。灰狼在尋找獵物時彼此分開,然後聚集在一起攻擊獵物。基於數學建模的散度,可以用 大於1 或小於-1 的隨機值來迫使灰狼與獵物分離,這強調了勘探(探索)並允許 GWO 演算法全局搜索最優解。如圖3b所示, 強迫灰狼與獵物(局部最優)分離,希望找到更合適的獵物(全局最優)。GWO 演算法還有另一個組件 來幫助發現新的解決方案。由式(4)可知, 是[0,2]之間的隨機值。 表示狼所在的位置對獵物影響的隨機權重, 表示影響權重大,反之,表示影響權重小。這有助於 GWO演算法更隨機地表現並支持探索,同時可在優化過程中避免陷入局部最優。另外,與 不同 是非線性減小的。這樣,從最初的迭代到最終的迭代中,它都提供了決策空間中的全局搜索。在演算法陷入了局部最優並且不易跳出時, 的隨機性在避免局部最優方面發揮了非常重要的作用,尤其是在最後需要獲得全局最優解的迭代中。
<center>圖4.演算法流程圖
[1] Seyedali Mirjalili,Seyed Mohammad Mirjalili,Andrew Lewis. Grey Wolf Optimizer[J]. Advances in Engineering Software,2014,69.
[2] 張曉鳳,王秀英.灰狼優化演算法研究綜述[J].計算機科學,2019,46(03):30-38.
https://mianbaoo.com/o/bread/Z5ecmZc=
文獻復現:
文獻復現:基於翻筋斗覓食策略的灰狼優化演算法(DSFGWO)
[1]王正通,程鳳芹,尤文,李雙.基於翻筋斗覓食策略的灰狼優化演算法[J/OL].計算機應用研究:1-5[2021-02-01]. https://doi.org/10.19734/j.issn.1001-3695.2020.04.0102 .
文獻復現:基於透鏡成像學習策略的灰狼優化演算法(LIS-GWO)
[1]龍文,伍鐵斌,唐明珠,徐明,蔡紹洪.基於透鏡成像學習策略的灰狼優化演算法[J].自動化學報,2020,46(10):2148-2164.
文獻復現:一種優化局部搜索能力的灰狼演算法(IGWO)
[1]王習濤.一種優化局部搜索能力的灰狼演算法[J].計算機時代,2020(12):53-55.
文獻復現:基於自適應頭狼的灰狼優化演算法(ALGWO)
[1]郭陽,張濤,胡玉蝶,杜航.基於自適應頭狼的灰狼優化演算法[J].成都大學學報(自然科學版),2020,39(01):60-63+73.
文獻復現:基於自適應正態雲模型的灰狼優化演算法 (CGWO)
[1]張鑄,饒盛華,張仕傑.基於自適應正態雲模型的灰狼優化演算法[J/OL].控制與決策:1-6[2021-02-08]. https://doi.org/10.13195/j.kzyjc.2020.0233 .
文獻復現:改進非線性收斂因子灰狼優化演算法
[1]王正通,尤文,李雙.改進非線性收斂因子灰狼優化演算法[J].長春工業大學學報,2020,41(02):122-127.
文獻復現:一種基於收斂因子改進的灰狼優化演算法
[1]邢燕禎,王東輝.一種基於收斂因子改進的灰狼優化演算法[J].網路新媒體技術,2020,9(03):28-34.
文獻復現:基於萊維飛行和隨機游動策略的灰狼演算法(GWOM )
[1]李陽,李維剛,趙雲濤,劉翱.基於萊維飛行和隨機游動策略的灰狼演算法[J].計算機科學,2020,47(08):291-296.
文獻復現:一種改進的灰狼優化演算法(EGWO)
[1]龍文,蔡紹洪,焦建軍,伍鐵斌.一種改進的灰狼優化演算法[J].電子學報,2019,47(01):169-175.
文獻復現:改進收斂因子和比例權重的灰狼優化演算法(CGWO)
[1]王秋萍,王夢娜,王曉峰.改進收斂因子和比例權重的灰狼優化演算法[J].計算機工程與應用,2019,55(21):60-65+98.
文獻復現:一種改進非線性收斂方式的灰狼優化演算法研究(CGWO)
[1]談發明,趙俊傑,王琪.一種改進非線性收斂方式的灰狼優化演算法研究[J].微電子學與計算機,2019,36(05):89-95.
文獻復現:一種基於Tent 映射的混合灰狼優化的改進演算法(PSOGWO)
[1]滕志軍,呂金玲,郭力文,許媛媛.一種基於Tent映射的混合灰狼優化的改進演算法[J].哈爾濱工業大學學報,2018,50(11):40-49.
文獻復現:基於差分進化與優勝劣汰策略的灰狼優化演算法(IGWO)
[1]朱海波,張勇.基於差分進化與優勝劣汰策略的灰狼優化演算法[J].南京理工大學學報,2018,42(06):678-686.
文獻復現:基於 Iterative 映射和單純形法的改進灰狼優化演算法(SMIGWO)
[1]王夢娜,王秋萍,王曉峰.基於Iterative映射和單純形法的改進灰狼優化演算法[J].計算機應用,2018,38(S2):16-20+54.
文獻復現:一種基於混合策略的灰狼優化演算法(EPDGWO)
[1]牛家彬,王輝.一種基於混合策略的灰狼優化演算法[J].齊齊哈爾大學學報(自然科學版),2018,34(01):16-19+32.
文獻復現:基於隨機收斂因子和差分變異的改進灰狼優化演算法(IGWO)
[1]徐松金,龍文.基於隨機收斂因子和差分變異的改進灰狼優化演算法[J].科學技術與工程,2018,18(23):252-256.
文獻復現:一種基於差分進化和灰狼演算法的混合優化演算法(DEGWO)
[1]金星,邵珠超,王盛慧.一種基於差分進化和灰狼演算法的混合優化演算法[J].科學技術與工程,2017,17(16):266-269.
文獻復現:協調探索和開發能力的改進灰狼優化演算法(IGWO)
[1]龍文,伍鐵斌.協調探索和開發能力的改進灰狼優化演算法[J].控制與決策,2017,32(10):1749-1757.
文獻復現:基於Cat混沌與高斯變異的改進灰狼優化演算法(IGWO)
[1]徐辰華,李成縣,喻昕,黃清寶.基於Cat混沌與高斯變異的改進灰狼優化演算法[J].計算機工程與應用,2017,53(04):1-9+50.
文獻復現:具有自適應搜索策略的灰狼優化演算法(SAGWO)
[1]魏政磊,趙輝,韓邦傑,孫楚,李牧東.具有自適應搜索策略的灰狼優化演算法[J].計算機科學,2017,44(03):259-263.
文獻復現:採用動態權重和概率擾動策略改進的灰狼優化演算法(IGWO)
[1]陳闖,Ryad Chellali,邢尹.採用動態權重和概率擾動策略改進的灰狼優化演算法[J].計算機應用,2017,37(12):3493-3497+3508.
文獻復現:具有自適應調整策略的混沌灰狼優化演算法(CLSGWO)
[1]張悅,孫惠香,魏政磊,韓博.具有自適應調整策略的混沌灰狼優化演算法[J].計算機科學,2017,44(S2):119-122+159.
文獻復現:強化狼群等級制度的灰狼優化演算法(GWOSH)
[1]張新明,塗強,康強,程金鳳.強化狼群等級制度的灰狼優化演算法[J].數據採集與處理,2017,32(05):879-889.
文獻復現:一種新型非線性收斂因子的灰狼優化演算法(NGWO)
[1]王敏,唐明珠.一種新型非線性收斂因子的灰狼優化演算法[J].計算機應用研究,2016,33(12):3648-3653.
文獻復現:重選精英個體的非線性收斂灰狼優化演算法(EGWO)
[1]黎素涵,葉春明.重選精英個體的非線性收斂灰狼優化演算法[J].計算機工程與應用,2021,57(01):62-68.
https://mianbaoo.com/o/bread/aZ2Wl54=
❻ 求pascal的LIS演算法詳解!!
using namespace std;
int main()
{
int i, j, n, top, temp;
int stack[SIZE];
cin >> n;
top = 0;
/埋備* 第一個元握液嘩素可能為0 */
stack[0] = -1;
for (i = 0; i < n; i++)
{
cin >> temp;
/* 比棧頂元素大數就入棧 */
if (temp > stack[top])
{
stack[++top] = temp;
}
else
{
int low = 1, high = top;
int mid;
/* 二分檢索棧中比temp大的第一個數 */
while(low <= high)
{
mid = (low + high) / 2;
if (temp > stack[mid])
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
/* 用temp替換 */
stack[low] = temp;
}
}
/* 最長序列數就是棧的大小 */
cout << top << endl;
//system("pause"段行);
return 0;
}
❼ 動態規劃怎麼才能知道自己定義狀態數組是可行de
在使用掘做動態規劃演算法時,定義狀態數組是一個非常關鍵的步驟。下面是一些可以幫助您確定狀態乎脊數組定義是否可行的方法:
1. 明確原問題和子問題的關系。在使用動態規劃演算法時,通常是將原問題劃分為若干個子問題,並通過解決子問題來解決原問題。因此,我們需要確保狀態數組定義的狀態確實反映了原問題和子問題之間的關系。
2. 檢查狀態轉移方程是否正確。狀態數組定義後,我們需要定義狀態轉移方程來描述狀態之間的轉移關系。確保狀態轉移方程能夠正確地描述狀態之間的關系,並且不會導致重復計算等問題。
3. 檢查狀態數組的維度是否符合要求。定義狀態數組的維度應該根據原問題和子問題之間的關系來確定。確保狀態數組的維度能夠正確地反映原問題和子問題之間的關系,並且能夠覆蓋所有可能的情況。
4. 檢查狀態數組的大小是否合適。狀態數組的大小應該能夠滿足演算法運行時的需求,並且不會造成額外的空間和時間開銷。
5. 使用一些簡單的測試數據來測試演算法的正確性和效率。在實際使用動態規劃演算法時,可以使用一些簡單的測試數據來測試演算法的正確性和效率。確保演算法能夠正確地解決問題,並且能夠在合理的時間內得出結果。
總之,在定義狀態數組時,需要仔細考慮原問題和子問題之間的關系,並確保狀態數組歲散滲能夠准確地反映這種關系。如果您還不確定,可以嘗試使用一些簡單的測試數據來測試演算法的正確性和效率。
❽ diff 演算法原理
1、舊數組為空,將新數組的剩餘元素 插入 ;
2、新數組為空,將舊數組的剩餘元素 刪除 ;
3、新、舊數組都不為空,執行第二步。
數組p:與新數組的長度相同,與新數組是相互映射關系,
元素在舊數組中的索引 存儲在 元素在新數組中的位置
1、找到 P 數組的 最長遞增子序列 來做動態規劃,新集合中不屬於這個序列的將會被移動。
2、同時尾部遍歷新數組和 LIS 序列,查看元素的位置是否能與 LIS 序列的任何一個值匹配:
a:可以匹配,保留位置;
b:不能匹配,移動到到前面;
c:找不到,插入元素;
一、Python簡介
Python是一種用來編寫應用程序的高級程序設計語言,TIOBE程序語言排行榜2015年12月的排名如下:
Python實現強勢逆襲,而且我相信,隨著時間的推移,國內Python語言未來前景也是一片向好。
Python的特點是優雅簡單,易學易用(雖然我感覺還是有一些概念不容易理解),Python的哲學是盡量用最少的,最簡單易懂的代碼實現需要的功能。Python適宜於開發網路應用,腳本寫作,日常簡單小工具等等。Python的缺點是效率較低,但是在大量的場合效率卻不是那麼重要或者說Python不是其性能瓶頸,所以不要太在意。其次是2.x-3.x的過渡使得許多3.x還缺少很多2.x下的模塊,不過也在完善中。其次就是源代碼無法加密,發布Python程序其實就是發布源代碼。
二、基礎語法要點
1.如果一個字元串中有許多需要轉義的字元,而又不想寫那麼多'',那麼可以用 r'...' 表示 '...'內的內容不轉義。
2.Python可用'''...'''來表示多行內容,如:
123456>>>print('''line1line2line3''')line1line2line3
3.Python的邏輯運算and, or, not 分別對應C語言中的&&, ||, !.
4.Python的整數與浮點數大小都沒有范圍。
5.Python中除法有兩種: '/'除出來必是浮點數, '//'除出來是整數,即地板除。
6.Python中一切皆引用。每個對象都有一個引用計數器(內部跟蹤變數)進行跟蹤,引用計數值表示該對象有多少個引用,當初次產生賦給變數時,引用計數為1,其後沒進行下列行為中的任意一種都會增加引用計數:
123賦值: a=b用作函數參數傳遞: func(a)成為容器對象的一個元素: lis=[1,2,a]
以下任意一種行為都會減少引用計數:
1234del銷毀:dela變數另賦給其他對象:a=False對象從容器中刪除: lis.remove(a)身在的容器被銷毀:dellis
7.深拷貝與淺拷貝的概念與對比,有點復雜,看這篇文章
8.list,tuple和dict,set
list:為列表,是一個有序集合,類似於數組但又比數組功能強大,可以隨時append,pop元素,下標從0開始,且下標為加n模n制,即lis[-1] = lis[len-1],下標范圍[-len,len-1].
tuple:為元組,類似於list,但list為可變類型,而tuple不可變,即沒有append,pop等函數。一個建議是為了安全起見,能用tuple代替list盡量用tuple。如果tuple只有一個元素,要寫成如(1,)以避免歧義。
dict:字典類型,存放key-value鍵值對,可以根據key迅速地找出value,當然,key必須是不可變類型,如下是錯誤的:
12345>>> dic={[1,2]:'value'}Traceback (most recent call last):File"<pyshell#10>", line1,in<mole>dic={[1,2]:'value'}TypeError: unhashabletype:'list'
list與dict的優劣對比:
1234567dict:1.插入,查找速度快,跟key的數目無關2.需佔用大量內存,內存浪費嚴重list:1.插入,查找速度慢,O(n)的復雜度,隨元素個數增加而增加2.佔用內存小
dict內部存放的順序和key放入的順序是沒有關系的
set:set與dict類似,相當於只有key沒有value的dict,每個key不同,set間有 &, | 等操作對應集合的交,並操作。
三、函數
1.函數是對象,函數名即是指向對應函數對象的引用,所以可以將函數名賦給一個變數,相當於給函數起一個『別名』。
123>>> mmm=max>>> mmm(1,2,3)3
2.Python函數可以返回」多個值「,之所以打引號,是因為實際上返回的多個值拼成了一個元組,返回這個元組。
3.定義默認參數需要牢記:默認參數必須指向不變對象。否則第一次調用和第二次調用結果會不一樣,因為可變的默認參數調用後改變了。
4.可變參數:傳入的參數個數是可變的,可以是0個或多個。可變參數會將你傳入的參數自動組裝為一個tuple。在你傳入的list或tuple名字前加一個 * 即說明傳入的是可變參數。習慣寫法為*args。
5.關鍵字參數:傳入0個或多個含參數名的參數,這些參數被自動組裝成一個dict。習慣寫法**kw,如**a表示把a中所有的鍵值對以關鍵字參數的形式傳入kw,獲得一個dict,這個dict是a的一份拷貝,對kw改動不會傳遞到a
6.命名關鍵字在函數定義中跟在一個*分割符後,如
12deffunc(a,b,*,c,d):pass
c,d為命名關鍵字參數,可以限制調用者可以傳入的參數名,同時可以提供默認值。
7.參數定義順序:必選參數,默認參數,可變參數/命名關鍵字參數,關鍵字參數。
8.切片操作格式為lis[首下標:尾下標:間隔],如果都不填,即lis[::]則代表整個容器lis
9.用圓括弧()括起來一個列表生成式創建一個生成器generator,generator保存生成演算法,我們可以用next(g)取得生成器g的下一個返回值。生成器的好處就是我們不需要提前生成所有列表元素,而是需要時再生成,這在某些情況下可以節省許多內存。演算法也可以不是列表生成式而是自定義函數,只需在函數定義中包含yield關鍵字。
10.map()和rece(): 二者都是高階函數。map()接收兩個參數,一個是函數,一個是Iterable序列,map將傳入的函數依次作用在序列每一個元素上,並把結果作為新的Iterator返回。rece()類似累積計算版的map(),把一個函數作用在一個序列上,每次接收兩個參數,將結果繼續與序列的下一個元素做累積計算。
利用map和rece編寫一個str2float函數,如把字元串'123.456'轉換成浮點數123.456:
123456789101112131415(s):deff1(x,y):returnx*10+ydefchar2num(s):return{'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[s]deff2(x,y):returnx*0.1+ya,b=s.split('.')print('a=',a)print('b=',b)returnrece(f1,map(char2num,a))+0.1*rece(f2,map(char2num,b[::-1]))print('str2float('123.456') =', str2float('123.456'))
11.fliter()函數過濾序列,類似於map()作用於每一元素,根據返回值是True或者False決定舍棄還是保留該元素。函數返回一個Iterator。
12.sorted()函數可實現排序,類似於C++庫中的sort()函數,但是比其更加簡潔,語法為sorted(lis,key=func,reverse=T/F)
key函數可實現自定義的排序規則,reverse表示升序還是降序。
13.一個函數可以返回一個函數,但是返回時該函數並未執行,所以返回函數中不要引用任何可能發生變化的變數,否則會出現邏輯錯誤。
14.裝飾器(decorator): 當需要增強函數的功能卻不希望修改函數本身,那麼可以採用裝飾器這種運行時動態增加功能的方式,增加的功能卸載裝飾器函數中。如在執行前後列印'begin call'和'end call',可以這樣做:
12345678910111213141516importfunctoolsdeflog(func):@functools.wraps(func)#為了校正函數簽名,最好寫上defwrapper(*args,**kw):print('begin call')f=func(*args,**kw)print('end call')returnfreturnwrapper@logdefhah():print('hahahaha')hah()
123
begin callhahahahaend call
15.偏函數: functools.partial(),作用是將一個函數的某些參數固定住,作為新函數的參數,即固定住該參數,返回一個新函數,使調用更簡單。
四、面向對象編程
1.Python實例變數可以自由地綁定任何屬性
2.為了不讓內部屬性不被外部訪問,在屬性的名稱前加上兩個下劃線__,這樣就變成了一個私有變數(private),注意,不能直接訪問不代表一定不能訪問,事實上,加雙下劃線後Python就會將其改名為『_class名__name』,所以還是可以這樣來訪問這個『私有』變數。
3.對於靜態語言,如果要求傳入一個class類型的對象,那麼傳入的對象必須是class類型或者其子類,否則將無法調用class中的方法,而Python這樣的動態語言有『鴨子類型』一說,即不一定要傳入class類型或其子類,而只要保證傳入的對象中有要使用的方法即可。
4.如果想要限制實例可以綁定的屬性,那麼在定義class時定義一個__slots__變數即可,例如:
12classStudent(object):__slots__=(『name』,』age』)
注意,__slots__限制的屬性對當前類實例起完全限製作用,且與子類共同定義其__slots__,也就是說子類可以定義自己的__slots__,子類實例允許定義的屬性就是自身的__slots__加上父類的__slots__,即並集。
5.@ property裝飾器可以使一個getter方法變成屬性,如果方法名為me,那麼@me.setter裝飾器則可使一個setter方法變成屬性。這樣可以使代碼更簡短,同時可對參數進行必要的檢查。
6.通過多重繼承,可使子類擁有多個父類的所有功能。
7.在類中__call__方法可使實例對象像函數那樣直接調用,作用即是該方法定義的過程。
8.ORM(Object Relational Mapping 對象關系映射),就是把關系資料庫的一行映射為一個對象,也就是一個類對應一個表。ORM的實現需要通過metaclass元類修改類的定義。元類可以改變類創建時的行為。
五、調試
1.Python調試方法:
(1)直接列印
(2)斷言
(3)pdb
(4)IDE
六、IO編程
1.序列化: 把變數從內存中變成可存儲或傳輸的過程稱之為序列化。Python用pickle模塊實現序列化。序列化之後,就可以把序列化後的內容存儲到磁碟上或者通過網路進行傳輸。pickle.mps()將對象序列化成一個bytes,而pickle.loads()可以根據bytes反序列化出對象。
2.pickle雖好,但是它專為Python而生,所以要在不同語言間傳遞對象,最好還是xml或者json,而json表示格式是一個字元串,更易讀取,且比xml快,所以更加適宜於對象序列化。Python內置了json模塊,相應方法仍然是mps()和loads()。
3.但是在默認情況下,有些對象是無法序列化的,所以我們有時還需要定製轉換方法,告訴json該如何將某類對象轉換成可序列為json格式的{}對象。如下即是一個轉換方法:
123456defmantodict(std):return{'name': std.name,'age': std.age,'id': std.id}
七、進程與線程
1.Python用mutiprocessing模塊來實現多進程。
2.如果要大量創建子進程,可以使用進程池:
1frommultiprocessingimportPool
示例如下:
12345678....p=Pool(4)foriinrange(5):p.apply_async(long_time_task, args=(i,))print('Waiting for all subprocesses done...')p.close()p.join()print('All subprocesses done.')
要使用進程池需新建Pool對象,對Pool對象調用join()使等待池中所有子進程運行完畢,調用join()方法之前必須調用close(),且此後無法再新加子進程。
3.使用subprocess模塊可以方便的啟動並管理一個子進程,控制其輸入輸出。
4.進程間通信使用Queue,Pipes實現。
5.threading模塊管理線程。threading.lock()創建線程鎖,防止同時訪問互斥資源造成的錯誤,示例如下:
1234567lock=threading.Lock()...lock.acquire()...change(mutex)...lock.release()
6.ThreadLocal可以解決參數在一個線程中各個函數之間互相傳遞的問題。
7.managers模塊實現分布式進程。
八、正則表達式與常用內建模塊
1.re模塊進行正則表達式編譯和匹配,如果該表達式需要匹配很多次,那麼最好進行編譯從而大大節省時間。
正則表達式匹配郵箱例子:
12345678910importrehah=re.compile('[0-9a-zA-Z]+[.[0-9a-zA-Z]+]*@[0-9a-zA-Z]+.[a-z]{2,3}')print(hah.match('[email protected]').group())print(hah.match('[email protected]').group())i=1whilei <10:r=input('請輸入郵箱:')print(hah.match(r).group())i=i+1
2.datetime模塊進行日期和時間的處理,每一個時間對應一個timestamp,我們把1970年1月1日 00:00:00 UTC+00:00時區的時刻稱為epoch time,記為0(1970年以前的時間timestamp為負數),當前時間就是相對於epoch time的秒數,稱為timestamp。字元串和datetime也可以相互轉換,採用strptime()方法,字元串轉換為datetime時需要設定一個識別格式,其中
1%Y-%m-%d%H:%M:%S
分別表示年-月-日 時-分-秒。
從datetime得出月份,星期等字元串用strftime()方法,其中:
1%a,%b%d%H:%M
分別表示星期, 月份 日期 時:分。
示例:
12345678910fromdatetimeimportdatetimer='2015-11-23 12:01'dt=datetime.strptime(r,'%Y-%m-%d %H:%M')print(dt)week=dt.strftime('%a %b %d, %H:%M')print(week)2015-11-2312:01:00Mon Nov23,12:01
3.collections是Python內建的一個集合模塊,提供了許多有用的集合類。
4.Base64是一種任意二進制到文本字元串的編碼方法,常用於在URL、Cookie、網頁中傳輸少量二進制數據。
5.struct模塊用來解決bytes和其他二進制數據類型的轉換。
6.Python的hashlib提供了常見的哈希演算法,如MD5,SHA1等等。hashlib實現簡單登錄:
importhashlibdb={'michael':'','bob':'','alice':''}defget_md5(ostr):md5=hashlib.md5()md5.update(ostr.encode())returnmd5.hexdigest()deflogin(user, password):r=get_md5(password)fornameindb:ifdb[name]==r:returnTruereturnFalseprint(login('bob','abc999'))True
7.Python的內建模塊itertools提供了非常有用的用於操作迭代對象的函數。
8.urllib提供了一系列用於操作URL的功能。如GET,POST...
9.PIL(Python Imaging Library Python圖像庫)是一個強大的圖像處理標准庫,功能強大卻又簡單易用。現在的名字叫做Pillow。可以如下安裝Pillow:
1pip3 install pillow
從下面生成數字驗證碼的程序可以窺其一斑:
九、網路編程和電子郵件
1.網路編程主要是TCP和UDP的編程,示例見【Python網路編程】利用Python進行TCP、UDP套接字編程
2.SMTP是發送郵件的協議,Python內置對SMTP的支持,可以發送純文本郵件、HTML郵件以及帶附件的郵件。Python對SMTP支持有smtplib和email兩個模塊,email負責構造郵件,smtplib負責發送郵件。Python內置一個poplib模塊,實現了POP3協議,可以直接用來收郵件。由於現在絕大多數大型郵件服務商都採取了反垃圾郵件措施,所以這部分的簡單實驗並沒有成功,還需進一步研究,等遇到具體情況再說。
3.Python內嵌了sqlite資料庫,還可以自行安裝連接mysql,MySQL是當前最流行的開源資料庫,在行業內有著廣泛的應用。
十、Web開發和非同步IO
1.WSGI(Web Server Gateway Interface) 伺服器網關介面。
2.Python web 開發框架:
-Flask:流行的Web框架
-Django:全能型Web框架
-web.py:一個小巧的Web框架
-Bottle:和Flask類似的Web框架
-Tornado:Facebook的開源非同步Web框架
3.協程
❿ 怎樣找第二大的數,python
比如說:num_list = [98,12,45,1,2,32,90,45,23,121,11]
直接排序,輸出倒數第二個數即可。
num_list = [98,12,45,1,2,32,90,45,23,121,11]
tmp_list = sorted(num_list)
print('第二大的數是:',tmp_list[-2])
(10)lis演算法擴展閱讀:
# 最基礎的遍歷無序列表的查找演算法
# 時間復雜度O(n)
def sequential_search(lis, key):
length = len(lis)
for i in range(length):
if lis[i] == key:
return i
else:
return False
if __name__ == '__main__':
LIST = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
result = sequential_search(LIST, 123)
print(result)