智泊Python--Day8
智泊Python–Day8
Day8 进入函数进阶。函数是 Python 里最核心的封装单元——把重复逻辑包成名字,随时调用。这一天从函数的基本定义、参数、返回值讲起,到练习(闰年、月天数、季节、质数),再到函数嵌套与「函数名即变量」、匿名函数 lambda 与 map/filter 高阶函数、回调函数,最后用回文 / 最值 / 水仙花数四道作业收尾。建议重点吃透参数顺序(位置 → *args → 默认 → 关键字 → **kwargs)和「函数名本质是个变量」这两点,它们是后面装饰器、闭包的地基。
1.函数入门
函数用 def 名字(形参): 定义,调用时给实参。参数按形态分四类:
- 必需位置参数:必须传实参,不能用默认值
- 默认参数:没传就用默认值(定义时写在后面)
- 关键字参数:调用时按
名=值传,通常和默认参数配合 - 不定长参数:
*args收多余位置参数(元组)、**kwargs收多余关键字参数(字典)
形参的定义顺序是铁律:位置参数 → *args → 默认参数 → 关键字参数 → **kwargs;实参传递时位置参数必须写在关键字参数前面。函数没有 return 默认返回 None,return 会立刻结束函数。
1 | |
2.函数练习
四个小练习把「参数 + 多分支 + 返回值」串起来:①判断闰年(能被 4 整除但不能被 100 整除,或能被 400 整除);②根据年/月算天数(注意 2 月闰年 29 天、平年 28 天);③按月份返回季节;④判断质数(2 到 n-1 都不能整除)。下面代码修正了两处原笔记笔误——leap_year 返回值其实是 bool 不是 str;原 month_days 把闰年 2 月天数写反了,已改正。
1 | |
3.函数嵌套
这一节其实讲了两个容易混淆的点:函数嵌套定义(在函数里再定义函数,外层返回内层)和函数名即变量(函数名本身是个指向函数对象的变量,可以赋值给别的名字、用新名字调用)。fn1 内部定义了 fn2 并返回它——所以 f2 = fn1(10) 拿到的是 fn2,再 f2(20) 才真正执行内层;f3 = fn3 则是把函数对象换了个引用名。
1 | |
4.匿名函数
lambda 是匿名函数:没有名字、自带 return、只适合写「一行就能表达、且有返回值」的小函数。lambda 参数: 表达式 整体就是一个函数对象,常当作参数传给 map/filter 这类高阶函数(接收函数或返回函数的函数)。map 对可迭代对象逐个映射,filter 按条件过滤保留。
1 | |
5.回调函数
回调函数就是把函数当作参数传进另一个函数,由后者在合适时机「回过头来调用」它。fn(3, lambda x: x**2) 里 lambda 就是回调。自己实现 filter_cb 能看清原理:遍历列表,用回调判断每个元素是否保留。sort(key=lambda) 则让排序按「提取出的某个键」来进行,比如按字典的 age 升序、按 score 降序。
1 | |
6.函数作业
四道综合作业:①回文判断(转字符串后倒序比较);②用 *args 一次性拿到最小值 / 最大值 / 和 / 平均数;③在②基础上统计「高于平均数」的个数;④穷举 100–999 拆出百十个位,求水仙花数(各位立方和等于自身)。
1 | |