如何簡單粗暴理解函式

2022-05-04 21:06:07 字數 3117 閱讀 1430

一、初次見面,請多關照。

# 計算列表內的元素個數。

# 用程式設計去計算

li=[1,2,3,4,5,6,6,5,4]

count=0

for i in li:

count += 1

print(count)

# 如果再計算字串的元素個數還得再寫一段同樣的**。

# 重複**較多。

# 可讀性差。

# 解決上述問題就需要 函式式程式設計 。

# 用函式去計算。設計乙個函式,用一段**解決同一類問題。

# 只要一呼叫函式名,函式就執行,就可以算出。不用再造重複程式。

# 所以,函式名必須具有可描述性,要不然怎麼知道這個函式是什麼功能,函式一多了就亂了。

# 函式名的命名規範和變數的命名規範一樣。

a=len(li)

print(a)

# len 就是乙個函式。

# 函式的作用:

# 避免重複**,增強可讀性。

# 函式的特點:

# 以功能為導向。

# 函式能針對不同的物件使用。

# 用函式寫**,**的利用率較高。

二、認識一下。

#  def 函式名:(英文的冒號)

# pass (函式體)

# 程式看到def這個關鍵字就會知道這是乙個函式,函式體裡面的內容先不執行。

# 因為他不知道你要用函式幹什麼,所以先把函式體存下來。

# 等下面用到的時候再執行函式。但是程式怎麼知道你要用函式呢?

# 這就需要你給她乙個提醒,只要一看見函式名加(),就知道你要用函式了,他就會執行函式體裡面的內容。

# 執行完函式之後得有乙個結果啊,因為函式的功能就是通過函式體的計算讓呼叫者得到乙個結果的。

# 所以,就得有乙個東西把結果丟擲來,這個東西就是return關鍵字,

# 只要程式一看到這個關鍵字,就會結束函式體,把結果拋給執行者,這個結果就是返回值。

# 返回值有單個的,也有多個的,單個的直接扔出去就行了,但是多個的怎麼一下子仍出去啊,一抖漏全都亂了,

# 所以,如果是多個值,他會以元組形式返回,先打包,再把包扔出去。

三、原來如此。

# 之前說到函式是要經過處理得到乙個結果的,那麼就需要考慮了,

# 既然函式有處理不同物件的功能,那麼,他是怎麼做到的呢?

# 這就涉及到了函式的引數,和函式的傳參

# 可以這麼想,函式體是乙個機器,想要加工出不同的東西,就需要塞進去不同的東西,當然也需要機器能接收不同的東西。

# 接收東西的口,就相當於形參,塞進去的東西就相當於實參,只要有了乙個口,就可以塞進每個不同的東西,

# 這就模擬函式可以處理不同的資料型別。塞進去的是玉公尺,出來的就是玉公尺麵,塞進去的是小麥,出來的就是白面。

# 塞進去的這個過程就叫函式的傳參。其實形參就是和實參形體大小差不多,性質差不多的乙個可以容納多個品類的乙個位置。

#

說到傳參就應該看實參和形參具體有什麼了。

先從要處理的東西看,即實參角度。

乙個函式體,可以一次一次的輸入東西,比如說磨麵機;也可以一起塞進去好多東西,比如說做冰激凌。

要想得到冰激凌,就得塞進去奶油,水,色素等,但是塞進去這麼多東西不能亂塞啊,亂塞就成一鍋亂粥了。

所以就得按位置乙個乙個傳進去,第乙個放奶油,第二個放水,第三個放色素,機器會按位置依次加工。

這就是實參的位置引數,實參的位置引數必須和形參一一對應,而且數量必須相同。

那麼問題又來了,如果實參傳進去的是乙個個帶標籤的東西呢?

這樣的話位置就不用和形參一一對應了,機器進行加工的時候會自動檢視標籤,按標籤依次放入該放的位置。

這就是實參的關鍵字引數,但是數量必須和形參相等。

