这两个代码片段之间有什么区别?使用type():
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
Run Code Online (Sandbox Code Playgroud)
使用isinstance():
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
Run Code Online (Sandbox Code Playgroud) 在python中,如何检查对象是否是生成器对象?
试试这个 -
>>> type(myobject, generator)
Run Code Online (Sandbox Code Playgroud)
给出错误 -
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'generator' is not defined
Run Code Online (Sandbox Code Playgroud)
(我知道我可以检查对象是否有一个next方法让它成为一个生成器,但我想用一些方法来确定任何对象的类型,而不仅仅是生成器.)
我有多个yield返回的生成器对象.准备调用这台发电机是相当费时的操作.这就是我想多次重用发生器的原因.
y = FunctionWithYield()
for x in y: print(x)
#here must be something to reset 'y'
for x in y: print(x)
Run Code Online (Sandbox Code Playgroud)
当然,我正在考虑将内容复制到简单的列表中.
老实说,我在这里有点困惑,为什么我不能在相同的数据上迭代两次?
def _view(self,dbName):
db = self.dictDatabases[dbName]
data = db[3]
for row in data:
print("doing this one time")
for row in data:
print("doing this two times")
Run Code Online (Sandbox Code Playgroud)
这将打印出"一次这样做"几次(因为数据有几行),但它根本不会打印出"这样做两次"......
我第一次迭代数据工作正常,但第二次当我运行最后一个列表"for data in data"时,这没有返回...所以执行它一次工作但不是两次......?
仅供参考 - 数据是一个csv.reader对象(如果是这样的原因)......
我知道可以将生成器转换为"低级别"(例如list(i for i in xrange(10)))的列表,但是可以在不先遍历列表的情况下进行反向(例如.(i for i in range(10)))吗?
编辑:删除这个词是cast为了清楚我正在努力实现的目标.
编辑2:实际上,我认为我可能在基础层面误解了发电机.这将教会我在早晨喝咖啡之前不要发布SO问题!
Python中的其他空对象评估为False - 我如何才能获得迭代器/生成器呢?