Python3 與 NetCore 基礎語法對比(Function專欄)

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方法便可)

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,a
NetCore:這個我也是剛知道,O(∩_∩)O哈哈~還得謝謝評論區的兄弟^_^

  2.eval(和js裏面的eval差很少):不太建議使用
 
 
先到這吧,有什麼擴充的下面再貼吧~
相關文章
相關標籤/搜索