我想检查变量是否存在.现在我正在做这样的事情:
try:
myVar
except NameError:
# Do something.
Run Code Online (Sandbox Code Playgroud)
还有其他方法没有例外吗?
Python生成器非常有用.它们优于返回列表的函数.但是,你可以len(list_returning_function()).有办法len(generator_function())吗?
更新:
当然len(list(generator_function()))会工作.....
我正在尝试使用我在我正在创建的新生成器中创建的生成器.作为新发电机计算的一部分,它需要知道旧发电机的长度.但是我想将它们与发生器保持相同的属性,特别是 - 不要将整个列表保存在内存中,因为它可能很长.
更新2:
假设发生器即使从第一步开始就知道它的目标长度.此外,没有理由维护len()语法.示例 - 如果Python中的函数是对象,我不能将长度分配给新生成器可以访问的此对象的变量吗?
Python提供了一种很好的方法来获取渴望迭代的长度,len(x)也就是说.但是我找不到任何类似于生成器理解和函数所代表的惰性迭代.当然,写下这样的东西并不难:
def iterlen(x):
n = 0
try:
while True:
next(x)
n += 1
except StopIteration: pass
return n
Run Code Online (Sandbox Code Playgroud)
但我无法摆脱我重新实现自行车的感觉.
(当我输入这个函数时,一个想法让我大吃一惊:也许真的没有这样的功能,因为它"摧毁"了它的论点.虽然不是我的情况的问题).
PS:关于第一个答案 - 是的,类似的东西len(list(x))也会起作用,但这会大大增加内存的使用.
PPS:重新检查......无视PS,似乎我在尝试时犯了一个错误,它运行正常.抱歉,添麻烦了.
如果我想要迭代中的项目数量而不关心元素本身,那么获得该元素的pythonic方法是什么?现在,我会定义
def ilen(it):
return sum(itertools.imap(lambda _: 1, it)) # or just map in Python 3
Run Code Online (Sandbox Code Playgroud)
但我明白lambda接近被认为是有害的,lambda _: 1当然不是很漂亮.
(这个用例是计算匹配正则表达式的文本文件中的行数,即grep -c.)
我有一个整数列表,我希望能够识别连续的重复块:也就是说,我想生成一个保留顺序的双重列表,其中每个双重包含(int_in_question,出现次数).
例如,如果我有一个列表,如:
[0, 0, 0, 3, 3, 2, 5, 2, 6, 6]
Run Code Online (Sandbox Code Playgroud)
我希望结果如下:
[(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)]
Run Code Online (Sandbox Code Playgroud)
我有一个相当简单的方法,使用for循环,temp和计数器:
result_list = []
current = source_list[0]
count = 0
for value in source_list:
if value == current:
count += 1
else:
result_list.append((current, count))
current = value
count = 1
result_list.append((current, count))
Run Code Online (Sandbox Code Playgroud)
但我真的很喜欢python的函数式编程习语,我希望能够通过一个简单的生成器表达式来实现这一点.但是我发现在使用发电机时很难保留子计数.我有一种感觉,两个步骤可能会让我在那里,但是现在我很难过.
是否有一种特别优雅/ pythonic的方式来做到这一点,特别是对于发电机?
我正在使用itertools迭代我输入参数的所有可能组合的数值模拟.在下面的示例中,我有两个参数和六种可能的组合:
import itertools
x = [0, 1]
y = [100, 200, 300]
myprod = itertools.product(x, y)
for p in myprod:
print p[0], p[1]
# run myfunction using p[0] as the value of x and p[1] as the value of y
Run Code Online (Sandbox Code Playgroud)
如何获得myprod(示例中的六个)的大小?我需要在for循环开始之前打印它.
我明白myprod不是一个清单.我可以计算len(list(myprod)),但这会消耗迭代器,因此for循环不再有效.
我试过了:
myprod2=copy.deepcopy(myprod)
mylength = len(list(myprod2))
Run Code Online (Sandbox Code Playgroud)
但这也行不通.我可以:
myprod2=itertools.product(x,y)
mylength = len(list(myprod2))
Run Code Online (Sandbox Code Playgroud)
但它不是优雅和pythonic!
我正在编写一个定义__iter__and的类__len__,其中 的值__len__取决于__iter__. 我得到了一个有趣的RecursionError.
语言版本:Python 3.8.6、3.7.6。 示例仅用于说明错误。
在以下示例中,Iter.__len__()尝试解包self,将结果存储在 a 中list,然后尝试调用该list.__len__()列表上的内置函数以获取长度。
>>> class Iter:
... def __iter__(self):
... return range(5).__iter__()
... def __len__(self):
... return list.__len__([*self])
...
>>> len(Iter())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __len__
File "<stdin>", line 5, in __len__
File "<stdin>", line 5, in __len__
[Previous line repeated 993 more times] …Run Code Online (Sandbox Code Playgroud) 在不将元素存储在内存中的情况下(通过迭代)计算可迭代对象中元素数量的最佳方法是什么?
现在,我只是在做sum(1 for x in iterable)。我本来希望能在里面找到什么itertools,但似乎什么也没有。
我有一个生成有限序列的生成器.为了确定这个序列的长度,我尝试了这两种方法:
seq_len = sum([1 for _ in euler14_seq(sv)]) # list comp
Run Code Online (Sandbox Code Playgroud)
和
seq_len = sum(1 for _ in euler14_seq(sv)) # generator expression
Run Code Online (Sandbox Code Playgroud)
sv 是序列的常量起始值.
我原本以为列表理解会慢一点,生成器表达式会更快,但事实证明相反.
我假设第一个会占用更多的内存,因为它首先在内存中创建一个完整的列表 - 部分原因我还认为它会更慢.
我的问题:这种观察是否可以推广?这是因为第二个声明与第一个声明中涉及两个发生器吗?
我看过这些什么是计算生成器/迭代器中项目数的最短方法?,生成器输出的长度, 是否有任何内置的方法来获取python中迭代的长度?并且看到了一些测量序列长度的其他方法,但我对list comp与generator表达式的比较特别好奇.
PS:当我决定根据昨天提出的问题解决欧拉项目#14时出现了这个问题.
(顺便说一句,关于使用'_'不需要变量值的地方的一般感觉是什么).
这是在Windows 7 64位下使用Python 2.7.2(32位)完成的
是否真的可以看到 itertools.Combination 或其他对象的 len() ,而不将其具体化到列表中?
我可以用阶乘得到梳子的基数或排列,......但我想要一些概括的东西。
谢谢
python ×11
generator ×5
iterable ×3
iterator ×3
count ×1
duplicates ×1
exception ×1
list ×1
python-2.7 ×1
python-3.x ×1
sequences ×1
variables ×1