流畅的Python 5. 函数

文章目录

    • 1. 函数对象
    • 2. 高阶函数
    • 3. 匿名函数
    • 4. 可调用函数
    • 5. 定位参数、仅限关键字参数
    • 6. 获取参数信息
    • 7. 函数注解
    • 8. 支持函数式编程的包

1. 函数对象

def factorial(n):'''returns n! n的阶乘'''return 1 if n < 2 else n * factorial(n - 1)print(factorial(42))
print(factorial.__doc__)  # returns n! n的阶乘
print(type(factorial))  # <class 'function'>fact = factorial
print(fact)  # <function factorial at 0x0000021512868EA0>
print(fact(4))  # 24
print(list(map(factorial, range(11))))
# [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]

2. 高阶函数

  • 接受函数作为参数,如 map,sorted
fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana']
print(sorted(fruits, key=len))  # 按长度排序
# ['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']def reveres(word):return word[::-1]print(reveres("michael"))  # leahcim
print(sorted(fruits, key=reveres)) # 逆序字符串排序
# ['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']

3. 匿名函数

  • lambda
print(sorted(fruits, key=lambda w : w[::-1]))
# ['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']

4. 可调用函数

  • 对象是否可调用:callable()
print([callable(obj) for obj in (abs, str, 13, factorial)]) # [True, True, False, True]
  • 任意对象实现可调用:实现 __call__()
import randomclass BingoCage:def __init__(self, items):self._items = list(items)random.shuffle(self._items)def pick(self):try:return self._items.pop()except IndexError:raise LookupError("pick from empty BingoCage")def __call__(self):return self.pick()arr = [1, 2, 3, 4, 5]
bc = BingoCage(arr);
print(bc._items)  # [1, 4, 3, 5, 2]
print(bc.pick())  # 2
print(bc._items)  # [1, 4, 3, 5]
print(bc())  # 5, bc 实现了 __call_() 可调用
print(bc._items)  # [1, 4, 3]
print(callable(bc))  # True

5. 定位参数、仅限关键字参数

def tag(name, *content, cls=None, **attrs):"""生成一个或多个HTML标签"""if cls is not None:attrs['class'] = clsif attrs:attr_str = ''.join(' %s="%s"' % (attr, value)for attr, valuein sorted(attrs.items()))else:attr_str = ''if content:return '\n'.join('<%s%s>%s</%s>' %(name, attr_str, c, name) for c in content)else:return '<%s%s />' % (name, attr_str)print(tag('br'))  # <br />
print(tag('p', 'hello'))  # <p>hello</p>
print(tag('p', 'hello', 'world')) 
# 第一个参数后的任意个 参数 被 *content 捕获,存入元组
# <p>hello</p>
# <p>world</p>
print(tag('p', 'hello', id=33, pid=24)) 
# 没有明确指定名称的关键字参数被 **attrs 捕获,存入字典
# <p id="33" pid="24">hello</p>
print(tag('p', 'hello', 'world', id=33, cls='sidebar', pid=24)) 
# cls 参数只能作为关键字参数
# <p class="sidebar" id="33" pid="24">hello</p>
# <p class="sidebar" id="33" pid="24">world</p>
print(tag(cont='testing', name="img"))
# <img cont="testing" />
my_tag = {'name': 'img', 'title': 'Sunset Boulevard','src': 'sunset.jpg', 'cls': 'framed'}
print(tag(**my_tag)) 
# ** 字典中所有元素作为单个参数传入,同名键绑定到对应具名参数,余下被 **attrs 捕获
# <img class="framed" src="sunset.jpg" title="Sunset Boulevard" />
def f(a, *c, b):return a, bprint(f(1, b=2))  # (1, 2)
print(f(1, 2, b=3))  # (1, 3) b= 必须写,因为前面有 * 参数# print(f(1, 2))  # f() takes 1 positional argument but 2 were givendef f1(a, b, *c):return a, bprint(f1(1, b=2))  # (1, 2)
print(f1(1, 2))  # (1, 2)
print(f1(1, 2, 3))  # (1, 2)

