摘要:看例子,学三看例子,学一看例子,学二包创建一个目录,把挪到里面,再添加一个空文件便是一个包。对来说,对象由引用计数管理,计数为时对象会自动销毁。给定请问看例子,学一看例子,学二
看例子,学 Python(三)
看例子,学 Python(一)
看例子,学 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 "from...import", line 1, in AttributeError: module "myutil" has no attribute "mymath"
如果要避免调用时带着一串前缀,可以用 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 重写阶乘:
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::vectormap(映射)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 ()); // 求积
>>> 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(二)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/38638.html
摘要:看例子,学二看例子,学一看例子,学三模块文件定义了函数和,就是一个模块。这个列表里的每个元素都是一个键值对,由元组表示。指定的为,便以每个键值对元组下标为的元素进行排序。可将其它序列类型转换成元组看例子,学一看例子,学三 看例子,学 Python(二) 看例子,学 Python(一)看例子,学 Python(三) 模块 文件 mymath.py 定义了函数 fib 和 fac,myma...
摘要:从开始,通过一系列不同实现,简单介绍字符串函数等概念。如果文档字符串有多行,可以使用三重引号的字符串函数返回值只要是函数,都有返回值,没有明确指定返回值的,就返回。看例子,学二看例子,学三 看例子,学 Python(一) 看例子,学 Python(二)看例子,学 Python(三) 很难说,这篇代码比文字还多的文章,是否适合初学者。它源于个人笔记,涉及的多是简单核心的概念,也许需要一些...
摘要:在流程控制中,你将同步学到关系运算符与逻辑运算符。关系运算符在中关系运算符其实就是比大小的概念,所以要学习的就是大于小于等于等内容。逻辑运算符逻辑运算符在中有个,分别是。含有逻辑运算符的式子,最终返回的结果也是布尔值。 滚雪球学 Python,目标就是让 Python 学起来之后,越滚越大。三、无转折不编程如果...
摘要:为啥你天天刷抖音一点都不烦,因为你觉得视频好看你有兴趣啊。比如我们说你玩是不是要开始搭建一个自己的网站,是不是可以自己写一个小的脚本来自动发消息给你的女朋友等等,通过这样的小例子来慢慢的培养自己的学习的兴趣。学习,切勿贪快贪多。 大家好,我是菜鸟哥! 周末啦,跟大家聊一下我们粉丝团的情况...
阅读 809·2021-11-22 11:59
阅读 3193·2021-11-17 09:33
阅读 2289·2021-09-29 09:34
阅读 1921·2021-09-22 15:25
阅读 1908·2019-08-30 15:55
阅读 1304·2019-08-30 15:55
阅读 514·2019-08-30 15:53
阅读 3322·2019-08-29 13:55