Python学习的第一个难关--函数,这个地方学会的人觉得没有啥,没学过的学的时候迷迷瞪瞪,不用慌,学编程就是这样,先学过去,在从上帝视角去看,坚持打卡,我一天写一篇,你可以两天学一篇。
已完成的文章
1.这才是Python学习的正确起手姿势,滚雪球学Python[1]2.无门槛学会数据类型与输入、输出函数,滚雪球学Python[2]3.无转折不编程,滚雪球学Python[3]4.列表一学完,Python会一半,滚雪球学Python[4]5.Python循环的本质就是一段代码懒得重复写[5]6.Python元组,不可变的列表,滚雪球学Python[6]7.会查新华字典不?会。Python字典已经掌握了[7]8.Python集合三板斧,滚雪球学Python[8]
九、Python中函数是基础部分第一道难关
9.1函数出现的背景
为什么在编程语言中会出现函数概念,目的有2个。
1.在开发的时候,很多项目都是团队开发,把代码功能编写成一个个的函数,方便维护,每个人也可相对独立的开发,缩短整体开发时间2.代码编写成函数以后,重复的功能只写一次即可,其它地方可以直接调用,方便了代码的复用。
直接写出这两个目的还是没有直观的感受,要在代码中感受函数的用法。
9.2函数初接触
咱从本系列博客一开始就已经接触函数的概念了,例如第一篇就学习的print,就是一个内置函数,相似的还有len、add、sorted这些,调用函数时最大的便捷性就是不用知道函数内部的具体实现,就可以用该函数使用自己想要的效果。
9.2.1函数的定义
具体的语法格式如下:
def函数名称(参数1[,参数2,参数3...]):代码块代码块return返回值
跟if语句,for语句一样,函数定义与使用的时候要注意下代码缩进。
函数名称必须是唯一的,进行声明的有意义,不要使用a当做函数名,以后很有可能就忘记了这个函数是做什么用的。
参数值,非必须,根据函数的要求自行设定即可,各个参数值之间用,分隔。
返回值,非必须,返回多个值使用逗号,分隔即可。
注意第一行末尾的分号
9.2.2无参数无返回值的函数
该内容将演示函数的使用便捷性。
#创建一个函数defshow():print("我是一个无参数无返回值的函数")print("helloworld")show()show()show()show()show()
函数声明之后,通过函数名()进行调用,上面的代码写了5次show(),表示函数被调用了5次。
如果不通过函数实现上文效果,需要将函数内部的代码复制5次。
print("我是一个无参数无返回值的函数")print("helloworld")print("我是一个无参数无返回值的函数")print("helloworld")print("我是一个无参数无返回值的函数")print("helloworld")print("我是一个无参数无返回值的函数")print("helloworld")print("我是一个无参数无返回值的函数")print("helloworld")
单纯的复制代码还好,如果我现在希望将hello修改成hi,那不使用函数需要修改代码的5个位置,而使用函数只需要修改函数中的代码块一处即可。
9.3函数的参数设计
上文中设计的是一个无参数的函数,但在实际应用中很少出现一个无参函数,更多的时候是需要给函数传递参数的。
9.3.1传递一个参数
函数内有参数,代码如下:
#声明一个带一个参数的函数defshow(name):print("传递进来的姓名是:",name)show("橡皮擦")show("大橡皮擦")show("小橡皮擦")
小括号里面的name即为参数,该参数能在函数内部代码块直接使用。
9.3.2传递多个参数
多个参数只需要在函数声明时小括号里面多增加几个参数即可。
#声明一个带多参数的函数defshow(name,age):print("传递进来的姓名是:",name,"年龄是:",age)show("橡皮擦",20)show("大橡皮擦",21)show("小橡皮擦",18)
多个参数一定要注意参数的位置,前后顺序如果错误,会导致严重BUG。上述代码中橡皮擦会传递给name,20会传递给age。
9.3.3关键词参数(参数名称=值)
该参数使用的方式是在调用函数时,参数用参数名称=值这种形式传递。其实在上述传递一个和多个参数的时候,也可以应用该方式传递参数,例如修改代码如下。
#声明一个带一个参数的函数defshow(name):print("传递进来的姓名是:",name)show(name="橡皮擦")#声明一个带多参数的函数defshow1(name,age):print("传递进来的姓名是:",name,"年龄是:",age)show1(name="橡皮擦",age=20)
用这种形式调用函数,参数的位置就不在重要了,因为已经指定参数具体值是多少。
9.3.4参数默认值
在定义函数的时候可以给参数一个默认值,如果调用该函数没有给该参数赋值,程序会使用默认值而不会报错。
#没有默认值的参数defshow(name):print("传递进来的姓名是:",name)show()#该函数调用时会报错#有默认值的参数defshow(name="橡皮擦"):print("传递进来的姓名是:",name)show()#该函数调用没有问题,即使没有传递参数会使用默认值
如果一个参数有默认值,注意该参数必须放在函数参数位置的最右侧,例如下述函数定义。
defshow(a,b,c,name="橡皮擦"):pass
9.4函数返回值
函授的返回值属于非必选项,可以写可以不写,不写的时候也会有返回值,该值为None。
9.4.1返回None
函数如果没有写返回值即return,那Python会自动在函数体内增加一行代码returnNone。函数的返回值可以赋值给一个变量,通过打印该变量,即可知道返回的具体内容。
#没有返回值的函数defshow():print("注意下面没有return")ret=show()print(ret)
得到的ret的值是None,表示没有返回值。
如果只写return,也会返回None,注意下述代码是正确的。
#没有返回值的函数defshow():print("注意下面没有return")returnret=show()print(ret)
9.4.2返回一个值
函数常见的情况是有返回值的,例如执行一段计算代码之后返回计算结果。
#定义一个减法函数defsub(a,b):c=a-breturnc#参数为2和1,将结果进行返回ret=sub(2,1)print(ret)
9.4.3返回多个值
使用return返回函数数据,可以一次性返回多个值,返回的数据之间用逗号分隔即可。
#定义一个减法函数defsub(a,b):c=a-bd=a+bf=a/breturnc,d,f#参数为2和1,将结果进行返回ret=sub(2,1)print(ret)
返回的结果是一个元组(1,3,2.0)。
9.4.4返回字典与列表
函数可以返回字符串类型的变量,这个与返回一个值一样,只是具体数据类型的区别,除了上述提及的内容,函数也可以返回比较复杂的数据,例如字典或者列表,该内容没有特别说明的,你只需要将字典和列表看成普通的数据类型进行返回即可,例如下述代码。
defsub1():return[1,2,3]defsub2():return{"name":"橡皮擦","loc":"CSDN"}
9.5调用函数时参数是列表
为什么单独将其参数是列表时拿出来讲解,是因为列表这个有点特殊,里面还会引出全局变量与局部变量的一个概念,放心第一遍学习%迷糊。如果你有其他编程语言的功底,那另当别论。
具体代码如下,注意看出现的问题。
names=["aaa","bbb","ccc"]defchange_list(one_names):#修改传递进来的列表索引0的位置上为jjjone_names[0]="jjj"#函数调用,同时将name作为参数传递进函数内部change_list(names)print(names)
最终的输出结果是[jjj,bbb,ccc],这个表示啥?表示函数外面的names被函数给修改了。疑问是所有在函数外面的变量传递到参数内部都会被修改吗?换个整数试试。
score=1defchange_list(one_score):one_score=#函数调用,同时将score作为参数传递进函数内部change_list(score)print(score)
此时score虽然在函数内部被修改为了,但是在函数外打印并没有被修改,还是1。现在问题就出现了,Python并不是一视同仁的,列表变量在函数内被修改影响到了外部变量,而整型变量并没有受到影响。
这个坑咱先挖下,以后慢慢填,为啥列表在函数内修改,函数外面也会受到影响,涉及到内存地址空间这些更底层的概念了。先学习一下局部变量与全局变量。
9.6局部变量与全局变量
这个概念非常难理解,是的,如果你理解了在这个阶段也是一知半解。
在设计函数的时候,有时需要控制变量的使用范围,如果变量的使用范围在函数内部,那这个变量叫做局部变量,注意是函数内部。如果某个变量的使用范围在整个程序,这个变量就是全局变量。
上述内容只是初次接触,在函数部分咱先简单弄个概念在心里在说。
全局变量在所有函数都能用
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=defchange_list():#局部变量score,本函数可以用score=print(score)change_list()#外面使用的全局变量scoreprint(score)
执行之后发现在外面使用的是全局变量的值,在函数内部使用的局部变量的值。
有了上面的这些基础知识点,你应该注意下变量的使用范围这个概念了,在面向对象的时候还将继续学习。
9.7传递任意数量的参数
9.7.1一般参数与任意参数的组合
在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("