函数使用
零碎知识
灵活的if-else
a = 3 if False else 5 print(a) ''' if False: a = 3 else: a = 5 '''
灵活的and/or
# 前面的表达式为真,才会执行后面的表达式 a = True and 3 print(a) # 前面的表达式为假,后面的表达式不需要执行 b = False and 5 print(b) # 前面的表达式为真,后面的表达式就不需要执行了 c = True or 3 print(c) # 前面的表达式值为假,才会执行后面的表达式 d = False or 5 print(d)
类型判断
a = 123 # print(type(a)) # if type(a) == int: if type(a) == type(1): print('整数') # 判断一个对象是否是一个类的实例 print(isinstance(a, int)) print(isinstance(a, float)) def test(): pass # print(type(test)) # 不能这样判断 # print(isinstance(test, function)) # 判断是否可以调用 print(callable(test))
递归函数(了解)
- 定义:在函数内部调用函数本身的函数叫递归函数。
- 组成:
- 函数内部调用自己
- 终止条件(停止调用自己的条件)
- 核心算法
- 特点:
- 代码简洁
- 可读性差
- 瞬间占用内存较大,终止条件出错会立即崩溃
- 能不使用就不使用,在不得不使用的使用再使用(目录遍历)
- 练习:
- 求n的阶乘
- 斐波那契数列的第n项
- 前两项都是1,后面的项都等于前两项的和
- 示例:
1, 1, 2, 3, 5, 8, 13, 21, ...
匿名函数
函数可以向普通变量一样进行赋值
def test(): print('for test') print(test.__name__) # 函数可以像普通变量一样进行赋值 a = test print(a.name) a()
函数可以作为参数传递
def show(func): func() # 函数可以作为参数传递 show(test)
匿名函数
将函数作为参数传递时,若函数只需要一次,没有必要定义函数,可以通过匿名函数解决
语法格式:
lambda 参数列表: 表达式
说明:
可以有多个参数,多个参数之间使用逗号隔开
表达式就是返回值,不需要使用return关键字
示例
lt = [ {'name': 'ergou', 'age': 18, 'height': '180'}, {'name': 'dagou', 'age': 20, 'height': '170'}, {'name': 'dahua', 'age': 19, 'height': '160'}, {'name': 'cuihua', 'age': 21, 'height': '165'}, ] def key(d): return d['age'] # lt.sort(key=key) lt.sort(key=lambda d: d['height']) for i in lt: print(i)
练习:
自己实现列表的sort函数,支持逆序,可以排序任意类型的数据。
闭包使用
定义:
- 外部函数中定义一个内部函数
- 内部函数中使用外部函数的局部变量
- 外部函数将内部函数作为返回值返回
- 此时的内部函数就叫闭包
示例:
def wai(n): def nei(): # 内部函数中使用外部函数的局部变量 return n * n return nei f1 = wai(10) f2 = wai(5) print(f1()) print(f2())
装饰器
作用:当我们想要改变函数的原有功能时,但不想/不能改变原来的函数,就可以通过装饰器解决
使用:
- 装饰器其实就是一个函数,该函数具有一个参数(函数类型),返回一个闭包
- 在闭包中调用传递进来的函数,然后就可以在调用函数的前后添加内容了。
示例:
def zhuangshiqi(func): def wrapper(): print('前面的装饰') func() print('后面的装饰') return wrapper def test(): print('for test') # t = zhuangshiqi(test) # t() test = zhuangshiqi(test) test() @zhuangshiqi # 上面的语法相当于:hello = zhuangshiqi(hello) def hello(): print('How are you?') hello()
装饰器使用
- 装饰无参无返回值的函数
- 装饰带参无返回值的函数
- 装饰带参有返回值的函数
练习
实现列表的排序,要求支持逆序和指定标准(key)
计算一个字符串中所有数字的和
实现一个字符串的逆序函数
返回一个列表中出现次数最多的元素
歌词解析:解析成一个时间戳语句歌词的形式,封装函数(根据时间返回歌词)
[ti:蓝莲花] [ar:许巍] [al:留声十年绝版青春北京演唱会] [00:-01.70]蓝莲花 [00:-00.70]演唱:许巍 [00:00.00] [00:00.70]没有什么能够阻挡 [00:06.01]你对自由的向往 [00:11.43]天马行空的生涯 [00:16.99]你的心了无牵挂 [00:21.20] [02:11.55][01:50.60][00:22.63]穿过幽暗的岁月 [02:16.93][01:55.60][00:27.81]也曾感到彷徨 [02:22.21][02:01.09][00:33.13]当你低头的瞬间 [02:27.62][02:06.33][00:38.32]才发觉脚下的路 [02:31.64][02:10.23][00:42.37] [02:32.97][00:43.79]心中那自由的世界 [02:38.23][00:49.50]如此的清澈高远 [02:43.30][00:54.31]盛开着永不凋零 [02:47.70][00:58.50]蓝莲花 [02:53.95][03:00.06][01:05.41]