11-Python3从入门到实战—基础之生成器和迭代器
Python从入门到实战系列——目录
切片
Python提供切片(Slice)操作符用来获取列表、元组等数据中的部分元素;如,读取列表
list[m:n]:表示获取m-n区间的元素
list[m:n:o]:表示以条件o获取m-n之间的元素
num = list(range(100)) # 创建0-99的列表num
- 获取num中前三个元素
>>> num[0:3]
['0', '1', '2']
>>> num[:3] # 索引从0开始时,0可以省略
['0', '1', '2']
- 获取num中后三个元素
>>> num[-3:]
['97', '98', '99']]
- 每隔10个数获取所有元素
>>> num[::5]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
- 复制一个列表
>>> num[:]
[0, 1, 2, 3, 4, 5, 6...98,97]
迭代
Python 中通过for循环来遍历list或tuple,这种遍历称为迭代(Iteration);
- 迭代的使用
>>> user={'0':'张三','1':'李四','2':'王五','3':'赵六',}
>>> for key in user:
... print(key)
>>> print('---------分割线-----------')
>>> for value in user.values():
... print(value)
输出结果:
0
1
2
3
---------分割线-----------
张三
李四
王五
赵六
- 判断对象是否可迭代
>>> user={'0':'张三','1':'李四','2':'王五','3':'赵六',}
>>> print(isinstance(1,Iterable))
>>> print(isinstance(user,Iterable))
输出结果:
False
True
- 遍历输出对象的下标和值
>>> user={'0':'张三','1':'李四','2':'王五','3':'赵六',}
>>> for key,value in enumerate(user.values()):
... print(key,value)
输出结果:
0 张三
1 李四
2 王五
3 赵六
迭代器
迭代器是一个可以记住遍历的位置的对象;迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束;迭代器只能往前不会后退;
迭代器有两个基本的方法:创建迭代器对象的 iter() 和 输出迭代器对象的下一元素的 next();
- 基本使用
>>> nums = [1,2,3,4]
>>> num = iter(nums)
>>> print(next(num))
>>> print(next(num))
>>> print(next(num))
输出
1
2
3
- 迭代器结合 for 循环使用
>>> nums = [1,2,3,4]
>>> num = iter(nums)
>>> for n in num:
... print(n)
输出结果:
1
2
3
4
- 迭代器结合 while 循环使用
>>> while True:
... try:
... print(next(num))
... except StopIteration:
... print("迭代完毕")
... sys.exit()
输出:
1
2
3
4
迭代完毕
列表生成式
- 生成列表的方法
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- 原始生成[11,22,...,10*10]方法
>>> for x in range(1,11):
... l.append(x*x)
...
>>> l
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>
- 使用Python内置强大的生成[11,22,...,10*10]列表的方法
>>> [x * x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>
- 生成[11,22,...,10*10]元素为偶数的列表
>>> [x * x for x in range(1,11) if x % 2 ==0]
[4, 16, 36, 64, 100]
- 双重循环生成列表
>>> [x + y for x in 'ABC' for y in 'abc']
['Aa', 'Ab', 'Ac', 'Ba', 'Bb', 'Bc', 'Ca', 'Cb', 'Cc']
- 使用两个变量生成列表
>>> str = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [key + '=' + value for key, value in str.items()]
['x=A', 'y=B', 'z=C']
生成器
通过列表生成式可以生成一个列表,但是列表受内存限制,容量是有限的,并且,如果创建一个包含几百万元素的列表,而只需要使用其中元素时便造成了空间浪费;
这时候就应该使用生成器(generator);生成器表达式能做的事情列表解析基本都能处理,只不过在需要处理的序列比较大时,列表解析比较费内存。
- 创建一个生成器
>>> gen = (x * x for x in range(10))
>>> gen
<generator object <genexpr> at 0x0000000002742E08>
>>>
- 读取生成器中的元素
>>> for x in gen:
... print(x)
...
0
1
4
9
16
25
36
49
64
81
>>>
生成器函数
生成器函数:在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器函数;
- 使用函数实现斐波拉契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
print(b)
a, b = b, a + b
n = n + 1
return 'done'
>>> fib(6)
1
1
2
3
5
8
'done'
- 使用生成器函数实现斐波拉契数列
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
return 'done'
>>> for n in fib(6):
... print(n)
...
1
1
2
3
5
8
- generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
11-Python3从入门到实战—基础之生成器和迭代器的更多相关文章
- 5-Python3从入门到实战—基础之数据类型(列表-List)
Python从入门到实战系列--目录 列表定义 list:列表(list)是Python内置的一种数据类型,list是一种有序的集合,索引从0开始,可以进行截取.组合等: //创建列表 list1 = ...
- 3-Python3从入门到实战—基础之数据类型(数字-Number)
Python从入门到实战系列--目录 Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Sets(集合) Dictionar ...
- 10-Python3从入门到实战—基础之函数
Python从入门到实战系列--目录 函数的定义 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数的语法 def 函数名(参数列表): 函数体 函数代码块以 def 关键词开头 ...
- 9-Python3从入门到实战—基础之条件控制语句
Python从入门到实战系列--目录 条件判断 if 条件判断 if 语句语法 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> ...
- 8-Python3从入门到实战—基础之数据类型(集合-Sets)
Python从入门到实战系列--目录 集合的定义 集合(set)和字典类似,也是一组key的集合,但不存储value:由于key不能重复,所以,在set中,没有重复的key. 创建一个set,需要提供 ...
- 7-Python3从入门到实战—基础之数据类型(字典-Dictionary)
Python从入门到实战系列--目录 字典的定义 字典是另一种可变容器模型,且可存储任意类型对象:使用键-值(key-value)存储,具有极快的查找速度: 字典的每个键值(key=>value ...
- 6-Python3从入门到实战—基础之数据类型(元组-Tuple)
Python从入门到实战系列--目录 元组的定义 定义元组只需要在括号中添加元素,并使用逗号隔开即可 tup = ('Python','Java','C++','Kotlin') 元组与列表的区别 P ...
- 4-Python3从入门到实战—基础之数据类型(字符串-String)
Python从入门到实战系列--目录 字符串表示 在 Python 3版本中,字符串是以 Unicode 编码的:Python 中使用 ' '或者" "表示字符串 msg = 'H ...
- 2-Python3从入门到实战—基础之运算符
Python从入门到实战系列--目录 Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 运算符优先级 算术运算符 Pyt ...
随机推荐
- [android]android Task 任务 简介
http://blog.csdn.net/guomeijuan916/article/details/8121468 关于Android中的组件和应用,之前涉及,大都是静态的概念.而当一个应用运行起来 ...
- Codeforces Round #245 (Div. 2)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/yew1eb/article/details/25609981 A Points and Segmen ...
- 浅谈js之闭包
1.什么是闭包??? "官方"的解释是指一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分: 红皮书是这样说的,闭包是指有权访问另一 ...
- c# 根据当前时间获取,本周,本月,本季度,月初,月末,各个时间段
DateTime dt = DateTime.Now; //当前时间 DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") //24小时制 ...
- leetcode 131. Palindrome Partitioning 、132. Palindrome Partitioning II
131. Palindrome Partitioning substr使用的是坐标值,不使用.begin()..end()这种迭代器 使用dfs,类似于subsets的题,每次判断要不要加入这个数 s ...
- 剑指offer从上往下打印二叉树 、leetcode102. Binary Tree Level Order Traversal(即剑指把二叉树打印成多行、层序打印)、107. Binary Tree Level Order Traversal II 、103. Binary Tree Zigzag Level Order Traversal(剑指之字型打印)
从上往下打印二叉树这个是不分行的,用一个队列就可以实现 class Solution { public: vector<int> PrintFromTopToBottom(TreeNode ...
- Ubuntu下修改CMake版本
https://blog.csdn.net/mdjxy63/article/details/82686504
- java 面向对象基本概念
1.面向对象与面向过程 (1).都是解决问题的思维方式,都是代码组织的方式. (2).解决简单问题可以使用面向过程 (3).解决复杂问题:宏观上使用面向对象把握,微观处理上仍然是面向过程. 2.面向对 ...
- sql语句 update
UPDATE ban_group AS A SET NAME ='锅炉三班' FROM hr_employee AS b WHERE b.job_no = '1394' AND A ...
- ASP.NET Core MVC中URL和数据模型的匹配
Http GET方法 首先我们来看看GET方法的Http请求,URL参数和ASP.NET Core MVC中Controller的Action方法参数匹配情况. 我定义一个UserController ...