Python函数的定义(构造)和调用这里来给大家演示一下,函数的定义或构造,并调用函数来实现封装后的效果 。
首先我们来看看想实现下面的这个效果,如果不使用函数应该怎么实现 。
以上两种返回结果都是1-9这几个数字 。
以上两种方法,第一种代码重复率太高,代码美观效果太差,虽然能实现效果,但是因为数量比较少,还能手工打出来这几行代码,如果是打印1-100000就很难实现了 。这时候for循环还是可以实现的 , 但是for循环只能实现类似的数字和变量循环 , 无法进行复杂的功能开发 。鉴于此,函数这个概念就被python引入了,下面先来看看函数是怎么实现上面的效果的,还是两种方法 。
这时候如果想实现上面的打印结果就直接使用函数名+小括号调用函数就可以了,这种类型的语法 , 不仅可以反复使用,而且封装后的代码更美观 。
python 高阶函数有哪些1、高阶函数
变量可以指向函数,函数的参数可以接收变量,那么函数可以接收另一个函数作为参数,这种函数称为高阶函数 。
(1)把函数作为实参
(2)把函数作为返回值
2、系统的内置高阶函数
(1)map函数:接收两个参数 , 一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并且把结果作为新的列表返回
(2)reduce函数:把一个函数作用到一个序列上,这个函数必须接收两个参数 , reduce把结果和序列的下一个元素做累积计算
(3)filter函数:也接收一个函数和一个序列,和map函数不同的是,filter函数把传入的函数依次作用于每个元素,然后返回返回值是True的元素
(4)sorted函数:排序函数
把用户名按照首字母不区分大小写排序
(5)sorted()函数按照关键字排序
关键字:商品个数
(6)sorted()函数按照关键字排序,用键值来查找
(7)lambda匿名函数:有时候传参数时不需要显示自定义的函数,直接传入匿名函数更方便;冒号前面的x,y表示函数参数,匿名函数不需要担心函数名的冲突 , 匿名函数也是一个函数对象,可以把匿名函数赋值给一个变量,再利用变量来调用函数,匿名函数也可以作为返回值返回
3、高阶函数的应用:
(1)sorted函数:
(2)sorted函数默认是从小到大排序
4、装饰器
装饰器就是用来装饰函数的:想要增加原有函数的功能,但是不希望修改原有函数的定义 , 在代码运行期间动态增加功能的方式
(1)此装饰器的功能:计算函数的运行时间
import functools
@functools.wraps(f)##保留原有函数的属性
运行结果:
(2)此装饰器的功能:用户登录认证
运行结果:
(3)此装饰器的功能:认证用户的同时 , 显示用户的转账金额
import inspect
inspect.getcallargs()将传的参数封装为一个字典,字典的key值是形式参数 , value值是实参
(4)此装饰器的功能:确保收到的每个参数都是整数,是整数就求和,否则抛出错误
(5)此装饰器的功能:给装饰器传参数,是整数和浮点数就求和
python学习网,大量的免费python视频教程,欢迎在线学习!
如何在特定的作用域将python系统函数替换成自己的函数这篇文章主要介绍了Python函数式编程指南(一):函数式编程概述,本文讲解了什么是函数式编程概述、什么是函数式编程、为什么使用函数式编程、如何辨认函数式风格等核心知识,需要的朋友可以参考下1pareTo(o2))相信从这个小小的例子你也能感受到强大的生产效率:)封装控制结构的内置模板函数为了避开边界效应,函数式风格尽量避免使用变量 , 而仅仅为了控制流程而定义的循环变量和流程中产生的临时变量无疑是最需要避免的 。假如我们需要对刚才的数集进行过滤得到所有的正数,使用指令式风格的代码应该像是这样:代码如下:lst2 = list()for i in range(len(lst)): #模拟经典for循环if lst[i]0:lst2.append(lst[i])这段代码把从创建新列表、循环、取出元素、判断、添加至新列表的整个流程完整的展示了出来 , 俨然把解释器当成了需要手把手指导的傻瓜 。然而,“过滤”这个动作是很常见的,为什么解释器不能掌握过滤的流程,而我们只需要告诉它过滤规则呢?在Python里 , 过滤由一个名为filter的内置函数实现 。有了这个函数,解释器就学会了如何“过滤”,而我们只需要把规则告诉它:代码如下:lst2 = filter(lambda n: n0, lst)这个函数带来的好处不仅仅是少写了几行代码这么简单 。封装控制结构后,代码中就只需要描述功能而不是做法,这样的代码更清晰,更可读 。因为避开了控制结构的干扰,第二段代码显然能让你更容易了解它的意图 。另外,因为避开了索引,使得代码中不太可能触发下标越界这种异常,除非你手动制造一个 。函数式编程语言通常封装了数个类似“过滤”这样的常见动作作为模板函数 。唯一的缺点是这些函数需要少量的学习成本,但这绝对不能掩盖使用它们带来的好处 。闭包(closure)闭包是绑定了外部作用域的变量(但不是全局变量)的函数 。大部分情况下外部作用域指的是外部函数 。闭包包含了自身函数体和所需外部函数中的“变量名的引用” 。引用变量名意味着绑定的是变量名,而不是变量实际指向的对象;如果给变量重新赋值 , 闭包中能访问到的将是新的值 。闭包使函数更加灵活和强大 。即使程序运行至离开外部函数,如果闭包仍然可见,则被绑定的变量仍然有效;每次运行至外部函数,都会重新创建闭包 , 绑定的变量是不同的 , 不需要担心在旧的闭包中绑定的变量会被新的值覆盖 。回到刚才过滤数集的例子 。假设过滤条件中的 0 这个边界值不再是固定的,而是由用户控制 。如果没有闭包,那么代码必须修改为:代码如下:class greater_than_helper:def __init__(self, minval):self.minval = minvaldef is_greater_than(self, val):return valself.minvaldef my_filter(lst, minval):helper = greater_than_helper(minval)return filter(helper.is_greater_than, lst)请注意我们现在已经为过滤功能编写了一个函数my_filter 。如你所见,我们需要在别的地方(此例中是类greater_than_helper)持有另一个操作数minval 。如果支持闭包,因为闭包可以直接使用外部作用域的变量,我们就不再需要greater_than_helper了:代码如下:def my_filter(lst, minval):return filter(lambda n: nminval, lst)可见,闭包在不影响可读性的同时也省下了不少代码量 。函数式编程语言都提供了对闭包的不同程度的支持 。在Python2.x中,闭包无法修改绑定变量的值,所有修改绑定变量的行为都被看成新建了一个同名的局部变量并将绑定变量隐藏 。Python 3.x中新加入了一个关键字nonlocal 以支持修改绑定变量 。但不管支持程度如何,你始终可以访问(读取)绑定变量 。内置的不可变数据结构为了避开边界效应,不可变的数据结构是函数式编程中不可或缺的部分 。不可变的数据结构保证数据的一致性,极大地降低了排查问题的难度 。例如,Python中的元组(tuple)就是不可变的 , 所有对元组的操作都不能改变元组的内容,所有试图修改元组内容的操作都会产生一个异常 。函数式编程语言一般会提供数据结构的两种版本(可变和不可变),并推荐使用不可变的版本 。递归递归是另一种取代循环的方法 。递归其实是函数式编程很常见的形式,经常可以在一些算法中见到 。但之所以放到最后 , 是因为实际上我们一般很少用到递归 。如果一个递归无法被编译器或解释器优化,很容易就会产生栈溢出;另一方面复杂的递归往往让人感觉迷惑,不如循环清晰,所以众多最佳实践均指出使用循环而非递归 。这一系列短文中都不会关注递归的使用 。第一节完
推荐阅读
- mysql查看事务隔离级别,mysql事务隔离级别实现原理
- 火山视频拍摄用什么相机,火山小视频用什么相机拍好
- iOS9软件更新屏蔽插件,ios15屏蔽更新插件
- linux停止网口命令 linux停止网卡服务
- linux参数命令,linux 函数参数
- excel求和为什么不对,excel求和为啥不对
- 拍摄用什么相机平价,拍摄用什么相机平价比较好
- jsp里java代码报错 jsp文件报错
- mongodb导入json文件失败,mongodb导入数据三种方式