python基础知识——函数(下)
python基础知识——函数(下)
python基础知识——函数(下)
- python基础知识——函数(下)
- 1. 高阶函数
- 2. 闭包
- 3. 装饰器
- 4. 装饰器的使用
1. 高阶函数
*变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
# 接收函数作为参数,或者将别的函数作为返回值返回的函数就是高阶函数
def fun_1(i):if i%2 == 0:return Truedef fun(n):list_1 = []for i in range(101):if n(i):list_1.append(i)return list_1print(fun(fun_1))
- 匿名函数
匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。 - lambda语法的定义如下:
lambda [arg1 [,arg2, … argN]] : expression
# 1.防止重名
# 2.不用再去定义函数,使用方便
# 3.可以作为一个传参的工具#lambda 函数就是匿名函数
list_1 = [1,2,3,4,5,6,7,8]
#语法: lambda 参数:表达式
print((lambda a,b:a+b)(1,2))#filter()有两个参数,第一个是过滤规则,第二个是过滤的数据
s = (lambda a:a % 2 == 0)
print(list(filter(s,list_1)))
2. 闭包
- 如果在一个函数的内部定义了另一个函数,外部的函数叫它外函数,内部的函数叫它内函数。
# 行成闭包的条件(三点缺一不可)
# • 函数嵌套
# • 将内部函数作为返回值返回
# • 内部函数必须要使用到外部函数的变量#定义一个外部函数
def fun(num):#定义一个内部函数def fun_1(n):res = num + n# print(res)return resreturn fun_1
# 函数的调用等于函数的返回值
f = fun(1) #fun(1) = fun_1 = f
#内部函数的调用
print(f(2)) #fun(1)(2) = fun_1(2) = f(2)
print(f(3))
- 闭包的好处
#• 通过闭包可以创建一些只有当前函数能访问的变量
#• 可以将一些私有数据藏到闭包中
#保证被内部使用的外部变量不被销毁
#定义一个外部函数
def fun(num):#定义一个内部函数def fun_1(n):# global num 无意义nonlocal num #使num为局部变量num = 10res = num + n# print(res)return res# print(num)fun_1(1)# print(num)return fun_1
# 函数的调用等于函数的返回值
f = fun(1) #fun(1) = fun_1 = f
3. 装饰器
- 在编程时,为了实现同样的功能,需要更改代码来实现。如果大量的修改代码,不仅增加了工作量,还不方便后期维护,更加不符合ocp规则(o:open 开放对代码的拓展,c :close 关闭对代码的修改),装饰器就是为了解决这写问题被引入的。
def fun(a,b)print('函数开始')print('函数结束')return a+bdef fun1(a,b):return a*b'''
如果fun函数要实现fun1函数同样的输出效果,可以直接复制print进行粘贴就行,\
但是这样就出现了代码的冗余、增加工作量等情况,那是否有办法不用复制就直接那过来用呢?
'''
#例子一:
def fun(fn):print('函数开始')fn()print('函数结束')
def fun1():print('函数运行')
fun(fun1)
#例子二
def fun(fn,a,b):print('函数开始')res = fn(a,b)print(res)print('函数结束')
def add(a,b):return a+b
fun(add,1,2)
#例子三
'''
但是这样还是不行,因为每次还得修改参数,可以使用不定长参数进行传参
'''
def fun(fn,*args):print('函数开始')res = fn(*args)print(res)print('函数结束')
def add(a,b):return a+b
fun(add,1,2)
4. 装饰器的使用
- 通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
- 在开发中,我们都是通过装饰器来扩展函数的功能的
#装饰器是一个特殊的闭包函数#装饰器
def ch(fn): #定义外层函数def new_ch(*args,**kwargs): #定义一个内层函数,使用不定长参数进行传参print('函数开始')fn(*args,**kwargs) #调用内层函数print('函数结束')return new_ch #返回内层函数名@ch #@ch=ch(fun),装饰器的语法糖写法 ,必须紧贴需要用到装饰器的函数,即@ch必须在def fun():这个函数前
#函数
def fun(): #定义一个函数print('我是fun函数')#return '我是fun函数'#函数调用方法一:通过装饰器的语法糖写法
fun()#函数调用方法二:
# r = ch(fun) #此处是将函数名fun作为实参传递给fn,即fn = fun ,ch(fn) = new_ch = ch(fun) ,\
# # 内层函数调用ch(fn)() = new_ch() = ch(fun)()
# r()
# 总结 本文为学习笔记,转载请标明出处,本文仅供交流学习,请勿用于非法途径,希望本文对大家有帮助。
仅是个人意见,如有不足之处或者侵权,请留言
python基础知识——函数(下)相关推荐
- python基础知识纵览(下)
python函数 1.函数作用 最大化代码重用和最小化代码冗余 流程的分解 2.函数基本概念 def创建对象并赋值给某一变量 ## 创建一个函数对象并赋值给fn_namedef fn_name(arg ...
- Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)
文章目录 1 函数的基本使用 一 引入 二 定义函数 三 调用函数与函数返回值 2 函数的参数 一 形参与实参介绍 二 形参与实参的具体使用 2.1 位置参数 2.2 关键字参数 2.3 默认参数 2 ...
- python基础知识~ 函数详解2
python~函数详解2 1 生成器函数 定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数 须知 yield和return一样,都可以返回数 ...
- 1.15 Python基础知识 - 函数
函数是可重用的程序代码段. 一.函数的声明和调用 声明格式: def 函数名([形参列表]): 函数体 调用格式: 函数名([实参列表]) 函数名:是一种标识符,命名规则为全小写字母,可以使用下划线增 ...
- (更新时间)2021年3月21日 python基础知识(函数的返回值)
1.函数返回值 <1>"返回值"介绍 所谓"返回值",就是程序中函数完成一件事情后,最后给调用者的结果 <2>带有返回值的函数 想要在函 ...
- (更新时间)2021年3月21日 python基础知识(函数的定义和使用)
函数定义和调用 <1>定义函数 定义函数的格式如下: def 函数名():代码 demo: # 定义一个函数,能够完成打印信息的功能 def print_info():print('--- ...
- python环境下数据操作_数据分析环境搭建和Python基础知识
搭建数据分析环境主要包括使用anaconda管理包和环境:使用Jupyter notebook将说明文本.数学方程.代码和可视化内容全部组合到一个易于共享的文档中.Python基础知识包括关键点(数据 ...
- python程序如何执行死刑_「Python基础知识」Python生成器函数
原标题:「Python基础知识」Python生成器函数 对于程序而言,内存也是很重要的,因为程序中很多数据都是保存在内存中的,如果内存中存储的数据过多,那么系统就会崩溃,这是人们不希望发生的. 可以采 ...
- python基础知识资料-Python基础知识梳理 - 第02部分
本文是Python基础知识的第二篇, 主要是对内置对象类型的介绍, 涉及的类型如下表. 数字类型 在Python中, 数字并不是一个真正的对象类型, 而是一组类似类型的分类, 如整数和浮点数, 复数等 ...
- python基本语法规则-python基础知识——基本语法
在python基础知识这个系列中,准备罗列出我学习python的一些基础知识,包括:基本语法 控制语句 内置数据结构 模块和函数 字符串 文件处理 面向对象 异常处理 以前写机器学习算法喜欢使用Mat ...
最新文章
- 搜索不包含关键词_sem竞价代运营丨做竞价推广,关键词匹配才是重点
- 018_switch语句
- 揭秘:美国警方监控技术大曝光
- 你知道为啥程序员下班后只关显示器从不关电脑?
- moment 24小时与12小时区别
- PM2.5空气质量指数(AQI)是如何计算的
- 前端js、jQuery实现日期格式化、字符串格式化
- C#编程(二十三)----------实现继承
- mysql汉字转拼音首字母报错_MySQL 汉字转拼音
- Java入门级项目 汽车租赁系统
- Python与SEO,搜狗站长平台链接提交工具Python脚本源码
- Spring Cloud项目是如何读取bootstrap.properties文件的?
- 如何用电脑玩石器时代M 石器时代M手游PC电脑版教程
- attempted an unsupported operation 、an unsupported operation was attempted [尝试不支持的操作]错误的三种解决方案
- 华为P20PRO怎样开通云闪付_华为P20NFC_华为p20nfc怎么打开_华为p20nfc刷卡怎么用-站长之家...
- 【嵌入式操作系统-2】Cortex-M7处理器编程者模型
- java8 —— Stream( 流 )
- base64 hash256 编码不一致问题
- asp.net网上商城系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目
- Android程序开发意见反馈的实现
热门文章
- matlab kfcm,聚类——KFCM的matlab程序
- Mysql 数据库中Exists 关键字的使用
- 图像处理_描述下SIFT特征?(清晰易懂)
- 论文笔记_S2D.22_2015-CVPR_利用深度特征回归和分层CRFs对单目图像进行深度和表面法线估计
- 随手记_常用coding软件的快捷键-clion/vs code/vs/kdevelop
- Tensorflow2梯度带tape.Gradient的用法_(全面,深入)
- Logistic回归及梯度上升算法
- kaggle实战之流浪猫狗归处预测
- marathon 测试
- 关于codeblock中一些常用的快捷键(搬运)