6. 获取参数信息

from inspect import signature
sig = signature(tag)
print(sig) # (name, *content, cls=None, **attrs)my_tag = {'name': 'img', 'title': 'Sunset Boulevard','src': 'sunset.jpg', 'cls': 'framed'}
bound_args = sig.bind(**my_tag)
print(bound_args)
# <BoundArguments (name='img', cls='framed', attrs={'title': 'Sunset Boulevard', 'src': 'sunset.jpg'})>
del my_tag['name']
bound_args = sig.bind(**my_tag)
# TypeError: missing a required argument: 'name'

7. 函数注解

  • 对参数,返回值进行注释,解释器不做检查
def clip(text: str, max_len: 'int > 0' = 80) -> str:passprint(clip.__annotations__)  # 一个字典
# 注解可以是 类 或者 字符串
# {'text': <class 'str'>, 'max_len': 'int > 0', 'return': <class 'str'>}
sig = signature(clip)
print(sig)  # (text: str, max_len: 'int > 0' = 80) -> str
print(sig.return_annotation)  # <class 'str'>
for param in sig.parameters.values():print(param.name, " ", param.annotation, " ", param.default)
# text   <class 'str'>   <class 'inspect._empty'>
# max_len   int > 0   80

8. 支持函数式编程的包

  • operator
