erg/doc/zh_CN/syntax/35_generator.md
Cai BingJun 8281c3194f trifle
2023-01-07 19:54:57 +08:00

37 lines
1.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 生成器
[![badge](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fgezf7g7pd5.execute-api.ap-northeast-1.amazonaws.com%2Fdefault%2Fsource_up_to_date%3Fowner%3Derg-lang%26repos%3Derg%26ref%3Dmain%26path%3Ddoc/EN/syntax/35_generator.md%26commit_hash%3De959b3e54bfa8cee4929743b0193a129e7525c61)](https://gezf7g7pd5.execute-api.ap-northeast-1.amazonaws.com/default/source_up_to_date?owner=erg-lang&repos=erg&ref=main&path=doc/EN/syntax/35_generator.md&commit_hash=e959b3e54bfa8cee4929743b0193a129e7525c61)
生成器是在块中使用 `yield!` 过程的特殊过程
```python
g!() =
yield! 1
yield! 2
yield! 3
```
`yield!` 是在调用`self!.yield!` 的子程序块中定义的过程。和`return`一样它把传递给它的值作为返回值返回但它具有保存block当前执行状态再次调用时从头开始执行的特性
生成器既是过程又是迭代器; Python 生成器是一个创建迭代器的函数,而 Erg 直接迭代。过程本身通常不是可变对象(没有``),但生成器是可变对象,因为它自己的内容可以随着每次执行而改变
```python
# Generator!
g!: Generator!((), Int)
assert g!() == 1
assert g!() == 2
assert g!() == 3
```
Python 风格的生成器可以定义如下
```python
make_g() = () =>
yield! 1
yield! 2
yield! 3
make_g: () => Generator!
```
<p align='center'>
<a href='./34_package_system.md'>上一页</a> | Next
</p>