9. Python 学习过程的第一个山坡,99% 的人都倒在了山坡下
Python 学习的第一个难关 -- 函数,这个地方学会的人觉得没有啥,没学过的学的时候迷迷瞪瞪,不用慌,学编程就是这样,先学过去,在从上帝视角去看,坚持打卡,我一天写一篇,你可以两天学一篇。
已完成的文章
未完待续
**
本系列文章将在2021年春节前完成,欢迎关注,点赞,评论 --- 梦想橡皮擦
**
九、Python 中函数是基础部分第一道难关
9.1 函数出现的背景
为什么在编程语言中会出现函数概念,目的有 2 个。
在开发的时候,很多项目都是团队开发,把代码功能编写成一个个的函数,方便维护,每个人也可相对独立的开发,缩短整体开发时间
代码编写成函数以后,重复的功能只写一次即可,其它地方可以直接调用,方便了代码的复用。
直接写出这两个目的还是没有直观的感受,要在代码中感受函数的用法。
9.2 函数初接触
咱从本系列博客一开始就已经接触函数的概念了,例如第一篇就学习的 print
, 就是一个内置函数,相似的还有 len
、add
、sorted
这些,调用函数时最大的便捷性就是不用知道函数内部的具体实现,就可以用该函数使用自己想要的效果。
9.2.1 函数的定义
具体的语法格式如下:
跟 if
语句,for
语句一样,函数定义与使用的时候要注意下代码缩进。
函数名称必须是唯一的,进行声明的有意义,不要使用 a
当做函数名,以后很有可能就忘记了这个函数是做什么用的。
参数值,非必须,根据函数的要求自行设定即可,各个参数值之间用 ,
分隔。
返回值,非必须,返回多个值使用逗号 ,
分隔即可。
注意第一行末尾的分号
9.2.2 无参数无返回值的函数
该内容将演示函数的使用便捷性。
函数声明之后,通过 函数名()
进行调用,上面的代码写了 5 次 show()
,表示函数被调用了 5 次。
如果不通过函数实现上文效果,需要将函数内部的代码复制 5 次。
单纯的复制代码还好,如果我现在希望将 hello 修改成 hi ,那不使用函数需要修改代码的 5 个位置,而使用函数只需要修改函数中的代码块一处即可。
9.3 函数的参数设计
上文中设计的是一个无参数的函数,但在实际应用中很少出现一个无参函数,更多的时候是需要给函数传递参数的。
9.3.1 传递一个参数
函数内有参数,代码如下:
小括号里面的 name
即为参数,该参数能在函数内部代码块直接使用。
9.3.2 传递多个参数
多个参数只需要在函数声明时小括号里面多增加几个参数即可。
多个参数一定要注意参数的位置,前后顺序如果错误,会导致严重 BUG。上述代码中 橡皮擦
会传递给 name
,20
会传递给 age
。
9.3.3 关键词参数(参数名称=值)
该参数使用的方式是在调用函数时,参数用 参数名称=值
这种形式传递。其实在上述传递一个和多个参数的时候,也可以应用该方式传递参数,例如修改代码如下。
用这种形式调用函数,参数的位置就不在重要了,因为已经指定参数具体值是多少。
9.3.4 参数默认值
在定义函数的时候可以给参数一个默认值,如果调用该函数没有给该参数赋值,程序会使用默认值而不会报错。
如果一个参数有默认值,注意该参数必须放在函数参数位置的最右侧,例如下述函数定义。
9.4 函数返回值
函授的返回值属于非必选项,可以写可以不写,不写的时候也会有返回值,该值为 None。
9.4.1 返回 None
函数如果没有写返回值即 return
,那 Python 会自动在函数体内增加一行代码 return None
。函数的返回值可以赋值给一个变量,通过打印该变量,即可知道返回的具体内容。
得到的 ret
的值是 None,表示没有返回值。
如果只写 return,也会返回 None,注意下述代码是正确的。
9.4.2 返回一个值
函数常见的情况是有返回值的,例如执行一段计算代码之后返回计算结果。
9.4.3 返回多个值
使用 return 返回函数数据,可以一次性返回多个值,返回的数据之间用逗号分隔即可。
返回的结果是一个元组 (1, 3, 2.0)
。
9.4.4 返回字典与列表
函数可以返回字符串类型的变量,这个与返回一个值一样,只是具体数据类型的区别,除了上述提及的内容,函数也可以返回比较复杂的数据,例如字典或者列表,该内容没有特别说明的,你只需要将字典和列表看成普通的数据类型进行返回即可,例如下述代码。
9.5 调用函数时参数是列表
为什么单独将其参数是列表时拿出来讲解,是因为列表这个有点特殊,里面还会引出全局变量与局部变量的一个概念,放心第一遍学习 100%迷糊。如果你有其他编程语言的功底,那另当别论。
具体代码如下,注意看出现的问题。
最终的输出结果是 ['jjj', 'bbb', 'ccc']
,这个表示啥?表示函数外面的 names
被函数给修改了。疑问是所有在函数外面的变量传递到参数内部都会被修改吗?换个整数试试。
此时 score
虽然在函数内部被修改为了 333,但是在函数外打印并没有被修改,还是 1。现在问题就出现了,Python 并不是一视同仁的,列表变量在函数内被修改影响到了外部变量,而整型变量并没有受到影响。
这个坑咱先挖下,以后慢慢填,为啥列表在函数内修改,函数外面也会受到影响,涉及到内存地址空间这些更底层的概念了。先学习一下局部变量与全局变量。
9.6 局部变量与全局变量
这个概念非常难理解,是的,如果你理解了在这个阶段也是一知半解。
在设计函数的时候,有时需要控制变量的使用范围,如果变量的使用范围在函数内部,那这个变量叫做局部变量,注意是函数内部。如果某个变量的使用范围在整个程序,这个变量就是全局变量。
上述内容只是初次接触,在函数部分咱先简单弄个概念在心里在说。
全局变量在所有函数都能用
上面的 score
并未在函数内部声明,但是函数内部也可以访问到,那函数外面的变量 score
就是全局变量。
局部变量在函数外部和其它函数不能使用
如果局部变量和全局变量名称重复
在程序设计的时候很容易出现重名的情况,这种情况比较尴尬了,初学难度继续增加。
执行之后发现在外面使用的是全局变量的值 5555,在函数内部使用的局部变量的值 6666。
有了上面的这些基础知识点,你应该注意下变量的使用范围这个概念了,在面向对象的时候还将继续学习。
9.7 传递任意数量的参数
9.7.1 一般参数与任意参数的组合
在 Python 编写代码的过程中,很容易出现一种情况是你不知道有多少个参数,这时函数定义时参数就不好设定了,好在 Python 已经想到了这个情况。
在函数定义的时候,参数位置使用 *参数名
,然后在函数体重的代码块位置就可以进行循环打印了,可以捕获到任意数量的参数。
如果又有一般参数,又有不定数量的参数怎么办?好办,使用下面的格式。
希望你现在发现规律,函数调用的时候先依次去匹配函数定义的参数,一一对应,都对应完毕,发现没有一般参数了,剩下的都打包给 *keys
就好了。
还要不要写两个带 *
的参数,例如 def show(name,*keys,*keys1)
,这样就报错了。
9.7.2 一般参数与任意数量的关键词参数
参数里面还有一种情况是需要传不定数量的关键词参数,这又如何设计呢?
这种情况,你把传递进去的所有参数当成一个字典即可,自动聚合成了一个字典类型的数据。
如果与一般参数进行匹配,规则也非常简单。
上述代码先去匹配关键词参数,匹配成功了就赋值到对应关键词上,例如上面的 name
变量在函数调用时赋值了 橡皮擦
,那它就等于橡皮擦,其余的例如 age
没有关键词参数对应,只好打包给 **args
了。
9.8 函数以后的扩展
函数本文只是介绍了 5 成左右的内容,在 Python 中函数还有很多有趣的知识点存在,但是不能一口吃饱,那样的结果就是消化不好,而且不符合咱滚雪球学 Python 的设计初衷,就是要滚上几遍才可以彻底掌握。
延期学习的知识点如下:
递归函数
匿名函数
高阶函数
还有一个知识点你可以现在扩展,咱学习了各种参数的形式,你有没有想过将这些组合在一起呢,例如 def show(name,age,*arg,**args)
在程序中是怎么解析的呢?顺序变动可不可以呢?
9.9 这篇博客的总结
函数,初学阶段,这是啥,为什么,不懂唉;学习中期,写函数好舒服啊,面向对象那里有函数好用;学习后期,快点实现这个功能,啥方法都行,抓紧点,马上下班了。
没错,函数就处在一个说难很难,转身又很简单的一个环节。
最后一碗毒鸡汤
编程需要一个顿悟的时刻,而这个时刻很多人就没有过。 O(∩_∩)O 哈哈~
**想学 Python 爬虫,可以订阅橡皮擦专栏哦~
** 💋💋💋 点击发现惊喜 💋💋💋
博主 ID:梦想橡皮擦,希望大家<font color="red">点赞</font>、<font color="red">评论</font>、<font color="red">收藏</font>。
版权声明: 本文为 InfoQ 作者【梦想橡皮擦】的原创文章。
原文链接:【http://xie.infoq.cn/article/0e25162027d09b7a363d9cd47】。文章转载请联系作者。
评论