‌《Fluent Python》读书笔记:深度剖析2.2章节‌

2.4切片

  1. 切片和区间会忽略最后一个元素 这样做带来的好处有:1,当只有最后一个位置的信息时,我们也可以快速看出切片和区间里有几个元素,如从range(3)和my_list[:3]都返回三个元素。2,当起止位置都可见时,我们可以快速计算出切片和区间的长度,用后一个数减去第一个下标即可。3,这样做也可以让我们可以利用一个下表靶序列分割成不重叠的两个部分,只要写成my_list[:3]和my_list[3:]即可。
  2. 接下来来看看python的解释器时如何来理解切片操作的:a:b:c这种用法只能作为索引或者下标用在[]中来返回一个切片对象:slice(a,b,c)。
  3. [] 运算符里还可以使用以逗号分开的多个索引或者是切片,外部库 NumPy 里就用到了这个特性,二维的 numpy.ndarray 就可以用 a[i, j] 这种形式来获取,抑或是用 a[m:n, k:l] 的方式来得到二维切片。要正确处理这种 [] 运算符的话,对 象的特殊方法 __getitem__ 和 __setitem__ 需要以元组的形式来接收 a[i, j] 中的索引。也就是说,如果要得到 a[i, j] 的值,Python 会 调用 a.__getitem__((i, j))。 省略(ellipsis)的正确书写方法是三个英语句号(...),省略在 Python 解析器眼 里是一个符号,而实际上它是 Ellipsis 对象的别名,而 Ellipsis 对象,又是 ellipsis 类的单一实例。 它可以当作切片规范的一部分,也可以用在函数的参数清单中,如果 x 是四维数组,那 么 x[i, ...] 就是 x[i, :, :, :] 的缩写

4.给切片赋值

如果把切片放在赋值语句的左边,或把它作为del操作的对象,我们就可以对序列进行嫁接,切除或就地修改。

如果赋值对象是一个切片,那么赋值语句的右侧必须是一个可迭代对象。

2.5对序列使用+和*

  1. 通常+号两侧的序列由相同类型的数据所构成,在拼接的过程中,两个被操作序列都不会被修改,python会新建一个包含同样类型数据的序列作为拼接的结果。如果想要把一个序列复制几份然后拼接起来,更快捷的做法是将这个序列乘一个整数。
  2. 注意在a*n这个语句中,如果a是引用那么你就要格外注意了,my_list=[[]]*3这个你所得到的列表中的三个元素实际上是三个引用,并且这三个引用指向同一个列表。
  3. 有时我们血药初始化一个嵌套着几个列表的列表,想要达成这个目的最好的方法是使用列表推导。

以下将展示一个诱人的捷径,但是实际上是错的

2.6序列的增量赋值

  1. 增量赋值运算符 += 和 *= 的表现取决于它们的第一个操作对象,+= 背后的特殊方法是 __iadd__ (用于“就地加法”)。但是如果一个类 没有实现这个方法的话,Python 会退一步调用 __add__ 。 如果 a 实现了 __iadd__ 方法,就会调用这个方法。同时对可变序列 (例如 list、bytearray 和 array.array)来说,a 会就地改动,就 像调用了 a.extend(b) 一样。但是如果 a 没有实现 __iadd__ 的话,a += b 这个表达式的效果就变得跟 a = a + b 一样了:首先计算 a + b,得到一个新的对象,然后赋值给 a。也就是说,在这个表达式中, 变量名会不会被关联到新的对象,完全取决于这个类型有没有实现 __iadd__ 这个方法。 对不可变序列进行重复拼接操作的话,效率会很低,因为每次都有一个 新对象,而解释器需要把原来对象中的元素先复制到新的对象里,然后 再追加新的元素。 str 是一个例外,因为对字符串做 += 实在是太普遍了,所以 CPython 对它做了优化。为 str 初始化内存的时候,程序会为它留出额外的可扩展空间,因此进行增量操作的时候,并不会涉 及复制原有字符串到新位置这类操作。

2.7list.sort方法和内置函数sorted

list.sort方法会就地排序列表,也就是说不会把原列表赋值一份,这也是这个方法返回None的原因,如果一个函数 或者方法对对象进行的是就地改动,那它就应该返回 None,好让调用者知道传入的参数发生了变动,而且并未产生新的对象。 与 list.sort 相反的是内置函数 sorted,它会新建一个列表作为返回 值。这个方法可以接受任何形式的可迭代对象作为参数,甚至包括不可变序列或生成器。而不管 sorted 接受的是怎样的参数,它最后都会返回一个列表。(都有两个参数,一个reverse和key,reverse=True,则被排序的序列会以降序输出;key,一个只有一个参数的函数,这个函数会被用在序列里的每一个元素 上,所产生的结果将是排序算法依赖的对比关键字。可选参数 key 还可以在内置函数 min() 和 max() 中起作用。 另外,还有些标准库里的函数也接受这个参数,像 itertools.groupby() 和 heapq.nlargest() 等。

2.8用bisect来管理已排序的序列

  1. 用bisect来搜索

bisect(haystack, needle)咋 haystack中搜索neeedle的位置,该位置满足的条件是,把呢饿死了插入这个位置之后,haystack还能保存升序。也就是再说这个汗珠返回的位置前面的值,都小于或等于needle,你可以先用 bisect(haystack, needle) 查找位置 index,再 用 haystack.insert(index, needle) 来插入新值。但你也可用 insort 来一步到位,并且后者的速度更快一些。(插入之后还是有序序列)

2.用bisect.insort来插入新元素

insort(seq, item) 把变量 item 插入到序列 seq 中,并能保持 seq 的升序顺序。

2.1random.seed() 会改变随机生成器的种子;传入的数值用于指定随机数生成时所用算法开始时所选定的整数值,如果使用相同的seed()值,则每次生成的随机数都相同;如果不设置这个值,则系统会根据时间来自己选择这个值,此时每次生成的随机数会因时间的差异而有所不同。

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空