昨晚开始写大纲做demo,今天牺牲中午休息时间码文一篇,希望大家点点赞O(∩_∩)O NetCore: st" />
快捷搜索:
来自 67677新澳门手机版 2019-11-10 13:40 的文章
当前位置: 67677新澳门手机版 > 67677新澳门手机版 > 正文

基础语法对比

Jupyter最新排版:

Jupyter最新版:https://www.cnblogs.com/dotnetcrazy/p/9155310.html

style="color: #3366ff;">昨晚开始写大纲做demo,今天牺牲中午休息时间码文一篇,希望大家点点赞 O(∩_∩)O

NetCore: style="color: #008000;">https://github.com/lotapp/BaseCode/tree/master/netcore/1_POP/6func

Python: style="color: #008000;">https://github.com/lotapp/BaseCode/tree/master/python/1.POP/4.func_IO

在线演示: style="color: #008000;">http://nbviewer.jupyter.org/github/lotapp/BaseCode/tree/master/python/notebook/1.POP/4.func

style="color: #008000;">在线编程

主要是普及一下Python基础语法,对比着Net,新手更容易上手。对比学习很有意思的,尤其是一些底层和思路

本来感觉函数要说的地方没多少,细细一规划,发现~还是单独拉出一篇说说吧,之后就进入面向对象了,函数还是有必要了解一下的,不然到时候Class里面的方法定义又要说了。

演示的模式一直在变,刚开始让大家熟悉一下 style="color: #ff6600;">VSCode,后来引入了 style="color: #008000;">ipython交互式编程的概念,现在就用前几天讲的 style="color: #ff0000;">Notebook来演示了(VSCode现在也有这个预览版的插件了)

在线演示: style="color: #008000;">http://nbviewer.jupyter.org/github/lotapp/BaseCode/blob/master/python/notebook/1.POP/3.list_tuple_dict

更新: style="color: #ff0000;">新增Python可变Tuple、List切片、Set的扩展:https://www.cnblogs.com/dotnetcrazy/p/9155310.html#extend 

今天说说List和Tuple以及Dict。POP部分还有一些如Func、IO(也可以放OOP部分说)然后就说说面向对象吧。

先吐槽一下:Python面向对象真心需要规范,不然太容易走火入魔了 -_-!!! 汗,下次再说。。。

对比写作真的比单写累很多,希望大家多捧捧场 ^_^

直接跳到扩展系列:https://www.cnblogs.com/dotnetcrazy/p/9175950.html#ext

进入扩展:https://www.cnblogs.com/dotnetcrazy/p/9155310.html#ext

先从函数定义说起吧:

步入正题:

# style="color: #ff6600;">定义一个空函数:(不写pass就报错了)

图片 1


#  style="color: #ff6600;">定义一个无参函数注意缩进

图片 2


定义一个含参函数

图片 3

