首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python-元组与列表(二)

从今天开始,每天附上一道代码题,供读者享用,请务必真真正正做题,并实际运行测试,否则,是不可能学会编程的。下面资料来源于网上,但看上去比较规范。虽然简单了些,但初学者是需要激励的。注意,如果英语看不懂,后面有中文,足以理解题目。

Write a program which will find all such numbers which are divisible by7but arenota multiple of5,

between2000and3200(both included).

The numbers obtained should be printedina comma-separated sequence on a single line.

Hints:

Consider use range(#begin, #end) method

编写一个程序,寻找能被7整除,但不能被5整除的数字,数字的范围是(2000到3200,包含这两个数),找出的数要打印成一行的序列,并用逗号隔开。(其实列表、元组都属于这个序列范畴)。

今天,先讨论一个叫做 “copying(复制)”的机制,因为这个很重要。况且,前面已经有了关于对象问答的一篇文章,我们也多次谈及对象引用。是时候知晓 shadow copying 和 deep copying 了。

考虑再三,宁愿被人笑话,也要将英文原文大段复制上来,因为,这些英文资料的确比我讲的透彻。但为了公平起见,还是尽量多用中文解释。

Since Python uses object references(对象引用), when we use the assignment operator (=), no copying takes place. If the right-hand operand (还是翻译成被操作数更好理解)is a literal(我们不翻译这个词,读英文的话,直接跳过,这是引起国人混淆的词汇) such as a stringor a number, the left-hand operand is set to be an object reference that refers tothe in-memory object that holds the literal’s value. If the right-hand operandis an object reference, the left-hand operand is set to be an object reference thatrefers to the same object as the right-hand operand. One consequence of thisis that assignment is very efficient.

举例说明:当我们用 “=” 赋值的时候,其实是没有复制发生的。如果等号右边(比划比划帮助理解)是个数字或字符串,那么左边的变量名(更广的概念,就是上段的对象引用)它指向(绑定了)内存中的对象,在这个对象中包含这个数字或字符串值。(这也是为什么叫对象引用的意思,引用根据英语原意,在这里就是指向,变量名指向对象,变量名就属于对象引用)。

如果等号右边被操作数自身是个对象引用(比如变量名),那么左边被操作数(比如变量名)就是和右边被操作数(通常是变量名)一样,指向同样的一个对象。也就造成了,一个内存中的对象,有两个名字或更多的名字指向它(绑定它)。这样的机制安排,使赋值非常有效率。

(可能有点乱,但乱了敌人,乱不了我们自己 。首先,如果你还没有理解对象一词,请一定看上一篇,那篇是经典的。这里比变量名更通用的概念是对象引用,变量名属于对象引用,而对象引用在等号两边被(称为操作数)的概念所包含。被操作数,其实正常都翻译成操作数,但我担心初学者被这种主动的意思所误导,所以叫做被操作数,等你明白了,改叫操作数即可。如果懂英文,直接叫operand)

When we assign large collections(这里指大型的集合数据), such as long lists, the savings are veryapparent. Here is an example:

当我们赋值大型的集合数据,比如列表等,节省是明显的。(节省什么?为什么这么说?)

>>> songs = ["Because", "Boys", "Carol"]

>>> beatles = songs

用对象引用赋值给另一个名字,使之成为另一个对象引用。更具体的,用一个变量名赋值给另一个名字,使之成为另一个变量名。从此,两个变量名指向同一个对象。并没有复制发生。奥,还是澄清一下复制,它是指我们像复印纸张那样,一个实体成为两个实体。书中会文绉绉的说,将值副本,将值复制,将值副本复制,都是这种实体复制的意思。

>>> beatles, songs

(['Because', 'Boys', 'Carol'], ['Because', 'Boys', 'Carol'])

Here, a new object reference (beatles) has been created, and both objectreferences refer to the same list—no copying has taken place.Since lists are mutable, we can apply a change. For example:

>>> beatles[2] = "Cayenne"

>>>beatles, songs 这种格式就是分别打印各自的指向(绑定)对象。

(['Because', 'Boys', 'Cayenne'], ['Because', 'Boys', 'Cayenne'])

看到了吗?通过一个名字改变列表里的元素,用另一个名字打印,照样也改变了,因为两个名字指向一个列表。

We applied the change using the beatles variable—but this is an object referencereferring to the same list as songs refers to. So any change made througheither object reference is visible to the other. This is most often the behaviorwe want, since copying large collections is potentially expensive. It also means,for example, that we can pass a list or other mutable collection data type as anargument to a function,modify the collection in the function, and know that themodified collection will be accessible after the function call has completed.

这段的后半部分谈到,当一个列表或者其他可变集合数据类型的实参传递给函数后,修改修饰函数内集合数据,当调用函数结束,那些集合类型数据已经被修改了。

However, in some situations, we really do want a separate copy of the collection(or other mutable object). For sequences, when we take a slice:

for example,

songs[:2]

the slice is always an independent copy of the items copied. So tocopy an entire sequence we can do this:

>>> songs = ["Because", "Boys", "Carol"]

>>> beatles = songs[:]

真真正正对列表的复制,两个名字指向不同的列表了。请看下边,改变一个列表,另一个列表没有发生变化。奥,对了这个叫深复制,开始介绍的那个叫做浅复制。shallow copying / deep copying,编程里面新名词真多,没有办法,方便交流的。

>>> beatles[2] = "Cayenne"

>>>beatles, songs

(['Because', 'Boys', 'Cayenne'], ['Because', 'Boys', 'Carol'])

如果真的像纸张那样,我们的确需要一个真的复制,那么就这样操作,

字符串,元组,列表,他们基本的内容,差不多都涉及到了。还有一些,靠自己多练习吧。在今后的代码里我们会屡屡使用这些类型。所以,早晚会学会的。下面列出一些,这三者都统一使用的操作,然后,你需要列个表格,展示这三个类型的相同和不相同之处,帮助你理解和记忆。

下面是序列的常用操作,seq 是英文序列的缩写。

seq[i]

len(seq)

seq1 + seq2

n * seq

seq[start : end]

e in seq

e not in seq

fo e in seq

不用解释了吧,这样才逼着你,在编辑器里面进行测试。

明天讲解字典,如果篇幅不是特别长,就加点字符串的内置方法内容。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190125G0D5T800?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券