5.3Python函数(三)
程序员文章站
2023-02-09 13:17:05
目录 [TOC] 前言 这是相继上一篇5.2Python函数(二)后的函数的高阶 (一)装饰器 在不改变原函数的代码,函数的变量名,函数的调用下,给函数附加新的功能,该附加的功能便是装饰器。 一般装饰器都封装成一个函数。 ==1.简单的装饰器== (1)说明 用闭包来实现装饰器,并且用@函数名来附加 ......
目录
目录
前言
这是相继上一篇5.2python函数(二)后的函数的高阶
(一)装饰器
在不改变原函数的代码,函数的变量名,函数的调用下,给函数附加新的功能,该附加的功能便是装饰器。
一般装饰器都封装成一个函数。
==1.简单的装饰器==
(1)说明
用闭包来实现装饰器,并且用@函数名来附加
(2)源代码
# 额外代码,实现发说说与发图片前,登陆验证 def check_logo(func): def inner(): print("登陆验证……") func() return inner # 功能代码块 @check_logo def fss(): print("发说说") @check_logo def ftp(): print("发图片") # 业务逻辑 btn_index = 2 if btn_index == 1: fss() else: ftp()
(3)输出效果
==2.修饰带参数函数的装饰器==
(1)说明
我们只有在内部的函数也定义接收参数就可以了,不过为了通用性
我们定义的参数形式是:不定长参数
inner(*args, **kwargs)
(2)源代码
# 写一个装饰器 def zsq(func): def inner(*args, **kwargs): print("*" * 30) func(*args, **kwargs) return inner # 写一个功能函数 @zsq def my_sum(num1, num2): result = num1 + num2 print(result) @zsq def my_sub(a, b, c): result = a + b - c print(result) my_sum(1, 2) my_sub(4, b=2, c=3)
(3)输出效果
==3.修饰带返回值函数的装饰器==
(1)说明
我们在内部函数也定义返回的语句,总之要与功能函数步调一致。
result = func(*args, **kwargs)
return result
(2)源代码
# 写一个装饰器 def zsq(func): def inner(*args, **kwargs): print("*" * 30) result = func(*args, **kwargs) return result return inner # 写一个功能函数 @zsq def my_sum(num1, num2): result = num1 + num2 print(result) return result @zsq def my_sub(a, b, c): result = a + b - c print(result) return result r = my_sum(1, 2) r2 = my_sub(4, b=2, c=3) print(r) print(r2)
(3)输出效果
==4.自身带参数的装饰器==
(1)说明
装饰器的附加功能不是写死的,有时候也需要传递一些值,这时就需要装饰器自身传递参数。
我们只要在外部添加一层函数即可。
(2)源代码
# 定义一个可自身传递参数的装饰器 # 就是在装饰器外面添加一层函数 def get_zsq(char): # 写一个装饰器 def zsq(func): def inner(*args, **kwargs): print(char * 30) result = func(*args, **kwargs) return result return inner return zsq # 定义一个功能函数, @相当于一个函数 @get_zsq("=") def my_sum(a, b, c): result = a + b + c print(result) return result my_sum(1, b=2, c=3)
(3)输出效果
(二)迭代器
(1)说明
读取数据的一种形式。
创建:iter()
访问:next()
(2)源代码
# iterable(可迭代对象):list,tuple,dict,string,set # 即可以用for in 来遍历的对象 list1 = ["你好", 2, "me", "you"] # 可以用于isinstance()来判断是否是iterable print(isinstance(list1, list)) # 可以用iter()来创建迭代器 list_iterator = iter(list1) # 用next()访问下一个元素 print(next(list_iterator))
(3)输出效果
(三)生成器
generator(生成器):是一种优雅的迭代器,就是一种特殊的迭代器。
==1.创建方式一==
(1)说明:
使用生成器表达式创建
(2)源代码
# generator(生成器):是一种优雅的迭代器 # 列表推导式 # l = [i for i in range(50) if i % 2 == 0] # 生成器表达式--创建生成器 l = (i for i in range(50) if i % 2 == 0) print(next(l)) print(next(l)) print(next(l))
(3)输出效果
==1.创建方式二==
(1)说明:
使用yield于语句创建
(2)源代码
# 使用yield的语句来停顿执行,创建生成器 def test(): print("a") yield 1 print("b") yield 2 print("c") yield 3 print("d") yield 4 # 调用函数 print(test()) # 访问元素 g = test() # print(next(g)) # print(next(g)) # print(next(g)) # print(next(g)) # for in 遍历元素 for i in g: print(i)
(3)输出效果
(四)递归函数
(1)说明
递归函数是一种思想,函数不断的调用自身。
(2)源代码
# 函数a内部继续调用a函数,称递归 # 传值:从后往前传递值的过程 # 回归:从前往后回代数值的过程 # 求一个数的阶乘 def test(n): if n == 1: return 1 # 分解n result = n * test(n-1) return result print(test(4))
(3)输出效果
(五)变量的作用域
(1)说明图
(2)源代码
# 变量的作用域:作用范围 # 命名空间:具体的范围 g = "我是全局变量" def test(): # 声明g是全局变量 global g g = "我有全局变量修改而来" e = "我是局部变量" # 查看局部变量 num = locals() print(num) def test1(): # 声明 e 不是当地变量 nonlocal e e = "我是局部变量修改而来" l = "我是函数内的变量" # 查看局部变量 num1 = locals() print(num1) test1() # 查看全局变量 num2 = globals() print(num2) test() print(g)