看例子,学 Python(三)

创建一个目录 myutil,把 mymath.py 挪到里面,再添加一个空文件 __init__.py:

myutil/

__init__.py

mymath.py

myutil 便是一个包(package)。

import

最直接的用法:

>>> import myutil.mymath

>>> myutil.mymath.fac(4)

24

缺点是调用 fac 时太长,包和模块作为前缀都要写全。但是写成 import myutil.mymath.fac 也是不对的。

通过 import 的语法(syntax):

import ..

可以看出:

最后一项(item)可以是包也可以是模块,前面的必须是包;

最后一项不可以是类、函数或变量的定义。

根据语法来看,可以 import 一个包:

>>> import myutil

>>> help(myutil)

...

但是这样并没有什么实际用处,因为无法就此调用具体的函数(类、变量):

>>> myutil.mymath.fac(4)

Traceback (most recent call last):

File "", line 1, in

AttributeError: module 'myutil' has no attribute 'mymath'

from...import

如果要避免调用时带着一串前缀,可以用 from...import:

>>> from myutil.mymath import fac

>>> fac(4) # 不再需要前缀

24

一次 import 多个时以逗号分割:

>>> from myutil.mymath import fib, fac

一次 import 所有:

>>> from myutil.mymath import *

from...import... 避免了前缀,但是也污染了名字,使用时需权衡。

高阶函数

高阶函数(higher-order)就是操作或返回其它函数的函数。

下面是几个经典的高阶函数,其它稍微函数式一点的语言里一般也有。

reduce(规约)

用 reduce 重写阶乘:

import operator, functools

def fac(n):

return functools.reduce(operator.mul, range(1, n+1))

用 reduce 求和:

def sum(n):

return functools.reduce(operator.add, range(1, n+1))

Python 的 reduce 就相当于 C++ 的 accumulate(C++17 已经新增 reduce)。

std::vector v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int sum = std::accumulate(v.begin(), v.end(), 0); // 求和

int product = std::accumulate(v.begin(), v.end(), 1, std::multiplies()); // 求积

map(映射)

>>> list(map(bool, [None, 0, "", u"", list(), tuple(), dict(), set(), frozenset()]))

[False, False, False, False, False, False, False, False, False]

None、0、空字符串、以及没有元素的容器对象都可视为 False,反之为 True。

filter(过滤)

>>> list(filter(bool, [None, 0, "", 1]))

[1]

数据模型

== vs. is

== 判断值是否相等,is 判断两个变量是否为同一个对象。

这就好像 Java 里的 == 和 equals 一样。

下面是一些例子:

>>> a, b = 1, 1

>>> a == b

True

>>> a is b

True

a == b 比较好理解,a is b 是因为 Python 对整数做了优化,a 和 b 都指向同一个预先分配的对象(其值为 1)。

可以理解为 is 比较的是对象的内存地址。

内建函数 id() 返回对象的唯一标识,可以理解为内存地址。

>>> id(a), id(b)

(35169392, 35169392)

甚至可以拿到一个对象的引用计数(reference count):

>>> import sys

>>> sys.getrefcount(a)

99

>>> sys.getrefcount(b)

99

引用计数为 99 有点意外,其实是因为很多装载的内建模块都用到了整数 1。

不妨看看其它整数如何:

>>> sys.getrefcount(0)

169

>>> sys.getrefcount(255)

4

对 Python 来说,变量只是名字,它的类型和值取决于它所绑定的对象。我们可以把 a b 绑定到其它对象:

>>> a, b = "hello", "hello"

>>> a is b

True

同样,a is b 是因为 Python 对字符串做了优化。

值得一提的是,这种优化(也即引用计数)可能只针对 CPython,对于 Python 的其它实现可能就不是这样了。你的程序不该依赖于这些特定于解释器的实现。

整数和字符串有一个共同点,即它们都是不可变的(immutable),现在来看看可变对象,比如列表:

>>> c, d = [a, b], [a, b]

>>> c == d

True

>>> c is d

False

可见虽然 c 和 d 具有相等的值,但对象是不同的两个。

这些就是 Python 的数据模型(Data Model),虽然不是全部。

对象

Python 的每一个对象(object)都有以下三个部分:

身份(identity)

类型(type)

值(value)

身份:

不可改变(unchangeable)(一旦对象创建了就不会改变)

对应于内存地址

通过操作符 is 进行比较: a is b

函数 id() 返回对象唯一的整形标识(内存地址)

类型:

不可改变(unchangeable)

函数 type() 返回对象类型

值:

可变的(mutable):字典,列表

不可变的(immutable):数字,字符串,元组

最后,对象不会被显式地销毁(explicitly destroyed)。

对 CPython 来说,对象由引用计数管理,计数为 0 时对象会自动销毁。

练习

最后留一道练习。

给定:

>>> c = []

>>> d = []