扩:文档说明用""" 或者'''来定义,就是如下效果

图片 4


#  style="color: #ff6600;">定义一个含默认参数(缺省参数)的函数

图片 5

# 定义有返回值的函数

图片 6


# style="color: #ff6600;">定义含有多个返回值的函数(利用了元组)

图片 7

来个案例解释一下:(多返回值只是一种假象,Python函数返回的仍然是单一值~元组)

图片 8


style="color: #ff00ff;">传多个参数系列:(上面那个多返回参数也可以返回一个list来实现类似效果)

style="color: #ff6600;">引用传递(通过元组、列表实现)**扩展有可变类型和不可变类型作为形参的对比

图片 9


# style="color: #ff6600;">定义一个可变参数的函数(参数名字一般都是 style="color: #ff6600;">*args)

图片 10

如果你需要传一个元组或者列表进去的话,可以参数前面加 style="color: #ff6600;">*

图片 11

# style="color: #ff6600;">定义含关键字参数的函数:def default_kv_params(name,age=23, style="color: #ff6600;">**kv):

# 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple
# 关键字参数允许你传入0个或任意个含key-value的参数,自动组装为一个dict

图片 12

来个综合案例:def default_god_params(name,age=23,*args,**kv):

图片 13

需要注意py里面的书写格式==》 style="color: #ff6600;">先定义再调用(Code参考)

图片 14


style="color: #008000;">NetCore:(C#基础语法大家都很熟了,我贴一个注释的Code即可)

style="color: #ff6600;">VSCode里面如果也想像VS一样,///就生成注释==》请安装函数文档注释: style="color: #ff0000;">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() { 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()
        {


} ///

/// 定义一个无参函数 /// // private static void GetName() // { // Console.WriteLine("你好"); // } //简写 private static void GetName() => Console.WriteLine("你好");
/// /// 定义一个含参数的函数 /// /// 名字 /// 年龄 // private static void ShowInfos(string name, int age) // { // Console.WriteLine($"我叫{name} 我的年龄是{age}"); // } //简写 private static void ShowInfos(string name, int age) => Console.WriteLine($"我叫{name} 我的年龄是{age}");
/// /// 定义一个含缺省参数的函数 /// /// 名字 /// 年龄默认23 // 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}");
/// /// 定义一个有返回值的函数(计算a b,返回计算结果) /// /// num1 /// num2 // private static int DivHaveReturn(int a, int b) // { // return a b; // } //简写 private static int DivHaveReturn(int a, int b) => a b;

        #endregion


///

/// 定义含有多个返回值的函数(利用了元组) /// 计算a b的和,计算a-b,并返回两个结果 /// /// /// /// // 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.列表相关:

style="color: #ff0000;">1.递归函数:函数递归调用其实就是自己调用自己,关键点只要考虑什么时候跳出即可(没有跳出就是死循环)

先来个简单的案例熟悉一下:

图片 15

来个案例(实际工作中并不会自己定义,用系统自带 style="color: #ff6600;">strip方法即可)

图片 16

C#的递归我就引用一下以前的Code:https://github.com/dunitian/LoTCodeBase/blob/master/NetCode/1.面向过程/01.基础/10.递归案例/Program.cs

图片 17


2.匿名函数系列: style="color: #008000;">lambda 参数: 表达式

图片 18

来个经常用的案例:data_list.sort(key=lambda x:x["key"])

图片 19

还有一个比较常用的地方:(当参数传递

图片 20

NetCore:上面Code中的简写都是用匿名函数的方式,可以参考


3.全局变量和局部变量 

有人可能会说,这个就太简单了,没啥好说的,(⊙o⊙)… Python还真需要说说,来个案例给你猜结果:

图片 21

直接看结果吧:发现全局变量a木有被修改,而b修改了

图片 22

还是来个简单案例说明下吧~

图片 23

# 这是因为,python定义一个变量的写法不用加类型导致的(⊙﹏⊙) 所以 style="color: #008000;">函数里面a=200,python解释器就认为你定义了一个和a这个全局变量名字相同的局部变量,那怎么用呢? style="color: #ff0000;">global来声明一下全局变量即可:

图片 24

总结:

# 在函数中不使用 style="color: #ff0000;">global声明全局变量不能修改全局变量==>本质是不能修改全局变量的指向,即不能将全局变量指向新的数据

# 对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量

# 对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量


style="color: #008000;">下面就进入验证扩展系列,看看一些概念

# 之前很多资料说py3匿名函数里不能调用print函数,自己测试下

图片 25


# 可变类型与不可变类型的变量分别作为函数参数的区别

# 感到疑惑可以看之前的运算符扩展()

图片 26

# Python中函数参数都是引用传递
# 对于不可变类型,因变量不能修改,所以运算不会影响到变量自身
# 而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量


# 函数名能不能重复的问题(能不能 style="color: #008000;">重载:具有不同的参数的类型或参数的个数【跟返回值没关系】

图片 27

结论:函数名不能重名


来两个有趣的扩展

style="color: #ff6600;">1.交换两个数熟悉吧,编程第一课,除了用第三变量 或者 两数相加减 实现外,Python还有一种新方式 style="color: #ff0000;">a,b=b,a

图片 28

NetCore:这个我也是刚知道,O(∩_∩)O哈哈~还得谢谢评论区的兄弟^_^

图片 29


 2. style="color: #ff6600;">eval(和js里面的eval差不多): style="color: #008000;">不太建议使用

 图片 30

style="color: #ff6600;">Python定义一个列表(列表虽然可以存不同类型,一般我们把相同类型的值存列表里面,不同类型存字典里(key,value))

info_list=[] #空列表

style="color: #ff6600;">infos_list=["C#","JavaScript"]

遍历和之前一样,for 或者 while 都可以(for扩展:)

图片 31

NetCore style="color: #ff6600;">var infos_list = new List<object>() { "C#", "JavaScript" };

遍历可以用foreach,for,while

图片 32


Python列表的添加

# 末尾追加 infos_list. style="color: #ff6600;">append("Java")

#  style="color: #ff6600;">添加一个列表 infos_list. style="color: #ff6600;">extend(infos_list2)

# style="color: #ff6600;">指定位置插入 infos_list. style="color: #ff6600;">insert(0,"Python") 

# 插入列表:infos_list style="color: #ff6600;">.insert(0,temp_list) 

 看后面的 style="color: #339966;">列表嵌套,是通过下标方式获取,eg: infos_list[0][1]

图片 33

style="color: #ff6600;">Python在指定位置插入列表是真的插入一个列表进去,C#是把里面的元素挨个插入进去

图片 34

style="color: #ff6600;">NetCore:Add,AddRange,Insert,InsertRange (和Python插入列表有些区别)

图片 35


Python列表删除系列

infos_list.pop() #删除最后一个

infos_list.pop(0) #删除指定索引,不存在就报错

infos_list. style="color: #ff6600;">remove("张三")  style="background-color: initial;"># remove("")删除指定元素 style="background-color: initial;">,不存在就报错

图片 36

style="color: #ff6600;">del infos_list[1] #删除指定下标元素,不存在就报错

del infos_list #删除集合(集合再访问就不存在了)不同于C#给集合赋null

图片 37

再过一遍图片 38

style="color: #ff6600;">NetCore移除指定索引:infos_list. style="color: #ff6600;">RemoveAt(1); 移除指定值: infos_list. style="color: #ff6600;">Remove(item); 清空列表: infos_list. style="color: #ff6600;">Clear();

图片 39


style="color: #ff6600;">Python修改:(只能通过索引修改)

infos_list2[1]="PHP" #只有下标修改一种方式, style="background-color: initial;">不存在则异常

# 想按值修改需要先查下标再修改 eg:

infos_list2.index("张三")

infos_list2[0]="GO"

# infos_list2.index("dnt")#不存在则异常

style="color: #000000;">图片 40

# 知识面拓展:

# 为什么python中不建议在for循环中修改列表?

# 由于在遍历的过程中,删除了其中一个元素,导致后面的元素整体前移,导致有个元素成了漏网之鱼。

# 同样的,在遍历过程中,使用插入操作,也会导致类似的错误。这也就是问题里说的无法“跟踪”元素。

# 如果使用while,则可以在面对这样情况的时候灵活应对。

NetCore:基本上和Python一样

图片 41


style="color: #ff6600;">Python查询系列:in, not in, index, count

if "张三" in names_list:

  names_list.remove("张三")

if "大舅子" not in names_list:

  names_list.append("大舅子")

names_list.index("王二麻子")

names_list.count("逆天")

style="color: #000000;">图片 42

NetCore: style="color: #008000;">IndexOf , style="color: #008000;">Count

图片 43

查找用 style="color: #008000;">Contains,其他的先看看,后面会讲

图片 44


Python排序 style="background-color: initial;"> 

num_list.reverse()  style="background-color: initial;"># 倒序

num_list.sort()  style="background-color: initial;"># 从小到大排序

num_list. style="color: #ff6600;">sort(reverse=True)  style="background-color: initial;"># 从大到小

图片 45

style="color: #ff6600;">列表嵌套,获取用下标的方式: style="color: #ff6600;">num_list[5][1]

图片 46

NetCorevar num_list2 = new List<object>() { 33, 44, 22, style="color: #008000;">new List<object>(){11,55,77} };

不能像python那样下标操作,可以定义多维数组来支持 num_list2[i][j] (PS,其实这个嵌套不太用,以后都是列表里面套Dict,类似与Json)

图片 47

 

2.Tuple 元组

先到这吧,有什么扩充的下面再贴吧~

这次先说 style="color: #008000;">NetCore吧:(逆天ValueTuple用的比较多,下面案例就是用的这个)

元组系:

值元组:

 

style="font-size: 15px;">C#中元组主要是方便程序员,不用自然可以。 style="background-color: initial;">比如:当你返回多个值是否还用ref out 或者返回一个list之类的? style="background-color: initial;"> 这些都需要先定义,比较麻烦.元祖在这些场景用的比较多。 style="background-color: initial;">先说说基本使用:

 

style="background-color: initial;">初始化: style="background-color: initial;">var test_tuple = ("萌萌哒", 1, 3, 5, "加息", "加息"); //这种方式就是valueTuple了(看vscode监视信息)

图片 48

需要说下的是,取值只能通过itemxxx来取了,然后就是 style="color: #ff6600;">valueTuple的值是可以修改的

图片 49

忽略上面说的(一般不会用的),直接进应用场景:

图片 50

就说到这了,代码部分附录是有的

 

style="color: #ff6600;">Python:用法基本上和列表差不多( style="color: #ff0000;">下标和前面说的用法一样,比如test_tuples[-1] 最后一个元素)

定义:一个元素:test_tuple1= style="color: #ff6600;">(1,)

 

test_tuple=("萌萌哒",1,3,5,"加息","加息")

test_tuple. style="color: #ff6600;">count("加息")

test_tuple. style="color: #ff6600;">index("萌萌哒")  style="background-color: initial;">#没有find方法

test_tuple.index("加息", 1, 4) #从特定位置查找, style="background-color: initial;">左闭右开区间==>[1,4)

图片 51

来说说拆包相关的,C#的上面说了,这边来个案例即可:

a=(1,2)

b=a #把a的引用给b

c,d=a #不是把a分别赋值给c和d,等价于: style="color: #ff6600;">c=a[0] d=a[1]

图片 52

来个扩展吧(多维元组)

some_tuples=[(2,"萌萌哒"),(4,3)]

some_tuples[0]

some_tuples[0][1]

图片 53

本文由67677新澳门手机版发布于67677新澳门手机版,转载请注明出处:基础语法对比

关键词: