Jupyter最新排版:http://www.javashuo.com/article/p-obgfrmjz-g.htmlhtml
昨晚開始寫大綱作demo,今天犧牲中午休息時間碼文一篇,但願你們點點贊 O(∩_∩)Opython
NetCore:https://github.com/lotapp/BaseCode/tree/master/netcore/1_POP/6funcgit
Python:https://github.com/lotapp/BaseCode/tree/master/python/1.POP/4.func_IOgithub
在線演示:http://nbviewer.jupyter.org/github/lotapp/BaseCode/tree/master/python/notebook/1.POP/4.func編程
在線編程:https://mybinder.org/v2/gh/lotapp/BaseCode/masterapp
主要是普及一下Python基礎語法,對比着Net,新手更容易上手。對比學習頗有意思的,尤爲是一些底層和思路函數
原本感受函數要說的地方沒多少,細細一規劃,發現~仍是單獨拉出一篇說說吧,以後就進入面向對象了,函數仍是有必要了解一下的,否則到時候Class裏面的方法定義又要說了。學習
演示的模式一直在變,剛開始讓你們熟悉一下VSCode,後來引入了ipython交互式編程的概念,如今就用前幾天講的Notebook來演示了(VSCode如今也有這個預覽版的插件了)測試
直接跳到擴展系列:https://www.cnblogs.com/dotnetcrazy/p/9175950.html#extspa
先從函數定義提及吧:
# 定義一個空函數:(不寫pass就報錯了)
# 定義一個無參函數(注意縮進)
# 定義一個含參函數
擴:文檔說明用""" 或者'''來定義,就是以下效果
# 定義一個含默認參數(缺省參數)的函數
# 定義有返回值的函數
# 定義含有多個返回值的函數(利用了元組)
來個案例解釋一下:(多返回值只是一種假象,Python函數返回的仍然是單一值~元組)
傳多個參數系列:(上面那個多返回參數也能夠返回一個list來實現相似效果)
引用傳遞(經過元組、列表實現):擴展有可變類型和不可變類型做爲形參的對比
# 定義一個可變參數的函數(參數名字通常都是*args)
若是你須要傳一個元組或者列表進去的話,能夠 參數前面加*# 定義含關鍵字參數的函數:def default_kv_params(name,age=23, **kv):# 可變參數容許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝爲一個tuple
# 關鍵字參數容許你傳入0個或任意個含key-value的參數,自動組裝爲一個dict來個綜合案例:def default_god_params(name,age=23,*args,**kv):
須要注意py裏面的書寫格式==》 先定義再調用 (Code參考)
NetCore:(C#基礎語法你們都很熟了,我貼一個註釋的Code便可)VSCode裏面若是也想像VS同樣,///就生成註釋==》請安裝函數文檔註釋:XML Documentation Comments
using System; using System.Collections.Generic; namespace _6func { class Program { static void Main(string[] args) { #region Base // # 定義一個空函數: Method(); // # 定義一個無參函數 GetName(); // # 定義一個含參函數 ShowInfos("李四", 22); // # 定義一個含默認參數(缺省參數)的函數 DefaultParam("張三"); // # 定義有返回值的函數 int result = DivHaveReturn(1, 2); Console.WriteLine($"計算結果爲{result}"); #endregion // # 定義含有多個返回值的函數(利用了元組) var (sum, dvalue) = DivHaveReturns(1, 2); Console.WriteLine($"sum:{sum},D-value:{dvalue}"); // 傳多個參數系列: // 引用傳遞(經過元組、列表實現):擴展有可變類型和不可變類型做爲形參的對比 var list = new List<int>() { 1, 2, 3, 4, 5 }; Console.WriteLine(DefaultSomeParams(list)); Console.WriteLine(list.Count);//這就是引用傳遞的證實 // # 定義一個可變參數的函數(參數名字通常都是*args) Console.WriteLine(DefaultParams(1, 2, 3, 4, 5)); // # 定義含關鍵字參數的函數 直接傳Dict } #region base /// <summary> /// 定義一個空函數 /// </summary> private static void Method() { } /// <summary> /// 定義一個無參函數 /// </summary> // private static void GetName() // { // Console.WriteLine("你好"); // } //簡寫 private static void GetName() => Console.WriteLine("你好"); /// <summary> /// 定義一個含參數的函數 /// </summary> /// <param name="name">名字</param> /// <param name="age">年齡</param> // private static void ShowInfos(string name, int age) // { // Console.WriteLine($"我叫{name} 個人年齡是{age}"); // } //簡寫 private static void ShowInfos(string name, int age) => Console.WriteLine($"我叫{name} 個人年齡是{age}"); /// <summary> /// 定義一個含缺省參數的函數 /// </summary> /// <param name="name">名字</param> /// <param name="age">年齡默認23</param> // private static void DefaultParam(string name, int age = 23) // { // Console.WriteLine($"我叫{name} 個人年齡是{age}"); // } //簡寫 private static void DefaultParam(string name, int age = 23) => Console.WriteLine($"我叫{name} 個人年齡是{age}"); /// <summary> /// 定義一個有返回值的函數(計算a+b,返回計算結果) /// </summary> /// <param name="a">num1</param> /// <param name="b">num2</param> // private static int DivHaveReturn(int a, int b) // { // return a + b; // } //簡寫 private static int DivHaveReturn(int a, int b) => a + b; #endregion /// <summary> /// 定義含有多個返回值的函數(利用了元組) /// 計算a+b的和,計算a-b,並返回兩個結果 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> // private static (int sum,int dValue) DivHaveReturns(int a, int b) // { // return ((a+b),(a-b)); // } //簡寫 private static (int sum, int dValue) DivHaveReturns(int a, int b) => ((a + b), (a - b)); #region 傳入多個參數系列 /// <summary> /// 利用列表實現,引用傳遞之類的C#還有ref和out,這邊就不說了 /// </summary> /// <param name="nums"></param> /// <returns></returns> private static int DefaultSomeParams(List<int> numList) { int sum = 0; foreach (var item in numList) { sum += item; } numList.Clear(); return sum; } /// <summary> /// 定義一個可變參數的函數 /// </summary> /// <param name="args"></param> /// <returns></returns> private static int DefaultParams(params int[] args) { int sum = 0; foreach (var item in args) { sum += item; } return sum; } #endregion } }
1.遞歸函數:函數遞歸調用其實就是本身調用本身,關鍵點只要考慮何時跳出便可(沒有跳出就是死循環)先來個簡單的案例熟悉一下:來個案例(實際工做中並不會本身定義,用系統自帶 strip方法便可)C#的遞歸我就引用一下之前的Code: https://github.com/dunitian/LoTCodeBase/blob/master/NetCode/1.面向過程/01.基礎/10.遞歸案例/Program.cs
2.匿名函數系列:lambda 參數: 表達式來個常常用的案例:data_list.sort( key=lambda x:x["key"])還有一個比較經常使用的地方:( 當參數傳遞)NetCore:上面Code中的簡寫都是用匿名函數的方式,能夠參考
3.全局變量和局部變量有人可能會說,這個就太簡單了,沒啥好說的,(⊙o⊙)… Python還真須要說說,來個案例給你猜結果:直接看結果吧:發現 全局變量a木有被修改,而b修改了仍是來個簡單案例說明下吧~# 這是由於,python定義一個變量的寫法不用加類型致使的(⊙﹏⊙) 因此函數裏面a=200,python解釋器就認爲你定義了一個和a這個全局變量名字相同的局部變量,那怎麼用呢?global來聲明一下全局變量便可:
總結:# 在函數中不使用global聲明全局變量不能修改全局變量==>本質是不能修改全局變量的指向,即不能將全局變量指向新的數據# 對於不可變類型的全局變量來講,因其指向的數據不能修改,因此不使用global時沒法修改全局變量# 對於可變類型的全局變量來講,因其指向的數據能夠修改,因此不使用global時也可修改全局變量
下面就進入驗證擴展系列,看看一些概念:# 以前不少資料說py3 匿名函數裏不能調用print函數,本身測試下
# 可變類型與不可變類型的變量分別做爲函數參數的區別# 感到疑惑能夠看以前的運算符擴展( http://www.javashuo.com/article/p-ftgdkctm-g.html)# Python中函數參數都是引用傳遞
# 對於不可變類型,因變量不能修改,因此運算不會影響到變量自身
# 而對於可變類型來講,函數體中的運算有可能會更改傳入的參數變量
# 函數名能不能重複的問題(能不能 重載:具備不一樣的參數的類型或參數的個數【跟返回值不要緊】)結論:函數名不能重名
來兩個有趣的擴展:1.交換兩個數熟悉吧,編程第一課,除了用 第三變量 或者 兩數相加減 實現外,Python還有一種 新方式: a,b=b,aNetCore:這個我也是剛知道,O(∩_∩)O哈哈~還得謝謝評論區的兄弟^_^
2.eval(和js裏面的eval差很少):不太建議使用