天天看點

Python3 與 C# 基礎文法對比(Function專欄)

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]:

擴:文檔說明用""" 或者'''來定義,就是如下效果

Python3 與 C# 基礎文法對比(Function專欄)

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傳參的擴充,貼兩張圖即可:

Python3 與 C# 基礎文法對比(Function專欄)
Python3 與 C# 基礎文法對比(Function專欄)

定義含關鍵字參數的函數:<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裡面的書寫格式 ==&gt; 先定義再調用(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>

還有一個比較常用的地方 == &gt; 當參數傳遞 <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>聲明全局變量不能修改全局變量 ==&gt; 本質是不能修改全局變量的指向,即 不能将全局變量指向新的資料

對于 不可變類型的全局變量來說,因其 指向的資料不能修改,是以不使用<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]:

這個直覺吧,先這樣了解 ==&gt; 可變就是可修改,不可變就是不可修改

其實有個小技巧:<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>

本文版權歸作者和部落格園共有。歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接!