那如果有的有標籤,有的沒有標籤怎麼辦呢?這就涉及到電腦的內部機制了,

他會先把沒有標籤的接收,然後再接收有標籤的,如果接收完有標籤的又有乙個沒有標籤的,他就會報錯。

所以,實參中如果有混合引數,就得把帶標籤的放後面,即關鍵字引數必須放後面。

這樣,機器就會先讓前面的一一對應放進去,再讓後面的按標籤進去。

從要處理的東西角度分析完了,

就應該從機器的角度分析了,即形參角度。

機器的口如何設計呢?

首先,機器的口可以簡單設計一下,讓口和塞進的東西一一對應,比如冰激凌機器,設計3個口,

但是位置和個數必須和實參一一對應。

還有一種情況,3個員工依次放3個東西,那如果我第三個員工曠工沒來怎麼辦?

這就需要我設計乙個自動放東西的口,第3個員工不是沒來嗎,我機器自動放,

預設第三個就放色素,第三個員工有沒有就無所謂了。這就是預設引數,

只要對應的實參位置沒有,就預設放進乙個東西,如果有,就換成實參裡面的東西。

但是預設引數必須放在位置引數後面,這也是電腦機制,

可以這樣理解,機器造東西必須把罷工的位置放在最後,不影響前面加工。

還有一種更牛的設計,就是機器的公升級版,裡面可以放很多不同的東西,

依次接收完之後,先按順序排好,然後再讓機器加工,這就不用乙個口對應放乙個位置了,這就是動態引數*args

動態引數的口大小可以改變所以叫動態引數,可以乙個口接收多個不同的東西,但是接受的東西不能帶標籤。

所以,動態引數接收的是實參中所有的位置引數。接收完之後先打包到一塊兒,成元組形式。用的時候在按順序依次拿出來。

那帶標籤的怎麼辦呢?同理,設計乙個**kwargs,接收所有帶標籤的,按標籤關係,打包成乙個個鍵值對,存放到字典裡。

這就是傳說中的兩種萬能引數,可以接收實參中的任何引數。

機器有了這四種口,還得有乙個接收順序,之前說過預設引數必須在位置引數後面,這四種引數一塊兒有怎麼辦呢?

根據形參的接收風格和實參的排序位置得知,形參設計時位置順序是

位置引數,*args,預設引數,**kwargs。

什麼意思呢?就是說你們先挨個兒,拿不了剩下的我都拿走,先讓單個兒對應的放前面,再讓最後的兜底。

如果讓拿的多的先拿,就會把後面的拿走,後面想拿的拿不了了,就會打架,報錯。

這就是我對函式大概的乙個簡單粗暴的了解。

簡單粗暴理解匈牙利演算法

書本上的演算法往往講得非常複雜,我和我的朋友計畫用一些簡單通俗的例子來描述演算法的流程 匈牙利演算法是由匈牙利數學家edmonds於1965年提出,因而得名。匈牙利演算法是基於hall定理中充分性證明的思想,它是部圖匹配最常見的演算法,該演算法的核心就是尋找增廣路徑,它是一種用增廣路徑求二分圖最大匹...

C memset簡單粗暴的理解

memset函式本來是c語言中對char陣列的整體賦值函式。但是我們一般都是要用它來對int陣列或者其他型別的陣列進行整體初始化。具體操作如下 int array 10 memset array,0,sizeof array int array 10 memset array,1 sizeof ar...

簡單粗暴地理解動態規劃

動態規劃可以說是做題時比較難以理解的演算法了,我之前也不是很理解,直到在隨機過程中學習了馬爾科夫過程後,再看動態規劃就覺得很簡單了。本文只是幫助簡單粗暴的理解動態規劃,熟練地運用需要親自進行大量的習題練習。一 動態規劃適合解決什麼樣的問題?1 問題具有最優子結構 舉乙個直白易懂的例子 求你走路的時候...