我正在阅读关于生成器和迭代器以及它的作用__next__().
'__next__' in dir(mygen).是真的
'__next__' in dir(mylist),是假的
当我深入研究它时,
'__next__' in dir (mylist.__iter__()) 是真的
为什么__next__只适用于列表中,但只有__iter__()和mygen,但不会mylist.当我们使用list-comprehension踩到列表时,如何__iter__()调用__next__
我打电话试图手动步进(+1)发电机mygen.__next__().它不存在.它只存在于mygen.__next__被称为method-wrapper的地方.
什么是方法包装器,它做什么?它是如何应用的:inmygen() and __iter__() ?
如果__next__是生成器和迭代器提供的(以及它们的唯一属性)那么生成器和迭代器之间有什么区别?*
答案3:解决,如mod /编辑所述:
更新:生成器和迭代器都有__next__().我的错.看着日志,某种程度上mygen.__next__()测试给了我停止异常错误.但我无法再次复制该错误.
谢谢大家回答!
它们产生相同的结果。
>>> for i in range(10, -1, -1):
... print(i)
...
10
9
8
7
6
5
4
3
2
1
0
Run Code Online (Sandbox Code Playgroud)
对比:
>>> for i in reversed(range(0, 10 + 1):
... print(i)
...
10
9
8
7
6
5
4
3
2
1
0
Run Code Online (Sandbox Code Playgroud)
据我了解,Python3range创建一个生成器,而不是将整个范围存储在内存中。reversed我认为,同样一次会产生一个值。有什么理由使用其中一种而不是另一种吗?
主要区别是什么?各自应该使用什么以及在哪里使用?
例如,在这个示例中,使用 - 以及迭代器和生成器似乎对我来说是合适的......但这是真的吗?
迭代器
from typing import Generator, Iterator
def fib(n: int) -> Iterator[int]:
a :int = 0
b :int = 1
while a < n:
yield a
a, b = b, a+b
print([x for x in fib(3)])
Run Code Online (Sandbox Code Playgroud)
发电机
from typing import Generator
def fib(n: int) -> Generator[int, None, None]:
a :int = 0
b :int = 1
while a < n:
yield a
a, b = b, a+b
print([x for x in fib(3)])
Run Code Online (Sandbox Code Playgroud) 说我有一个看起来像的字符串
'one, two, three,'
Run Code Online (Sandbox Code Playgroud)
什么是pythonic方式迭代替换','与'.' 一次一个?理想情况下,函数的返回值如下所示:
['one. two, three,' , 'one, two. three,' , 'one, two, three.']
Run Code Online (Sandbox Code Playgroud)
选择答案的推理,感谢您的贡献!
import timeit
def one(s):
b = ["%s.%s" % (s[:i], s[i+1:]) for i, c in enumerate(s) if c == ","]
def two(s):
b = [s[:i] + "." + s[i+1:] for i in range(len(s)) if s[i] == ","]
def thr(s):
b = [s[:i] + "." + s[i+1:] for i, c in enumerate(s) if s[i] == ","]
def fou(s):
ss = s.split(',') …Run Code Online (Sandbox Code Playgroud) l=['Python', 3, 2, 4, 5, 'version']
l=filter(lambda x:type(x)==int,l)
print(list(l))
print(max(l))
Run Code Online (Sandbox Code Playgroud)
收到此错误,但我不知道为什么.. ValueError: max() arg 是一个空序列
如果我不打印 list(l) 它将起作用..
l=['Python', 3, 2, 4, 5, 'version']
l=filter(lambda x:type(x)==int,l)
print(max(l))
Run Code Online (Sandbox Code Playgroud)
输出:5
打印过滤器对象的列表后它不起作用,我不知道你为什么能帮我?任何修复?
我是新手Python。我能够理解Iterables和Iterators。但是我已经看到有很多东西可以Generators比作Iterators。
据了解,Iterable是一个实际上在其中存储了元素的对象(例如,一个列表)。他们遵循迭代协议,在其中实现了__iter__()方法,该方法返回Iterator有助于迭代的对象Iterable。
据我了解,这Generators有助于动态生成数据,而不是在内存中创建大数据结构并返回它。我们也可以通过使用来达到类似的目标Iterators。
现在我很怀疑,如果我们已经有了Iterators的需求Generators,因为两者都有助于实现即时生成数据的相似目标。这仅仅是为了简化语法,还是存在其他原因Generators?
Python 3的推出了在调用时要返回的发电机状物体range()和zip().返回的对象就像一个生成器,可以迭代一次,但不能很好地"打印",就像enumerate()返回参数一样.
然而,我很困惑地看到它们是不同的对象类型并且不属于types.GeneratorType,或者至少这是types模块显示的内容.如果期望发电机运行的功能将无法检测到它们.他们的遗产是什么?它们是否属于主要的"发电机"结构,因此它们可以与其他发电机一起识别?
import types
a = [1,2,3]
b = [4,5,6]
# create some generator-type objects
obj_zip = zip(a,b)
obj_enu = enumerate(a)
obj_r = range(10)
print(type(obj_zip))
print(type(obj_enu))
print(type(obj_r))
# checking against types.GeneratorType returns False
print(isinstance(obj_zip,types.GeneratorType))
print(isinstance(obj_enu,types.GeneratorType))
print(isinstance(obj_r,types.GeneratorType))
# checking against their own distinct object types returns True
print(isinstance(obj_zip,zip))
Run Code Online (Sandbox Code Playgroud) 假设我有以下内容:
image_data_generator = ImageDataGenerator(rescale=1./255)
train_generator = image_data_generator.flow_from_directory(
'my_directory',
target_size=(28, 28),
batch_size=32,
class_mode='categorical'
)
Run Code Online (Sandbox Code Playgroud)
然后 mytrain_generator填充来自 的数据my_directory,其中包含两个子文件夹,将数据分为类0和1.
假设我还有另一个目录that_directory,也将数据拆分为类0和1. 我想train_generator用这个额外的数据来增强我的。
运行train_generator = image_data_generator.flow_from_directory('that_directory', ...)会从 中删除先前的数据my_directory。
有没有办法在DirectoryIterator不改变文件夹结构本身的情况下将两组数据增加或附加到一个生成器或一个像 a 一样操作的对象中?
可能重复:
Python生成器与迭代器之间的差异
生成器在Python中看起来很重要,偶尔会向它们添加新功能,依此类推.
据我所知,相反,生成器可以始终使用带有迭代器接口的对象.(通常)更简洁是发电机的唯一好处还是我错过了什么?
我想学习zip类的功能.我写了这个非常简单的例子.
>>> names = ['name1','name2','name3']
>>> ages = ['age1','age2','age3']
>>> print(zip(names, ages))
<zip object at 0x03DB18F0>
>>> zipped = zip(names, ages)
for i in zipped:
type(i)
print(i)
Run Code Online (Sandbox Code Playgroud)
和输出(如预期的那样) -
<class 'tuple'>
('name1', 'age1')
<class 'tuple'>
('name2', 'age2')
<class 'tuple'>
('name3', 'age3')
Run Code Online (Sandbox Code Playgroud)
但是,如果我这样写,请立即在此行后:
for i in zipped:
print(i)
Run Code Online (Sandbox Code Playgroud)
它编译但没有打印任何东西!
要重新检查,我再次这样做了 -
>>> zipped = zip(names, ages)
>>> for i in zipped:
print(i)
('name1', 'age1')
('name2', 'age2')
('name3', 'age3')
Run Code Online (Sandbox Code Playgroud)
这次打印正确.但是在做解压缩时 -
>>> names2, ages2 = zip(*zipped)
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud) python ×9
generator ×5
python-3.x ×5
iterator ×3
types ×2
keras ×1
mypy ×1
python-2.7 ×1
wrapper ×1