前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过内置对象理解 Python(十)

通过内置对象理解 Python(十)

作者头像
老齐
发布2021-12-15 13:47:00
3330
发布2021-12-15 13:47:00
举报
文章被收录于专栏:老齐教室

abs, divmod, pow and round :数学基础

这四个数学函数在编程中非常常见,它们被直接放在随时可用的内置函数中,而不是放在 math 模块中。

它们非常简单:

abs 返回一个数字的绝对值,例如:

代码语言:javascript
复制
>>> abs(42)
42
>>> abs(-3.14)
3.14
>>> abs(3-4j)
5.0

divmod 返回除法运算后的商和余数:

代码语言:javascript
复制
>>> divmod(7, 2)
(3, 1)
>>> quotient, remainder = divmod(5327, 100)
>>> quotient
53
>>> remainder
27

pow 返回一个值的指数运算结果:

代码语言:javascript
复制
>>> pow(100, 3)
1000000
>>> pow(2, 10)
1024

round 按照四舍五入原则返回数字:

代码语言:javascript
复制
>>> import math
>>> math.pi
3.141592653589793
>>> round(math.pi)
3
>>> round(math.pi, 4)
3.1416
>>> round(1728, -2)
1700

isinstance and issubclass :类型检查

type 内置函数可以用于对象的类型检查,就像这样:

代码语言:javascript
复制
def print_stuff(stuff):
    if type(stuff) is list:
        for item in stuff:
            print(item)
    else:
        print(stuff)

这个函数中检验参数对象是否是 list 类型。

代码语言:javascript
复制
>>> print_stuff('foo')
foo
>>> print_stuff(123)
123
>>> print_stuff(['spam', 'eggs', 'steak'])
spam
eggs
steak

目前看起来,它能运行,但是,实际上存在一些问题。这里有一个例子:

代码语言:javascript
复制
>>> class MyList(list):
...     pass
...
>>> items = MyList(['spam', 'eggs', 'steak'])
>>> items
['spam', 'eggs', 'steak']
>>> print_stuff(items)
['spam', 'eggs', 'steak']

当然,items 仍然是一个列表,但是 print_stuff 函数不再识别它了。原因很简单,因为 type(items) 的返回值是 MyList ,不是 list

也可以说,函数 type 没有考虑继承问题,如果改用 isinstance ,它不仅检查一个对象是否是一个类的实例,它还检查该对象是否是一个子类的实例:

代码语言:javascript
复制
>>> class MyList(list):
...     pass
...
>>> items = ['spam', 'eggs', 'steak']
>>> type(items) is list
True
>>> isinstance(items, list)
True   # Both of these do the same thing

>>> items = MyList(['spam', 'eggs', 'steak'])
>>> type(items) is list
False  # And while `type` doesn't work,
>>> isinstance(items, list)
True   # `isinstance` works with subclasses too.

类似地, issubclass 检查一个类是否是另一个类的子类。isinstance 的第一个参数是一个对象,但 issubclass 的第一个参数是另一个类:

代码语言:javascript
复制
>>> issubclass(MyList, list)
True

所以,应该将 print_stuff 函数中的 type 替换为 isinstance ,优化之后,继续测试:

代码语言:javascript
复制
>>> items = ('spam', 'eggs', 'steak')
>>> print_stuff(items)
('spam', 'eggs', 'steak')

如果传入的实参不是列表,则不能输出实参对象类型。对此的一种解决方法就是通过多分支的 if 语句实现。如果只是内置对象还好办一些,尽管如此,分支太多,代码也是丑陋的。

为此,Python 中有一个含有各种内置类型的“类”,可以用它们来测试类的某些“行为”,而不是测试类本身。在我们的例子中,行为是作为其他对象的容器,称之为 Container

代码语言:javascript
复制
>>> from collections.abc import Container
>>> items = ('spam', 'eggs', 'steak')
>>> isinstance(items, tuple)
True
>>> isinstance(items, list)
False
>>> isinstance(items, Container)
True  # This works!

每个容器对象类型都会在 Container 基类的检查中返回 Trueissubclass 也行之有效:

代码语言:javascript
复制
>>> from collections.abc import Container
>>> issubclass(list, Container)
True
>>> issubclass(tuple, Container)
True
>>> issubclass(set, Container)
True
>>> issubclass(dict, Container)
True

把它添加到代码中,就变成:

代码语言:javascript
复制
from collections.abc import Container
def print_stuff(stuff):    
    if isinstance(stuff, Container):     
        for item in stuff:           
            print(item)    
    else:       
        print(stuff)

最后要特别声明:在实际的编程中,不提倡对参数类型进行检查。具体原因,请参阅《Python 大学实用教程》(电子工业出版社)中对“多态”的讲解内容。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • isinstance and issubclass :类型检查
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档