Python学习的第一个难点--函数,学了这个地方的人觉得没什么好学的。学习的时候发呆,不要慌张,这就是你学编程的方式,先学习过去,然后站在上帝的角度来看,坚持签到,我一天写一篇,你可以在两天内学习一篇文章。Python中的函数是第一个难点的基础部分。函数出现的背景。为什么函数的概念会出现在编程语言中?有两个目的。在开发过程中,许多项目是由一个团队开发的。代码功能一一写成函数,方便维护。每个人也可以相对独立开发,缩短了整体开发时间。代码写成函数后,重复的函数只写一次。即其他地方可以直接调用,方便代码复用。直接写这两个用途还是不直观。你需要感受代码中函数的用法。第一次接触函数我们从这个系列的博客一开始就已经接触到了函数的概念。比如我们在第一篇文章中学到的print,它是一个内置函数,类似于len、add、sorted等,调用函数时最大的方便就是可以使用这个函数来使用你想要的效果想在不知道函数内部具体实现的情况下。函数定义的具体语法格式如下:def函数名(参数1[,参数2,参数3...]):codeblockcodeblockreturn返回值与if语句和for语句相同,并且函数定义和使用一定要注意代码缩进。函数名必须唯一,声明有意义。不要用a作为函数名,以后你可能会忘记这个函数是干什么用的。参数值不是必须的,可以根据函数的要求设置,每个参数值之间用,隔开。返回值不是必须的,可以返回多个值,用逗号分隔。注意第一行末尾的分号Functionwithnoparametersandnoreturnvalue此内容将演示使用函数的便利性。#创建一个函数defshow():print("我是一个没有参数也没有返回值的函数")print("helloworld")show()show()show()aftershow()show()函数声明,通过函数名()调用,上面代码写了5次show(),表示该函数被调用了5次。如果通过函数没有达到上面的效果,函数里面的代码需要复制5次。print("我是一个没有参数也没有返回值的函数")print("helloworld")print("我是一个没有参数也没有返回值的函数")print("helloworld")print("我我是一个没有参数也没有返回值的函数")print("helloworld")print("我是一个没有参数也没有返回值的函数")print("helloworld")print("我是一个函数没有参数也没有返回值的函数")print("helloworld")简单地复制代码就可以了。如果我现在想把hello改成hi,那么不使用函数的话我需要修改代码的5个位置,而如果使用函数只需要修改函数中的代码块一处即可。函数参数设计上面的设计是一个没有参数的函数,但是在实际应用中,很少有没有参数的函数,更多的时候需要给函数传递参数。传递一个参数函数中有参数,代码如下:#声明一个带参数的函数defshow(name):print("Thenamepassedinis:",name)show("Charlie")show("BigCharlie")show("LittleCharlie"),括号里面的名字是参数,可以直接在函数里面的代码块中使用。传递多个参数多个参数只需要在声明函数时在括号中多加几个参数即可。#声明一个多参数函数defshow(name,age):print("传入的名字是:",name,"年龄是:",age)show("查理",20)show("大查理",21)show("小查理",18)对于多个参数,一定要注意参数的位置。如果顺序错误,将导致严重的错误。在上面的代码中,Charlie将被传递给name,20将被传递给age。关键字参数(parametername=value)这个参数的使用方式是在调用函数的时候,以parametername=value的形式传递参数。其实在上面传递一个或多个参数的时候,也可以应用这种方法来传递参数,比如修改代码如下。#声明一个单参数函数defshow(name):print("Thenamepassedin:",name)show(name="Charlie")#声明一个多参数函数defshow1(name,age):print("Thenamepassedin:",name,"Theageis:",age)show1(name="Charlie",age=20)以这种形式调用函数,参数的位置不重要,因为参数的具体值已经指定。参数默认值在定义一个函数时,可以给一个参数一个默认值。如果调用函数时没有给参数赋值,程序会使用默认值而不会报错。#没有默认值的参数defshow(name):print("Thenamepassedin:",name)show()#调用这个函数会报错#有默认值的参数defshow(name="Charlie"):print("Thenamepassedinis:",name)show()#这个函数调用没有问题,即使不传参数也会使用默认值如果有参数一个默认值,注意参数一定要放在函数参数位置的末尾右边,例如下面的函数定义。defshow(a,b,c,name="Charlie"):pass函数的返回值对应的返回值是可选的,可写可不写,不写时会有返回值,并且值为无。如果returnNone函数没有写返回值,即return,那么Python会自动在函数体中添加一行代码returnNone。函数的返回值可以赋值给一个变量,通过打印变量就可以知道返回的具体内容。#没有返回值的函数defshow():print("注意下面没有return")ret=show()print(ret)得到ret值为None,表示没有返回值。如果你只写return,它也会返回None。注意下面的代码是正确的。#没有返回值的函数defshow():print("注意下面没有return")returnret=show()print(ret)returnsavalue常见的情况是函数有返回值,比如执行一个计算代码结果后返回计算。#定义一个减法函数defsub(a,b):c=a-breturnc#参数为2和1,返回结果ret=sub(2,1)print(ret)returnsmultiplevaluesusingreturn返回函数数据,一次可以返回多个值,返回的数据可以用逗号分隔。#定义一个减法函数defsub(a,b):c=a-bd=a+bf=a/breturnc,d,f#参数为2和1,返回结果ret=sub(2,1)print(ret)返回的结果是一个元组(1,3,2.0)。返回字典和列表的函数可以返回字符串类型的变量。这与返回一个值是一样的,除了具体数据类型的不同。除了上面提到的内容,函数还可以返回更复杂的数据,比如字典或列表。内容如无特殊说明,只需要将字典和列表作为普通数据类型返回即可,如以下代码。defsub1():return[1,2,3]defsub2():return{"name":"Charlie","loc":"CSDN"}函数调用时,参数为列表。为什么参数单独是一个列表?拿出来解释一下,因为list有点特殊,还引入了一个全局变量和局部变量的概念。别担心,第一次学习它是100%的困惑。如果您了解其他编程语言,那就是另一回事了。具体代码如下,注意出现的问题。names=["aaa","bbb","ccc"]defchange_list(one_names):#修改作为jjj传入的list的索引0的位置one_names[0]="jjj"#调用函数,使用nameas参数传入函数change_list(names)print(names)最后输出为['jjj','bbb','ccc'],什么意思?表示函数外的名称被函数修改。问题是,在参数内部传递时,函数外部的所有变量都会被修改吗?尝试另一个整数。score=1defchange_list(one_score):one_score=333#函数调用,并将score作为参数传入函数中change_list(score)print(score)此时虽然函数内部将score修改为333,但是函数外打印andNotmodified,还是1。现在问题来了,Python对人不一视同仁,函数中修改了list变量,影响了外部变量,而整型变量不受影响。我们先把这个坑挖好,再慢慢填上。为什么list在函数内部被修改,函数外部也会受到影响,这就涉及到内存地址空间这些更底层的概念。先了解局部变量和全局变量。局部变量和全局变量的概念非常难理解。是的,如果你理解了,在这个阶段你还是有一点知识的。在设计函数时,有时需要控制变量的使用范围。如果变量的使用范围在函数内部,那么这个变量就称为局部变量,在函数内部。如果整个程序中都使用了一个变量,那么这个变量就是一个全局变量。以上内容只是第一次接触。在函数部分,我们先简单了解一个概念。所有函数都可以使用全局变量score=1defchange_list():#输出全局变量score,因为这个变量声明在函数外,大家可以用print(score)change_list()#也可以用print(score)上面的score在函数内部没有声明,但是在函数内部也可以访问,所以函数外部的变量score是一个全局变量。函数和其他函数外不能使用局部变量defchange_list():#局部变量score,本函数可以使用score=1print(score)change_list()#局部变量score,不能在函数外使用print(score)#你不能在其他函数中使用defshow():print(score)。如果局部变量和全局变量的名称重复,编程时很容易重名。这种情况比较尴尬,新手难度不断加大。score=5555defchange_list():#局部变量score,这个函数可以使用score=6666print(score)change_list()#全局变量scoreprint(score)执行后发现全局变量值为5555在外面使用,函数内部使用的局部变量的值是6666。有了上面的基础知识点,大家要注意变量使用范围的概念,等到对象的时候再继续学习-面向。传递任意数量的参数通用参数和任意参数的组合在用Python写代码的过程中,很容易出现不知道参数有多少的情况。这时候在定义函数的时候就很难设置参数了。幸运的是,Python已经想到了这种情况。defshow(*keys):print("传入的参数可以循环打印")forkeyinkeys:print(key)show(1,2,3,4,5,6,7)函数定义时,参数位置使用*参数名,然后循环打印出函数权重的代码块位置,可以抓取任意数量的参数。如果有通用参数和不定数量的参数怎么办?很容易做到,使用下面的格式。defshow(name,age,*keys):print("传入参数可以循环打印")print(name)print(age)forkeyinkeys:print(key)show("www",18,1,2,3)我希望你现在能找到规则。调用函数时,先依次匹配函数定义的参数,一一对应。全部对应完成后,发现没有通用参数,剩下的都打包成*keys了。是不是还要写两个带*的参数,比如defshow(name,*keys,*keys1),这样会报错。通用参数和任意数量的关键字参数还有一种情况需要传递不定数量的关键字参数。这个怎么设计?defshow(**args):print("传入参数可以循环打印")forkeyinargs.items():print(key)show(name="Charlie",age=18)在这种情况下,你只要把传入的所有参数都当成字典,自动聚合成字典类型的数据。如果与一般参数相匹配,规则也非常简单。defshow(name,**args):print("传入参数可以循环打印")print(name)forkeyinargs.items():print(key)show(name="Charlie",age=18)上面的代码首先匹配关键字参数,如果匹配成功,则赋值给对应的关键字。比如上面的name变量在调用函数的时候就赋了一个橡皮擦,那么就等于橡皮擦,其余的比如age等就没有关键字参数了。相应的,我们要把它打包成**args。本文仅介绍功能后扩展功能的50%左右的内容。Python中的函数还有很多有趣的知识点,但是不能一下子吃完。设计的初衷是多翻几次才能完全掌握。延迟学习的知识点有:递归函数,匿名函数,高阶函数,现在还有一个知识点可以展开,各种参数的形式我们都学会了,有没有想过把这些结合起来,比如defshow(name,age,*arg,**args)在程序中是怎么解析的?是否可以更改顺序?defshow(name,age,sex="Male",*arg,**args):print("传入参数可以循环打印")print(name)forkeyinargs.items():print(key)show("Charlie",18,"Male",like=99)是本博客的汇总功能。初级阶段,是什么,为什么,不明白;在学习的过程中,写函数是那么舒服,面向对象中有函数好用;学习后期,赶紧实现这个功能吧,什么方法都可以,赶快下班吧。没错,功能正处在一个说难说,翻身容易的阶段。最后一碗毒鸡汤编程需要一个顿悟的时刻,很多人都没有过这个时刻。O(∩\_∩)O哈哈~
