鱼C论坛

 找回密码
 立即注册
查看: 2743|回复: 19

[已解决]列表extend()函数

[复制链接]
发表于 2017-2-8 15:52:28 | 显示全部楼层 |阅读模式
0鱼币
听完小甲鱼老师的视频课后,知道extend函数可以同时插入多个数据,但是插入多个的时候要以 列表 作为参数形式输入

然后无意中发现,当用单引号引入数据的时候出现了以下情况:
>>> a.extend('dasgaer')
>>> a
[1, 2, 3, 4, '5', 5, 'd', 'a', 's', 'g', 'a', 'e', 'r']

想问下这是为啥?

因为一直以来都觉得 引号 就是表示这个数据是一个字符串类型,为什么这里一个字符串类型的数据会单独分开插入到列表末尾?
最佳答案
2017-2-8 15:52:29
我不知道你到底哪里不理解了
extend()需要可迭代对象(iterable)作为参数,而字符串str类型本身就是一个可迭代对象
因此,extend()可以等价于一个迭代循环
  1. In [1]: a = []

  2. In [2]: strExp = 'testString'

  3. In [3]: a.extend(strExp)

  4. In [4]: a
  5. Out[4]: ['t', 'e', 's', 't', 'S', 't', 'r', 'i', 'n', 'g']

  6. In [5]: b = []

  7. In [6]: for each in strExp:
  8.    ...:     b.append(each)
  9.    ...:     

  10. In [7]: b
  11. Out[7]: ['t', 'e', 's', 't', 'S', 't', 'r', 'i', 'n', 'g']
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 15:52:29 | 显示全部楼层    本楼为最佳答案   
我不知道你到底哪里不理解了
extend()需要可迭代对象(iterable)作为参数,而字符串str类型本身就是一个可迭代对象
因此,extend()可以等价于一个迭代循环
  1. In [1]: a = []

  2. In [2]: strExp = 'testString'

  3. In [3]: a.extend(strExp)

  4. In [4]: a
  5. Out[4]: ['t', 'e', 's', 't', 'S', 't', 'r', 'i', 'n', 'g']

  6. In [5]: b = []

  7. In [6]: for each in strExp:
  8.    ...:     b.append(each)
  9.    ...:     

  10. In [7]: b
  11. Out[7]: ['t', 'e', 's', 't', 'S', 't', 'r', 'i', 'n', 'g']
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 16:14:59 | 显示全部楼层
  1. >>> list('i am NOT a str')
  2. ['i', ' ', 'a', 'm', ' ', 'N', 'O', 'T', ' ', 'a', ' ', 's', 't', 'r']
复制代码


不懂欢迎追问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 16:17:04 | 显示全部楼层
正常的啊?
sp170208_161617.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-8 17:04:31 | 显示全部楼层

恩,就是比较奇怪为什么会这样,因为觉得引号部分应该是一个数据才对啊,为什么会作为很多个单独的数据插入列表末尾
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 20:26:27 | 显示全部楼层
实际上容器型的变量如元组,集合,字典等都可以作为extend的参数被导入列表。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 22:54:41 | 显示全部楼层
本帖最后由 lubcat 于 2017-2-8 22:56 编辑

有同样疑问……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-8 23:04:42 | 显示全部楼层
查了查help
得到如下结果
extend(...)
    L.extend(iterable) -> None -- extend list by appending elements from the iterable
iterable,意为可迭代,查的相关解释
“如果能成功调用 iter(这个对象) 并返回一个迭代器, 那么 '这个对象' 就是Iterable.”
这个解释,我不是很理解,希望能有大牛给个通俗的说明。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-9 08:20:12 | 显示全部楼层
字符串跟列表一样,都是可迭代的对象来着
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-9 08:32:30 | 显示全部楼层
DarkmasterSugar 发表于 2017-2-8 17:25
我不知道你到底哪里不理解了
extend()需要可迭代对象(iterable)作为参数,而字符串str类型本身就是一个可 ...

就是这里!感谢大神!
大神,还想问下对于 迭代 有什么通俗一点的解释吗?刚去百度了一下,有点迷糊,它跟遍历元素有什么区别吗?...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-9 08:40:26 | 显示全部楼层

已经懂啦,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-9 10:52:21 | 显示全部楼层
以前也不懂,原来是这样啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-9 11:28:33 | 显示全部楼层
冬雪雪冬 发表于 2017-2-8 20:26
实际上容器型的变量如元组,集合,字典等都可以作为extend的参数被导入列表。

