Python一等函数
一等对象
一等对象的定义:
(1)在运行时创建
(2)能赋值给变量或数据结构中的元素
(3)能作为参数传给函数
(4)能作为函数的返回结果
▲ Python中,整数、字符串和字典、函数都是一等对象。
▲ 函数的__doc__属性用于生成对象的帮助文本。用于help(function1)命令输出内容
def function1(num):
''' return n! '''
return 1 if n<2 else n * function1(n-1) >>> funtion1.__doc__
' return n! '
高阶函数:
接受函数为参数,或者把函数作为结果返回的函数是高阶函数。(map函数、sorted函数、filter函数、reduce函数)
匿名函数:
lambda函数的定义体只能使用纯表达式。不能赋值,也不能使用while和try等python语句。
在参数列表中最适合使用匿名函数。
可调用对象:
除了用户定义的函数,调用运算符()还可以引用到其他对象上。可以使用内置的callable()函数判断对象能否调用。
7种可调用对象:
用户定义的函数,def语句或lambda表达式创建。
内置函数:C语言实现的函数,len等
内置方法:C语言实现的方法,dict.get
方法:在类的定义体中定义的函数
类:调用类时会运行类的__new__方法创建一个实例,然后运行__init__方法,初始化实例,最后把实例返回给调用方。
类的实例:如果类定义了__call__方法,那么它的实例可以作为函数调用。
生成器函数:使用yield关键字的函数或方法。调用生成器函数返回的是生成器对象。生成器函数还可以作为协程。
函数的参数处理机制
函数的参数处理机制:
函数对象有个__defaults__属性,值是一个元组,保存着位置参数和关键字参数的默认值。
仅限关键字参数的默认值保存在__kwdefaults__属性中。
参数名称在__code__.co_varnames 中,同时里面还保存了函数定义体中创建的局部变量。
所以参数名称是前N个字符。N的值通过__code__.co_argcount 获取。因此要从后向前扫描才能把参数和默认值对应起来。
def tag(name,max_len=80,mix_len=0,*content,cls=None,**kwargs):
a = 0 >>> print(tag.__defaults__)
(80, 0)
>>> print(tag.__kwdefaults__)
{'cls': None}
>>> print(tag.__code__.co_varnames)
('name', 'max_len', 'mix_len', 'cls', 'content', 'kwargs', 'a')
>>> print(tag.__code__.co_argcount)
3
函数参数验证
inspcet模块
inspect.signature函数返回一个inspect.Signature对象,它有一个parameters属性和return_annotation属性。
parameters属性里是一个有序映射,把参数名和inspect.Paramter对象对应起来。
每个Paramter属性也有自己的属性(如name、default、和kind)inspect_empty表示没有默认值
inspect.Signature对象有一个bind方法,可以任意个参数绑定到签名】、中的形参上。
使用这个方法在调用函数前验证参数。
import inspect sig = inspect.signature(tag)
my_tag = {
'name':'Wu',
'max_len':50,
'min_len':10,
'cls':'cls_1',
'img':'k:/',
}
v_args = sig.bind(**my_tag)
for name,value in v_args.arguments.items() #v_args.arguments一个OrderedDict对象
print(name, '=' value) >>> del my_tag['name']
>>> bound_args = sig.bind(**my_tag)
Traceback (most recent call last):
...
TypeError: missing a required argument: 'name'
函数注解
函数注解:
为函数声明中的参数和返回值附加元数据。
函数声明中的各个参数可以再:之后增加注解表达式。如果参数有默认值,注解放在参数名和 = 号之间。
如果想注解返回值,在)和函数声明:之间添加 -> 和一个表达式。表达式可以是任何类型。(常用int,str和字符串)
>>> def f(ham: str, eggs: str = 'eggs') -> str:
注解以字典形式存储在函数的__annotations__属性中
>>> sig =inspect.signature(tag)
>>> sig.return_annotation
<class 'str'>
>>> for param in sig.paramters.values():
print(param.annotation)
print(param.name)
print(param.default)
Python一等函数的更多相关文章
- Python 一等函数
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 在 Python 中,函数是一等对象.编程语言理论家把"一等 ...
- python技巧 一等函数
函数在python中作为一等函数,具有以下特点: 1.可以作为参数传递给其他函数 2.作为其他函数的值返回 3.能赋值给变量或数据结构中的元素 4.在运行的时候创建 In [1]: def add(x ...
- 流畅的python 使用一等函数实现设计模式
案例分析:重构“策略”模式 经典的“策略”模式 电商领域有个功能明显可以使用“策略”模式,即根据客户的属性或订单中的商品计算折扣.假如一个网店制定了下述折扣规则. 有 1000 或以上积分的顾客,每个 ...
- 《流畅的Python》第三部分 把函数视作对象 【一等函数】【使用一等函数实现设计模式】【函数装饰器和闭包】
第三部分 第5章 一等函数 一等对象 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传递给函数 能作为函数的返回结果 在Python中,所有函数都是一等对象 函数是对象 函数本身是 func ...
- Fluent_Python_Part3函数即对象,05-1class-func,一等函数,函数即对象
一等函数 一等函数即将函数看作一等对象.一等对象满足一下条件: 在运行时创建 能赋值给变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 1. 一等函数 例子1. 证明function是 ...
- python的函数
函数一词起源于数学,但是在编程中的函数和数学中的有很大不同.编程中的函数式组织好的,可重复使用的,用于实现单一功能或相关联功能的代码块. 我们在学习过程中已经使用过一些python内建的函数,如pri ...
- python strip()函数 介绍
python strip()函数 介绍,需要的朋友可以参考一下 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除 ...
- python split()函数
Python split()函数 函数原型: split([char][, num])默认用空格分割,参数char为分割字符,num为分割次数,即分割成(num+1)个字符串 1.按某一个字符分割. ...
- Python数学函数
1.Python数学函数 1.abs(x):取绝对值,内建函数 2.math.ceil(x):向上取整,在math模块中 3.cmp(x,y):如果 x < y ,返回-1:如果 x == y ...
随机推荐
- 将neo4j的一个节点上的关系移动到另一个节点上
将neo4j中一个节点的全部关系移动到另一个节点上面,采用先建立新关系,之后删除原先的关系的方式 def move_relations(source_node_id,target_node_id,gr ...
- Java--垃圾回收【转载】
一:垃圾回收机制的意义 java 语言中一个显著的特点就是引入了java回收机制,可以有效的防止内存泄露,有效的使用空闲的内存. 内存泄露:指该内存空间使用完毕后未回收,在不涉及复杂数据结构的一般情况 ...
- Idea中maven的设置
File->setting 输入MAVEN 看到右侧设置情况 Maven home directory 熟路本地moven 仓库目录:D:/springboot/apach ...
- S02_CH07_ ZYNQ PL中断请求
S02_CH07_ ZYNQ PL中断请求 7.1 ZYNQ 中断介绍 7.1.1 ZYNQ中断框图 可以看到本例子中PL到PS部分的中断经过ICD控制器分发器后同时进入CPU1 和CPU0.从下面的 ...
- Educational Codeforces Round 71 (Rated for Div. 2) Solution
A. There Are Two Types Of Burgers 题意: 给一些面包,鸡肉,牛肉,你可以做成鸡肉汉堡或者牛肉汉堡并卖掉 一个鸡肉汉堡需要两个面包和一个鸡肉,牛肉汉堡需要两个面包和一个 ...
- TypeScript入门四:TypeScript的类(class)
TypeScript类的基本使用(修饰符) TypeScript类的抽象类(abstract) TypeScript类的高级技巧 一.TypeScript类的基本使用(修饰符) TypeScript的 ...
- briup_JDBC
连接mysql和orcle的驱动jar包 链接:https://pan.baidu.com/s/1M5RZY62UOZbfFGIwDQK6SQ 提取码:cu6e 复制这段内容后打开百度网盘手机App ...
- django的几种缓存配置
前言 首先说,为什么要用缓存的,由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存 ...
- 十九:mvc强类型声明
落下了几节,自己很懒啊, 得找个时间补上... 1. 强类型 是指变量在定义时就已经明确指定了其类型.如: string s; int x; 2.弱类型 赋值时才确定类型. var s; var x ...
- [Abp vNext微服务实践] - 租户登录
简介 Abp vNext微服务授权验证基于ids4,实现租户登录需要在授权服务中获取token,和之前的介绍的登录方式一样,只是多了tenant参数.本篇将介绍在Abp vNext授权服务中启用多租户 ...