## 概述
for循环在python中是一个通用的**序列迭代器**:可以遍历任何**有序序列内**对象内的元素。
通用的序列迭代器,用于遍历任何有序序列对象内的元素,字符串,列表,元组,字典,其他内置可迭代对象。
for循环会使用**迭代协议**来遍历迭代对象中的每一项,使用对象的__next__()方法,捕捉到**StopIteration**停止循环。
>[info]`for循环的运算速度快于while`
### 一般格式
```python
for expression in iterable:
suite1
else:
suite2
```
expression一般是一个单独的变量,或是一个变量序列,一般以元组形式给出
如果循环正常退出,则会执行else语句
### 文件扫描
#### 将整个文件读取为字符串
```
fd = open('test.txt','r')
print(fd.read())
```
#### 逐个字符读取
使用read(1)一次读取一个字符,一次只在内存中加载一个字符
```
fd = open('test.txt','r')
while True:
char = fd.read(1)
if not char: break
print(char)
```
使用read()会一次性把文件加载至内存,浪费资源
```
for char in open('test.txt','r').read():
print(char)
```
#### 逐行读取文件
使用while进行逐行读取
```
fd = open('test.txt','r')
while True:
line = fd.readline()
if not line: break
print(line)
```
使用for进行逐行读取,此处readlines方法会将整个文件以行为元素组成列表,并且一次性加载至内存。
```
for char in open('test.txt','r').readlines():
print(char)
```
使用for进行逐行读取,此处使用文件迭代器,每次迭代的时候读取一行。
```
for char in open('test.txt','r'):
print(char)
```
**总结**
* 按字符读取使用while循环
* 按行读取使用for循环
### 循环的编写技巧
#### 循环计数器range
range常用在for循环中来产生索引,也可用在任何需要整数列表的地方。
#### 非完备遍历:range和分片
在遍历是跳过一些元素
`range(0,10,2)`
#### 修改列表:range
```
L = [1, 2, 3, 4]
for i in range(len(L)):
L[i] += 1
```
使用列表解析,会重新形成一个列表,不没有在原处进行修改
`[x+1 for x in L]`
#### 并行遍历:zip和map
```
L1 = [1, 2, 3, 4]
L2 = [5, 6, 7, 8]
list(zip(L1, L2))
```
`list(map(ord, 'spam'))`
#### 使用zip构建字典
```python
for (k, v) in zip(keys, values):
d[k] = v
```
#### 产生偏移和元素:enumerate
range可以产生字符串中元素的偏移值,
enumerate产生偏移和元素 offset,item
### 隐性迭代工具
1. 列表解析
2. map, reduce和filter函数
- 前言
- 环境搭建
- pypi
- 打包
- Python 2 和 Python 3 的版本之间差别
- 项目
- 第一部分
- 第1章 基础
- Python安装
- python代码文件类型
- python对象
- 核心数据类型
- 核心数据类型--整型和浮点型
- 核心数据类型--字符串
- str.format
- 核心数据类型--列表
- 核心数据类型--元组
- 核心数据类型--字典
- 核心数据类型--集合
- 核心数据类型--文件对象
- 调用bash
- 标准输入输出
- str-repr
- 字符编码
- 迭代器和生成器
- 第2章 语句和语法
- 赋值语句
- if语句
- while语句
- for语句
- assert
- 第3章 函数
- 函数作用域
- 工厂函数
- 内置函数
- 递归
- 嵌套作用域和lambda
- 参数传递
- 函数式编程
- property可写与可读
- 第5章 模块
- 模块导入
- 模块命名空间
- 相对导入和绝对导入
- 模块重载
- 在模块中隐藏数据
- 过渡性重载
- 第6章 类
- 面向对象还是面向过程?
- 构造函数 析构函数
- call
- 运算符重载
- str()
- 待定
- 即时生成属性
- 多态
- 线程和进程
- thread模块
- threading模块
- threading线程锁
- 糖果机
- multiprocessing
- 阻塞非阻塞同步异步
- 单线程和多线程对比
- 生产者消费者模型
- 第二部分
- 获取系统资源信息
- 获取进程所占的物理内存
- dmidecode获取系统信息
- 网络编程
- 网络基础
- python中的套接字
- socket模块
- 第三部分 高级功能
- 闭包入门
- 闭包的应用
- 装饰器入门
- 装饰器应用
- 第四部分 项目实战
- graphite
- 模块
- collections
- datetime
- Enum
- faker
- fabric
- fileinput
- fire
- fnmatch
- getpass
- glob
- hashlib
- heapq
- json模块
- log
- os
- Paramiko
- parser
- platform
- pyyaml
- Queue
- random
- re
- 特殊符号和字符
- re模块
- shelves
- subprocess
- time
- urllib_urllib2_requests
- urllib urllib2
- requests
- 标准模块ConfigParser
- 扩展模块Mysqldb
- 扩展模块dns
- 扩展模块request
- uuid
- cacheout 缓存库
- delorean 时间
- 附录
- 内置函数
- python实现各种排序算法
- 常见报错
- pymongo
- pyrocksdb
- 常用
- ERROR