嗷,这样!谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-9 12:02:35 | 显示全部楼层
本帖最后由 DarkmasterSugar 于 2017-2-9 12:14 编辑
糯米糯 发表于 2017-2-9 08:32
就是这里!感谢大神!
大神,还想问下对于 迭代 有什么通俗一点的解释吗?刚去百度了一下,有点迷糊,它 ...


迭代最开始是个数学上的概念,在数值计算方法中,我们用迭代不停地重复某种计算,以此来逼近我们想要的结果或者精确度
比如说大家都知道的斐波那契数列(Fibonacci Sequence):1,1,2,3,5,8,13,……
第n项是n-1项和n-2项的和,即
An=An-1 + An-2
这就是一种迭代,我们只要知道第1、2个数就可以求得任意项的值

  1. In [1]: def fib(n):
  2.    ...:     fibList=[1]*n
  3.    ...:     for index in range(n):
  4.    ...:         if index >= 2:
  5.    ...:             fibList[index]=fibList[index-1]+fibList[index-2]
  6.    ...:     return fibList
  7.    ...:

  8. In [2]: a = fib(10)

  9. In [3]: a
  10. Out[3]: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
复制代码


在程序设计的概念中,简单来说,迭代就是循环,重复执行某段代码。 比如上面求前n个Fibonacci数,我们的for…in…循环体就是迭代
即便循环体可能只是单纯的print输出,同样也是一种迭代
  1. In [4]: for i in range(10):
  2.    ...:     print("hello")
  3.    ...:     
  4. hello
  5. hello
  6. hello
  7. hello
  8. hello
  9. hello
  10. hello
  11. hello
  12. hello
  13. hello
复制代码


当一个函数在迭代过程中不停地调用自身,就成为迭代的一种特殊形式,我们称为递归(recursion),我们也可以把fib()函数写成递归的形式
  1. In [5]: def fibRecursive(n):
  2.    ...:     if 0 < n <= 2:
  3.    ...:         return 1
  4.    ...:     elif n>2:
  5.    ...:         return fibRecursive(n-1)+fibRecursive(n-2)
  6.    ...:     else:
  7.    ...:         print("Error: n should be a positive integer!")
  8.    ...:         

  9. In [6]: fibRecursive(9)
  10. Out[6]: 34
复制代码


====================================
至于遍历(traversal),这是一个算法概念,遍历就是我不重复地依次查看或操作某个集合或数据结构中的全部元素
遍历的方式有多种多样,采用迭代循环当然是最常用的一种
  1. In [7]: for n,each in enumerate(a):
  2.     ...:     print("第%d项:%d" %(n+1,each))
  3.     ...:     
  4. 第1项:1
  5. 第2项:1
  6. 第3项:2
  7. 第4项:3
  8. 第5项:5
  9. 第6项:8
  10. 第7项:13
  11. 第8项:21
  12. 第9项:34
  13. 第10项:55
复制代码

比如上面我已经把前10项Fibonacci数都打印了出来,这是最基本的正向顺序遍历

我甚至可以倒过来遍历、固定步长遍历、乱序遍历……,这只是针对简单的线性顺序表(Sequential List)结构,对于诸如树(Tree),图(Graph)等更复杂的数据结构,还有特定的遍历方式,扯开去都能讲一学期的课了。感兴趣的话可以学习《数据结构与算法分析》

以上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-9 13:00:41 | 显示全部楼层

那个 问下 怎么发代码啊(捂脸)是添加附件嘛。。我添加附件说无法添加.py类型的 文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-9 14:08:29 | 显示全部楼层
DarkmasterSugar 发表于 2017-2-9 12:02
迭代最开始是个数学上的概念,在数值计算方法中,我们用迭代不停地重复某种计算,以此来逼近我们想要的 ...

懂了!谢谢大神的详细讲解~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-9 15:02:26 | 显示全部楼层
shanling123 发表于 2017-2-9 13:00
那个 问下 怎么发代码啊(捂脸)是添加附件嘛。。我添加附件说无法添加.py类型的 文件
http://bbs.fishc.com/forum.php?mod=viewthread&tid=1742&page=1#pid11009
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-10 11:56:27 | 显示全部楼层

哇哦,学习了!谢谢!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-10 16:59:56 | 显示全部楼层
因为字符串跟列表一样都是可迭代对象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-10 18:24:15 | 显示全部楼层
五行缺五行 发表于 2017-2-10 16:59
因为字符串跟列表一样都是可迭代对象

恩恩,懂啦!谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 17:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表