`generator`
定义
----
定义:可以理解为一种数据类型,存储算法而非实际数据。边循环边计算。
特点:边循环边计算,不生成完整的list,节省大量空间
创建生成器
------------
1.生成器表达式
~~~
g = (x for x in range(9)) # <generator object <genexpr> at 0x0000000001E299E8>
next(g) # 0
next(g) # 1
~~~
2.生成器函数(使用`yield`关键字)
python解释器会将带有`yield`关键字的函数视为生成器,函数返回一个iterable对象。
函数执行到`yield`处,将值添加到iterable对象,然后从`yield`位置处继续执行。
~~~
# 自然数生成器:
def natural():
num = 0
while True:
num += 1
yield num
natural # <function natural at 0x00000000031A1D90>
n = natural() # <generator object natural at 0x00000000031FE360>
print(next(n)) # 1
print(next(n)) # 2
~~~
检测
-----
`functools.Generator`
~~~
from collections import Generator
g = (x for x in [])
isinstance(g, Generator) # True
~~~
生成器是迭代器
----------------
生成器是迭代器,故:
1. **惰性**:只能遍历一次
2. 会产生StopIteration错误
- next()到头,没有更多元素时,下次next()会返回StopIteration错误
- 无法直接取得生成器函数返回值,返回值包含在StopIteration错误中,可以捕获错误取得返回值
~~~
# generator只能遍历一次
g = (x*x for x in range(2))
for x in g:
print(x) # 0 1
for x in g:
print(x) # 无输出
~~~
~~~
# 获取生成器函数返回值
def gene():
n = 0
while True:
n += 1
if n < 3:
yield n
else:
return 'hello'
n = gene()
try:
next(n)
next(n)
next(n)
next(n)
except StopIteration as e:
print(e) # hello
~~~
练习
-----
创建自然数的平方的数列
~~~
def nsquare():
n = 1
while True:
yield n*n
n = n + 1
~~~
创建斐波那契数列
~~~
def fib():
a, b = 0, 1
while True:
yield b
a, b = b, a + b
~~~
创建杨辉三角
~~~
def yhtriangle(n):
l, index = [1], 0
while index < n:
yield l
l = [1]+[ l[x]+l[x+1] for x in range(len(l)-1) ]+[1]
index += 1
~~~
- 前言
- Python编程规范
- 编码
- 代码
- 缩进、行宽、引号、空行
- 空格
- 换行
- import
- 注释
- 代码注释
- 文档注释(Docstring)
- 命名规范
- 数据结构
- 变量
- 变量作用域
- 命名空间
- 作用域
- python作用域
- 对象
- 序列
- 可迭代对象
- 迭代器
- 生成器
- 可迭代对象 & 迭代器 & 生成器
- 整数池 & 字符串intern
- 数据类型
- 数字
- int
- float
- NaN
- 四舍五入 & 取整
- 列表
- 元组
- 字典
- 集合
- 字符串
- 字符集&字符编码
- 字符串&字节串
- 字符串函数
- 字符串格式化
- str.format
- Formatted string literals
- format函数
- string.Formatter类
- %
- Format String Syntax
- Format Specification Mini-Language
- fill
- align
- sign
- #
- 0
- width
- grouping_option
- .precision
- type
- locale
- Python3 locale 模块
- 语句
- 运算符
- if/else
- for...in
- while
- break/continue
- 函数
- 函数
- 函数参数
- 递归函数
- 匿名函数
- 高阶函数
- map
- reduce
- filter
- sorted
- 返回函数
- 闭包
- 装饰器
- 函数装饰器
- 带参数的装饰器
- 类装饰器
- 带参数的类装饰器
- 偏函数
- 面向对象
- 类 & 实例
- 属性
- 方法
- 访问限制
- 继承
- 新式类 & 经典类
- MRO
- MixIn
- 模块
- 特殊变量
- 编写模块
- 引入 & 重载
- 搜索模块
- 第三方模块
- 常见模块
- 标准库
- os
- sys
- datetime
- re
- urllib
- time/datetime
- threading
- multiprocessing
- builtins
- help
- range
- enumerate
- 异同
- str() repr() ascii()
- exit()、sys.exit()、os._exit()
- 数据库
- mysql
- 错误、调试、测试
- 异常
- 异常处理
- 自定义异常
- 抛出异常
- 调试
- logging
- pdb
- 线程&&进程
- 线程
- 杂
- python 脚本传参
- python无关
- redis
- mongo
- linux
- mysql简略