练习38-操作列表

一 内置方法的工作原理

1 当你看到像 mystuff.append('hello') 这样的代码时,你事实上已经在 Python 内部激发了一个连锁反应。以下是它的工作原理:
  • Python 看到你用到了 mystuff ,于是就去找到这个变量。也许它需要倒着检查看你有没有在哪里用 = 创建过这个变量,或者检查它是不是一个函数参数,或者看它是不是一个全局变量。不管哪种方式,它得先找到 mystuff 这个变量才行。
  • 一旦它找到了 mystuff ,就轮到处理句点 . (period) 这个操作符,而且开始查看mystuff 内部的一些变量了。由于 mystuff 是一个列表,Python 知道 mystuff 支持一些函数。
  • 接下来轮到处理 append 。Python 会将 append 和 mystuff 支持的所有函数的名称一一对比,如果确实其中有一个叫 append 的函数,那么 Python 就会去使用这个函数。
  • 接下来 Python 看到了括号 ( ,并且意识到, “噢,原来这是一个函数”,到了这里,它就正常会调用这个函数了,不过这里的函数还要多一个参数才行。
  • 这个额外的参数其实是…… mystuff ! 你会觉得很奇怪对不对?不过这就是 Python的工作原理,记住它就行了。所以到最后真正发生的事情其实是append(mystuff, 'hello') ,不过你所看到的 mystuff.append('hello') 。

2 一个举例

以下是一个错误的类的定义方法:

1 >>> class Thing(object):
2 ...     def test(message):
3 ...         print(message)
4 ...
5 >>> a = Thing()
6 >>> a.test('hello')
7 Traceback (most recent call last):
8   File "<stdin>", line 1, in <module>
9 TypeError: test() takes 1 positional argument but 2 were given
这些是什么呢?这是我在 Python 命令行下展示给你的一点魔法。你还没有见过 class ,不过后面很快就要碰到了。现在你看到 Python 说 test()takes exactly 1 argument (2 given)  ( test() 只可以接受 1 个参数,实际上给了 2 个)。它意味着 python 把 a.test("hello") 改成了 test(a, "hello") ,而有人在某个地方弄错了,没有为 a 添加这个参数。
正确的定义方式是:
1 >>> class Thing(object):
2 ...     def test(self,message):
3 ...         print(message)
4 ...
5 >>> a = Thing()
6 >>> a.test('hello')
7 hello

其中,self变量就是重新定义的一个参数,用来传递a的值

二 列表的基本理解

其它列表的内容可参见:

https://www.cnblogs.com/luoxun/p/13220943.html

https://www.cnblogs.com/luoxun/p/13225413.html

1 数据结构:“数据结构”就是用一种正式的方式来组织一些数据(事实),就是这么简单。尽管一些数据结构会异常复杂,它们终归还是一种把事实(facts)存储在一个程序里的方式,你可以用不同的方式访问这些数据。数据结构使数据形成体系。列表是一种数据结构

2 列表:列表是程序员们使用最多的数据结构之一,它们把你想要存储的内容以一种简单、有序的列表方式存储起来,并且可以通过索引(索引(index)来随机)来随机(randomly)或线性(linearly)地获取到。

3 理解:

(1)让我们以一副卡牌为例来理解一下列表:

  • 1. 你有一副包含值(value)的卡牌。
  • 2. 这些卡牌被从上到下放成一摞。
  • 3. 你可以从上面取,从下面取,或者从中间随机抽取。
  • 4. 如果你想找到一张特定的卡牌,你就得把整副牌拿起来,一张一张翻找。

(2)让我们看看我刚才所说的定义:

  • “一个有序列表”,是的,一副卡牌是有序的,有第一张,有最后一张。
  • “有你想要存储的东西”, 是的,卡牌就是我想要存储的东西。
  • “可以随机获取” ,是的,我可以从这副卡牌里随机抽取一张。
  • “或者线性获取” ,是的,如果我想找特定的一张卡牌,我可以从头开始按顺序找。
  • “通过一个索引” ,基本上,你拿着一副牌,如果我让你取出第 19 张,你肯定得一张一张数到第19。在我们的 Python 列表里,程序可以直接跳到任何你指定的索引。

4 什么时候使用列表

当你有能够匹配列表数据结构有用特性的东西时,你就可以使用列表:
  • 1. 如果你需要保持次序。记住,是列出的顺序,而不是分类的顺序,列表不会为你做分类工作
  • 2. 如果你需要通过一个数字随机获取到内容。记住,是使用从 0 开始的基数。
  • 3. 如果你需要线性地遍历这些内容 (从头到尾)。记住,这就是 for 循环的作用。
那么,你就可以使用列表。

三 代码

ex38.py

 1 ten_things = "Apples Oranges Crows Telephone Light Sugar"
 2 print("Wait there are not 10 things in that lists. Let's fix it.",end = '')
 3 
 4 stuff = ten_things.split(' ')
 5 more_stuff = ["Day","Night","Song","Frisbee","Corn","Banana","Girl","Boy"]
 6 
 7 while len(stuff) != 10:
 8     next_one = more_stuff.pop()
 9     print("Adding:    ",next_one)
10     stuff.append(next_one)      # 将next_one添加到stuff列表中最后一位
11     print(f"There are {len(stuff)} items now.",end = '')
12 
13 print("There we go:",stuff)
14 print("Let's do some things with stuff.",end = '')
15 
16 print(stuff[1])                 # 读取列表的第二个元素,列表的正索引是从0开始的
17 print(stuff[-1],end = '    ')   # 读取列表的最后一个元素,-1是负数索引,表示列表的最后一个元素
18 print(stuff.pop())              # 删除列表内最后一个元素
19 print(' '.join(stuff))          # 用空格将stuff列表的元素按顺序拼接成字符串
20 print('#'.join(stuff[3:5]))     # 先通过索引的方式对列表进行切片,得到['Telephone','Light'],然后用'#'号将其拼接成字符串
 
为什么不能用 join(' ', stuff) ? 用这种方式使用 join 是行不通的。join 是一种可以调用的方法,它能够把字符串放在列表的元素之间,把它们连接起来。你需要这样用它:
' '.join(stuff) 。
 
执行结果:
 1 PS E:\6_AI-Study\1_Python\2_code_python\02_LearnPythonTheHardWay> python ex38.py
 2 Wait there are not 10 things in that lists. Let's fix it.Adding:     Boy
 3 There are 7 items now.Adding:     Girl
 4 There are 8 items now.Adding:     Banana
 5 There are 9 items now.Adding:     Corn
 6 There are 10 items now.There we go: ['Apples', 'Oranges', 'Crows', 'Telephone', 'Light', 'Sugar', 'Boy', 'Girl', 'Banana', 'Corn']
 7 Let's do some things with stuff.Oranges
 8 Corn    Corn
 9 Apples Oranges Crows Telephone Light Sugar Boy Girl Banana
10 Telephone#Light
posted @ 2020-07-24 12:01  洛兰123  阅读(171)  评论(0编辑  收藏  举报