from functools import reducedef fact(n):return reduce(lambda a, b: a * b, range(1, n + 1))print(fact(5))from operator import muldef fact1(n):return reduce(mul, range(1, n + 1))print(fact1(5))
metro_data = [('Tokyo', 'JP', 36.933, (35.689722, 139.691667)),('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
]
from operator import itemgetter
import operator
for city in sorted(metro_data, key=itemgetter(1)):print(city)  # 按照 索引 1 排序cc_name = itemgetter(1, 0)
for city in metro_data:print(cc_name(city))
# ('JP', 'Tokyo')
# ('IN', 'Delhi NCR')
# ('MX', 'Mexico City')
# ('US', 'New York-Newark')
# ('BR', 'Sao Paulo')print([name for name in dir(operator) if not name.startswith('_')])
# ['abs', 'add', 'and_', 'attrgetter', 'concat', 'contains', 'countOf',
# 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand',
# 'iconcat', 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul', 'index',
# 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift', 'is_', 'is_not',
# 'isub', 'itemgetter', 'itruediv', 'ixor', 'le', 'length_hint', 'lshift',
# 'lt', 'matmul', 'methodcaller', 'mod', 'mul', 'ne', 'neg', 'not_', 'or_',
# 'pos', 'pow', 'rshift', 'setitem', 'sub', 'truediv', 'truth', 'xor']
from operator import methodcallers = 'the time has come'
upcase = methodcaller('upper') # 调用指定的方法 'upper'
print(upcase(s))  # THE TIME HAS COME
connect = methodcaller('replace', ' ', '-')
print(connect(s)) # the-time-has-come
from operator import mul
from functools import partialtriple = partial(mul, 3)
print(triple(7))  # 21
print(list(map(triple, range(1, 10))))
# [3, 6, 9, 12, 15, 18, 21, 24, 27]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python方向键键值_python字典键值对的添加和遍历方法

添加键值对 首先定义一个空字典 >>> dic{} 直接对字典中不存在的key进行赋值来添加 >>> dic[name]zhangsan >>> dic {name: zhangsan} 如果key或value都是变量也可以用这种方法 >>> keyage >>> value30 >>> dic[key]val…

无穷大正整数 python_python模块:数字处理

http://blog.csdn.net/pipisorry/article/details/37055183python数字处理简介数字类型python没有unsighed int&#xff1a;The Python int is an abstraction of an integer value, not a direct access to a fixed-byte-size integer.不过int还是当成sighed int处理的&#x…

linux主机基本情况,查看linux主机系统基本信息.pdf

查看linux 主机系统的基本信息一、 硬件信息1. CPUa. Cat /proc/cpuinfo例&#xff1a;[rootlinux victor]# cat /proc/cpuinfoprocessor : 0vendor_id : GenuineIntelcpu family : 6model : 13model name : Intel(R) Celeron(R) M processor 1.50GHzstepping : 8cpu MHz : 150…

LeetCode 1805. 字符串中不同整数的数目(哈希set)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 word &#xff0c;该字符串由数字和小写英文字母组成。 请你用空格替换每个不是数字的字符。 例如&#xff0c;“a123bc34d8ef34” 将会变成 " 123 34 8 34" 。 注意&#xff0c;剩下的这些整数间至少要用一个空格隔…

Android线程之异步消息处理机制(二)——Message、Handler、MessageQueue和Looper

异步消息处理机制解析 Android中的异步消息处理主要有四个部分组成&#xff0c;Message、Handler、MessageQueue和Looper。 1、Message Message是在线程之间传递的消息&#xff0c;它可以在内部携带少量的信息&#xff0c;用于在不同线程之间交换数据。上个例子中就使用了Messa…

linux 树状结构图,linux下tree指令的用法, 树状图列出目录, 树状图逐级列出目录...

tree命令&#xff0c;主要功能是创建文件列表&#xff0c;将所有文件以树的形式列出来linux下的tree就比较强大了&#xff0c;但一般系统并不自带这个命令&#xff0c;需要手动下载安装,安装sudo apt install tree## or using yum# yum -y install tree语法tree[-aACdDfFgilnNp…

映射表map(平衡二叉树实现)_手动实现Java集合容器之TreeMap(上)

上一篇我们手写了HashMap&#xff0c;还有一个很重要的Map的实现类TreeMap。打开源码第一句话&#xff1a;* A Red-Black tree based {link NavigableMap} implementation.TreeMap是一个基于红黑树的实现。对红黑树没有了解怎么办&#xff0c;那就先搞清楚红黑树的原理。只要理…

wltc循环多少公里_原来所有车都烧机油!但是烧多少才算正常你知道吗?

点击上方“腾讯汽车”关注我们&#xff0c;最新汽车资讯&#xff0c;最方便的用车常识还有最萌的小编都在这里啦&#xff01;最为当今汽车用户最为关心的问题&#xff0c;烧机油现象被很多用户当做引擎是好是坏的重要标准。但根据机油在引擎内冷却及清理引擎内杂质的循环机制来…

LeetCode 1806. 还原排列的最少操作步数(模拟)

文章目录1. 题目2. 解题1. 题目 给你一个偶数 n​​​​​​ &#xff0c;已知存在一个长度为 n 的排列 perm &#xff0c;其中 perm[i] i​&#xff08;下标 从 0 开始 计数&#xff09;。 一步操作中&#xff0c;你将创建一个新数组 arr &#xff0c;对于每个 i &#xff…

linux 间隔定时器,Linux间隔定时器的使用 探索一

2011年1月17日之前看《高级Unix编程》说有基本定时器与高级定时器之分好像基本定时器不符合我的要求&#xff0c;那么就先来个高级的吧。写个代码看看会有什么发生&#xff1a;2011年1月18日看下timer_create函数intt1;timer_t tm_id;//timer_t其实是个long型t1 timer_create(…

游标操作 for Oracle

游标用来处理从数据库中检索的多行记录&#xff08;使用SELECT语句&#xff09;。利用游标&#xff0c;程序可以逐个地处理和遍历一次检索返回的整个记录集。 为了处理SQL语句&#xff0c;Oracle将在内存中分配一个区域&#xff0c;这就是上下文区。这个区包含了已经处理完的行…

python3经典实例_Python3十大经典错误及解决办法

接触了很多Python爱好者&#xff0c;有初学者&#xff0c;亦有转行人。不论大家学习Python的目的是什么&#xff0c;总之&#xff0c;学习Python前期写出来的代码不报错就是极好的。下面&#xff0c;严小样儿为大家罗列出Python3十大经典错误及解决办法&#xff0c;供大家学习。…

python谱聚类算法_谱聚类Spectral clustering(SC)

在之前的文章里&#xff0c;介绍了比较传统的K-Means聚类、Affinity Propagation(AP)聚类、比K-Means更快的Mini Batch K-Means聚类以及混合高斯模型Gaussian Mixture Model(GMM)等聚类算法&#xff0c;今天介绍一个比较近代的一类算法——Spectral Clustering 中文通常称为“谱…

LeetCode 1807. 替换字符串中的括号内容(哈希map)

文章目录1. 题目2. 解题1. 题目 给你一个字符串 s &#xff0c;它包含一些括号对&#xff0c;每个括号中包含一个 非空 的键。 比方说&#xff0c;字符串 "(name)is(age)yearsold" 中&#xff0c;有 两个 括号对&#xff0c;分别包含键 “name” 和 “age” 。 你知…

bootice.exe linux 启动盘,下载BOOTICE来把你的U盘做成启动盘

为了方便维护电脑&#xff0c;需要制作一个合适的U盘启动盘。网上制作U盘启动盘的工具也有很多&#xff0c;我下面使用bootice这个U盘启动盘制作工具来制作U盘启动盘。下载BOOTICE1、BOOTICE>分区管理G&#xff0c;对U盘进行格式化&#xff0c;FAT16&#xff0c;卷标设置为G…

数据类型的选择

1、CHAR与VARCHAR CHAR与VARCHAR类型类似&#xff0c;都用来存储字符串。 CHAR&#xff1a;固定长度&#xff0c;处理速度较VARCHAR快&#xff0c;但浪费空间。 VARCHAR&#xff1a;可变长度 1 CHAR(4)和VARCHAR(4)列检索的值并不总相同&#xff0c;CHAR列删除了尾部的空格 2、…

excel打开空白_啥?下载的文件显示“文件已损坏,无法打开”?

推荐文章&#xff1a;Windows10系统的优化工具神器对于一个开发人员的我&#xff0c;这两天在网站做一个导出Excel表格功能&#xff0c;遇到了一个坑。在本地测试导出并且可以打开&#xff0c;但是到了测试环境导出打开却显示“文件已损坏&#xff0c;无法打开”。刚开始以为是…

erp故障处理流程图_PLC故障常见原因及处理方法!

欢迎关注“热控圈 ” ID&#xff1a;rekongquan传播热控知识&#xff0c;分享技术精华&#xff01;第一部分、运行中PLC故障常见原因及处理方法(一)、外围电路元器件故障此类故障在PLC工作一定时间后的故障中经常发生。在PLC控制回路中如果出现元器件损坏故障&#xff0c;PLC控…

LeetCode 1808. 好因子的最大数目(整数拆分,乘积最大)

文章目录1. 题目2. 解题1. 题目 给你一个正整数 primeFactors 。你需要构造一个正整数 n &#xff0c;它满足以下条件&#xff1a; n 质因数&#xff08;质因数需要考虑重复的情况&#xff09;的数目 不超过 primeFactors 个。n 好因子的数目 最大化。 如果 n 的一个因子可以…

请输入星期的第一个字母c语言,C语言经典案例:请输入星期几的第一个字母来判断一下是星期几,...

需求描述&#xff1a;请输出礼拜几的第一个字母来断定一下是礼拜几&#xff0c;假如第一个字母一样&#xff0c;则持续断定第二个字母。C语言案例分析&#xff1a;用情形语句比拟好&#xff0c;假如第一个字母一样&#xff0c;则断定用情形语句或if语句断定第二个字母。实现代码…