Code:https://github.com/lotapp/BaseCode
多圖舊版:https://www.cnblogs.com/dunitian/p/9186561.html
線上程式設計:https://mybinder.org/v2/gh/lotapp/BaseCode/master
線上預覽:http://github.lesschina.com/python/base/pop/4.func.html
主要是普及一下Python基礎文法,對比着Net,新手更容易上手。
對比學習很有意思的,尤其是一些底層和思路
本來感覺函數要說的地方沒多少,細細一規劃,發現~還是單獨拉出一篇說說吧
之後就進入面向對象了,函數還是有必要了解一下的,不然到時候Class裡面的方法定義又要說了。
示範的模式一直在變,剛開始讓大家熟悉一下 <code>VSCode</code>,後來引入了 <code>ipython3</code>互動式程式設計的概念
現在就用前幾天講的 <code>Jupyter-Notebook</code>來示範了(VSCode現在也有這個預覽版的插件了)
過幾天我們會直接 像寫文章一般的Coding,一邊寫文章一邊Code,最後還能生成需要的頁面
定義一個空函數:(不寫pass就報錯了)
In [1]:
In [2]:
In [3]:
擴:文檔說明用""" 或者'''來定義,就是如下效果

In [4]:
In [5]:
In [6]:
In [7]:
來個案例解釋一下:(多傳回值隻是一種假象,Python函數傳回的仍然是單一值~元組)
多傳回參數也可以傳回一個<code>list、dict</code>來實作類似效果
In [8]:
In [9]:
In [10]:
In [11]:
In [12]:
In [13]:
In [14]:
In [15]:
Out[15]:
擴充有<code>可變類型</code>和<code>不可變類型</code>作為形參的對比
In [16]:
In [17]:
Out[17]:
In [18]:
Out[18]:
定義一個可變參數的函數(參數名字一般都是<code>*args</code>)
In [19]:
In [20]:
Out[20]:
In [21]:
Out[21]:
In [22]:
Out[22]:
來個Main傳參的擴充,貼兩張圖即可:
定義含關鍵字參數的函數:<code>def default_kv_params(name,age=23,**kv):</code>
可變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝為一個<code>tuple</code>
關鍵字參數允許你傳入0個或任意個含<code>key-value</code>的參數,自動組裝為一個<code>dict</code>
In [23]:
In [24]:
來個 綜合案例:<code>def default_god_params(name,age=23,*args,**kv):</code>
需要注意py裡面的書寫格式 ==> 先定義再調用(Code參考)
In [25]:
In [26]:
In [27]:
In [28]:
In [29]:
<code>C#</code>基礎文法大家都很熟了,我貼一個注釋的<code>Code</code>即可(Code線上)
<code>VSCode</code>裡面如果也想像VS一樣,<code>///</code>就生成注釋 ==》請安裝函數文檔注釋:XML Documentation Comments
函數遞歸調用其實就是自己調用自己,關鍵點隻要考慮什麼時候跳出即可(沒有跳出就是死循環)
先來個簡單的案例熟悉一下:
In [30]:
In [31]:
來個案例(實際工作中并不會自己定義,用系統自帶strip方法即可)
In [32]:
In [33]:
C#的遞歸我就引用一下以前的(Code)
C#上面Code中的簡寫都是用匿名函數的方式,可以參考。
這邊說說Python的匿名函數,這就沒有C#優美了,先看看公式:<code>lambda 參數: 表達式</code>
看個簡單案例實踐一下:
In [34]:
In [35]:
Out[35]:
來個經常用的排序案例:<code>data_list.sort(key=lambda x:x["key"])</code>
還有一個比較常用的地方 == > 當參數傳遞 <code>def sum(a,b,func):</code> <code>sum(1,2,lambda x,y: x+y)</code>
先看案例:
In [36]:
In [37]:
In [38]:
In [39]:
In [40]:
Out[40]:
有人可能會說,這個就太簡單了,沒啥好說的,(⊙o⊙)… <code>Python</code>還真需要說說,來個案例給你猜結果:
In [41]:
In [42]:
直接看結果吧:發現全局變量a木有被修改,而b修改了?
啥情況呢?來個簡單案例說明下吧~
In [43]:
這是因為,<code>python</code>定義一個變量的寫法不用加類型導緻的<code>(⊙﹏⊙)</code>
是以函數裡面<code>a=200</code>,python解釋器就認為 你定義了一個和a這個全局變量名字相同的局部變量
那怎麼用呢?<code>global</code>來聲明一下全局變量即可:
In [44]:
總結:
在函數中不使用<code>global</code>聲明全局變量不能修改全局變量 ==> 本質是不能修改全局變量的指向,即 不能将全局變量指向新的資料
對于 不可變類型的全局變量來說,因其 指向的資料不能修改,是以不使用<code>global</code>時無法修改全局變量
對于 可變類型的全局變量來說,因其 指向的資料可以修改,是以不使用<code>global</code>時也可修改全局變量
有人可能會問了,之前基礎部分自增自減說了一下:
<code>Python分為:可變類型:list,dict,set等等 和 不可變類型:int,str,tuple,float等等</code>
後來Dict添加修改又提了一下,還沒太清楚怎麼辦?
不用慌,今天統統解決,先來個案例看看怎麼個<code>可變和不可變</code>吧:
Out[2]:
Out[4]:
Out[5]:
這個直覺吧,先這樣了解 ==> 可變就是可修改,不可變就是不可修改
其實有個小技巧:<code>看可變不可變就看修改前和修改後的id是否相同,不同就是不可變,相同則是可變</code>
在C#或者其他語言裡面int是可以修改的,可能對Python的<code>int是不可變類型</code>有所懷疑,是以我們驗證一下
Out[6]:
Out[7]:
Out[8]:
可以看到執行 <code>i+=1</code> 時,記憶體位址都會變化,更加證明了int類型是不可變類型
再來個案例
Out[9]:
對于不可變類型<code>int</code>,無論建立多少個不可變類型,隻要值相同,都指向同個記憶體位址
不懷疑後,再來個拓展 ~ <code>float是否一樣呢</code> ?
來個案例看看
Out[12]:
Out[13]:
但是下面部分就和int不一樣咯~
聲明兩個相同值的浮點型變量,檢視它們的id,發現它們并不是指向同個記憶體位址(這點和int類型不同)
這方面涉及Python記憶體管理機制,Python對int類型和較短的字元串進行了緩存,無論聲明多少個值相同的變量,實際上都指向同個記憶體位址
總之知道<code>float</code>也是不可變類型即可
不可變看完了,來看看可變類型:
Out[16]:
下面驗證一下:當存在多個值相同的不可變類型變量時,看看它們是不是跟可變類型一樣指向同個記憶體位址:
結論:當存在多個值相同的不可變類型變量時,并不是指向同一個位址
老規矩,來個擴充:
想同一個位址怎麼辦?直接指派即可(注意下面的一種情況)
關于可變類型和不可變類型今天就到這吧,下次還會再說更高深的知識點的,盡請期待哦~
下面就進入驗證擴充系列,看看一些概念:
1.之前很多資料說python3的匿名函數裡不能調用print函數,自己測試下:
2.可變類型與不可變類型的變量分别作為函數參數的差別
感到疑惑可以看之前的運算符擴充(點我)
上面講完可變和不可變再看這個就太輕松了~
<code>Python中函數參數都是引用傳遞</code>
對于不可變類型,因變量不能修改,是以運算不會影響到變量自身
而對于可變類型來說,函數體中的運算有可能會更改傳入的參數變量
Out[25]:
Out[26]:
3.函數名能不能重複的問題
在C#或者Java之中,能不能重載:<code>具有不同的參數的類型或參數的個數【跟傳回值沒關系】</code>
結論:函數名不能重名
Out[28]:
4.這次說說兩個有趣的擴充
交換兩數這個之前就說過了,這邊再提一下:
C#的再回顧一下:
5.<code>eval</code>(和js裡面的eval差不多):不太建議使用
作者:毒逆天
出處:https://www.cnblogs.com/dotnetcrazy
打賞:<b>18i4JpL6g54yAPAefdtgqwRrZ43YJwAV5z</b>
本文版權歸作者和部落格園共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接!