>>> c is d

False

请问:

>>> e = f = []

>>> e is f

???

python对象模型映射_看例子,学 Python(三)相关推荐

  1. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  2. 看漫画学python 豆瓣_你最大的问题在于学python太枯燥(看漫画学python)

    如果你只是停留在看书看教程自学的学习方式 很少能有人从这种死胡同走出来,这种学习方式往往也特别无聊! 要是以就业为目的学习Python还是需要通过一个系统的学习来培养代码思路 无论我们学习Python ...

  3. 用漫画的形式学习Python,Python好书推荐——《看漫画学Python》

    毫无疑问,Python是目前最热门的编程语言之一.对于很多从未参与过计算机编程的"小白"来说,似乎很难深入掌握Python.其实只要掌握科学的学习方法,制定合理的学习计划,Pyth ...

  4. python对象模型映射_【500 Lines or Less】-【翻译练习】-【chapter 14】-【简单对象模型】-【第一部分】...

    date: 2017-10-08 15:31:46 Carl Friedrich Bolz是伦敦国王大学的研究员,对动态语言的实现及优化兴趣浓厚.他是 PyPy/RPython 的核心贡献者之一,并为 ...

  5. 适合小学生python的书_小学生开始学Python,最接近AI的编程语言:安利一波Python书单...

    原标题:小学生开始学Python,最接近AI的编程语言:安利一波Python书单 AlphaGo 都在使用的 Python 语言,是最接近 AI 的编程语言. 教育部考试中心近日发布了"关于 ...

  6. python 智能造句_[零基础学Python]正规地说一句话

    小孩子刚刚开始学说话的时候,常常是一个字一个字地开始学,比如学说"饺子",对他/她来讲,似乎有点难度,大人也聪明,于是就简化了,用"饺饺"来代替,其实就是让孩子 ...

  7. python做外贸_跟着销售学python(3)---开发微信公平台(1)

    跟着销售学python(3)--- 开发微信公共平台(1) 首先交代一下, 目前我的学习背景啊: 我自己是一个创业的外贸服务公司, 自己主要做销售,学python主要目的是为了工作上的帮助吧. 自己的 ...

  8. 趣学python编程答案_《趣学Python编程》习题总结

    上周买了本书叫<趣学Python编程>(英文名:Python for kids),昨天看完后把书后面的题都做了下.由于第1.2章没有习题,第13章及之后都是描写实例的章节,因此这个总结性的 ...

  9. 趣学python编程下载_《趣学Python编程》——1.2 安装Python

    本节书摘来自异步社区<趣学Python编程>一书中的第1章,第1.2节,作者[美]Jason Briggs,尹哲 译,更多章节内容可以访问云栖社区"异步社区"公众号查看 ...

最新文章

  1. LAMP+Postfix+Dovecot+Postfixadmin搭建邮件管理系统(四)
  2. 微信小程序-canvas绘制文字实现自动换行
  3. SAP HANA中的SLT简介
  4. .NET6又出新版本,新增这几个大杀器!
  5. IDEA for win 常用快捷键
  6. apache伪静态把css 排除掉_(02)CSS 选择器详解 | CSS
  7. 设计模式学习--工厂模式
  8. IE6 PNG透明终极解决方案
  9. 计算机知识中h表达什么意思,计算机地基础知识hzh.ppt
  10. linux 大黄蜂怎么安装视频教程,使用神舟K680E-G6D1在Deepin Linux系统下安装大黄蜂驱动的方法...
  11. TSP、MTSP问题遗传算法详细解读及python实现
  12. 刚刚,5000000 里程碑达成!
  13. epub与txt的区别是什么?有什么好用的IOS手机epub阅读器
  14. 软件测试工程师...我是如何正确地申请加薪的!
  15. 2018北大数学夏令营游记
  16. AI作画的人机战争走向何方?
  17. uni-app 188修复弹框问题
  18. 计算机应用基础说课方案,广东省“XX杯”说课大赛计算机应用基础类一等奖作品:PPT写字动画的制作教学设计方案.doc...
  19. 德鲁周记13--最小二乘、RANSAC与霍夫变换的区别
  20. Go 笔记之为什么要学 Go

热门文章

  1. 232/485电平,OC门,OD门,TTL电平,CMOS电平,
  2. 关于Linux系统下在使用close关闭串口设备时引起的内核崩溃问题解决方法
  3. Ubuntu下添加开机启动脚本
  4. qhfl-6 购物车
  5. 1593: 01串(找规律)
  6. Flink Forward Asia Hackathon 最新参赛指南请查收
  7. Java如何支持函数式编程?
  8. 免费下载 | 全景揭秘阿里文娱智能算法
  9. php 上传 tmp_name 空,PHP文件上载错误tmp_name为空
  10. 如何让手游内存占用更小?从内存消耗iOS实时统计开始