我需要检查某个变量是否是生成器对象.我如何指定文字生成器类型来代替??? 下面?
def go():
for i in range(999):
yield i
la = go()
print repr(type(la))
<type 'generator'>
assert type(la) == ???
Run Code Online (Sandbox Code Playgroud) 假设我想在数据库中添加字符串列表或只添加一个字符串:
names = ['Alice', 'Bob', 'Zoe']
Run Code Online (Sandbox Code Playgroud)
我希望这add_to_db会接受这两种情况
add_to_db(names)
add_to_db('John')
Run Code Online (Sandbox Code Playgroud)
这是正确的方法:
def add_to_db(name_or_names):
if (...):
... # add a single name
else:
for name in name_or_names:
... # add a single name
commit_to_db()
Run Code Online (Sandbox Code Playgroud)
我应该在第一个中加入什么...,作为一个字符串列表或只是一个字符串的条件(不要忘记该字符串也是可迭代的)?
考虑这个例子?
p = [1,2,3,4], (1,2,3), set([1,2,3])]
Run Code Online (Sandbox Code Playgroud)
而不是检查每种类型
for x in p:
if isinstance(x, list):
xxxxx
elif isinstance(x, tuple):
xxxxxx
elif isinstance(x, set):
xxxxxxx
Run Code Online (Sandbox Code Playgroud)
以下是否有一些等价物:
for element in something:
if isinstance(x, iterable):
do something
Run Code Online (Sandbox Code Playgroud) 说我有以下对象.
d = ["foo1", "foo2", "foo3", "foo4"]
c = 1
a = ["foo1", 6]
Run Code Online (Sandbox Code Playgroud)
我想检查对象是否是某种类型的列表.如果我想检查d是否是列表而该列表包含字符串,我该怎么做?
d应该通过,但c和a应该通过检查.
什么是最简单(也是最优雅)的方法,以确定in运算符是否可以在python中使用?如果我打开一个python shell并输入:
"" in 2
Run Code Online (Sandbox Code Playgroud)
它打印:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argument of type 'int' is not iterable
Run Code Online (Sandbox Code Playgroud)
根据python-docs,一个iterable是:
容器.iter()
返回一个迭代器对象.该对象需要支持下面描述的迭代器协议.如果容器支持不同类型的迭代,则可以提供其他方法来专门请求这些迭代类型的迭代器.(支持多种迭代形式的对象的示例是支持广度优先和深度优先遍历的树结构.)此方法对应于Python/C API中Python对象的类型结构的tp_iter槽.
所以
hasattr([], "__iter__") and hasattr({}, "__iter__")
Run Code Online (Sandbox Code Playgroud)
true按预期返回,但是
hasattr("test_string", "__iter__")
Run Code Online (Sandbox Code Playgroud)
返回false.但我可以使用
"test" in "test_string"
Run Code Online (Sandbox Code Playgroud)
没有任何问题.
优雅我指的是不使用try-except解决方案
这段代码只打印1 2 4 5 ..我的问题是为什么p在第3次迭代时没有用新数组更新
p = [1, 2, [1, 2, 3], 4, 5]
for each in p:
if type(each) == int:
print each
else:
p = each
Run Code Online (Sandbox Code Playgroud)
实际上,在调试代码时要确切地说,我看到它实际上更新了p的值但是each变量不会再次重新初始化.
我有一个fib下面给出的课程.它实现__iter__和__next__.它是一个可迭代的,也是它自己的迭代器.
class fib(object):
def __init__(self):
self.prev = 0
self.curr = 1
def __iter__(self):
return self
def __next__(self):
value = self.curr
self.curr += self.prev
self.prev = value
return value
from collections import Iterable
print(isinstance(fib, Iterable))
Run Code Online (Sandbox Code Playgroud)
print语句返回False,我希望它返回True
如果参数是一个序列(列表,元组)或跳过循环但只执行一次操作,那么避免代码重复循环的方法是什么?
def foo(arg1,sequence=None):
# If possible, loop, else do it once
if isinstance(sequence,(list,tuple)):
for value in sequence:
do_something(arg1)
else:
do_something(arg1)
Run Code Online (Sandbox Code Playgroud)
我在for循环中所做的操作比这更长,我想知道你通常使用什么方法来避免这种情况,如果你避免它的话.我经常遇到这个问题而且我没有提出要解决它的问题.
编辑:问题不是在Python中的重复,我如何确定对象是否可迭代?,如建议的那样.我不想引入不同的条件.我想避免重复.
我正在对一个字典进行子类化,并且希望获得一些帮助来理解下面的行为(请)[Python 版本:3.11.3]:
class Xdict(dict):
def __init__(self, d):
super().__init__(d)
self._x = {k: f"x{v}" for k, v in d.items()}
def __getitem__(self, key):
print("in __getitem__")
return self._x[key]
def __str__(self):
return str(self._x)
def __iter__(self):
print("in __iter__")
d = Xdict({"a": 1, "b": 2})
print(d)
print(dict(d))
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
{'a': 'x1', 'b': 'x2'}
in __getitem__
in __getitem__
{'a': 'x1', 'b': 'x2'}
Run Code Online (Sandbox Code Playgroud)
如果我注释掉该__iter__方法,输出会像这样改变:
{'a': 'x1', 'b': 'x2'}
{'a': 1, 'b': 2}
Run Code Online (Sandbox Code Playgroud)
显然该__iter__方法没有被调用,但它的存在正在影响行为。
我只是对为什么会发生这种情况感兴趣。我并不是在寻找替代解决方案来防止它。
谢谢,保罗。
我想写一个函数,它接受一个数字和列表列表,它们也可以包含数字和列表,依此类推......,并返回列表中某处的总数量.
示例:[1,[[[0,2],7,3],5,[1,2]],3]其中包含9个数字.
到目前为止这是我的代码:
test=[1,[[[0,2],7,3],5,[1,2]],3]
def flatten(mylist):
counter = 0
for i in range(len(mylist)):
if type(mylist[i]) == int:
counter += 1
if type(mylist[i]) == list:
[item for sublist in mylist[i] for item in sublist]
counter += 1
return counter
Run Code Online (Sandbox Code Playgroud)
我想我需要recursivley压扁子列表.但我得到错误:TypeError: 'int' object is not iterable
类似于这个问题:查找和替换列表(python)中的元素, 但使用多维数组。例如,我想用 0 替换所有 N:
list =
[['N', 0.21],
[-1, 6.6],
['N', 34.68]]
Run Code Online (Sandbox Code Playgroud)
我想把它改成:
list =
[[0, 0.21],
[-1, 6.6],
[0, 34.68]]
Run Code Online (Sandbox Code Playgroud) python ×11
iterable ×2
list ×2
assert ×1
class ×1
containers ×1
dictionary ×1
find ×1
for-loop ×1
generator ×1
isinstance ×1
iterator ×1
literals ×1
python-3.x ×1
replace ×1
subclass ×1
types ×1