正如你已经明白我是一个初学者,我正在努力理解编写这个函数的"Pythonic方式"是什么.我知道其他线程可能包含对此的部分答案,但我不知道该寻找什么,因为我不明白这里发生了什么.
这行是我朋友发给我的代码,用于改进我的代码:
import numpy as np
#load_data:
def load_data():
data_one = np.load ('/Users/usr/... file_name.npy')
list_of_tuples = []
for x, y, label in data_one:
list_of_tuples.append( (x,y) )
return list_of_tuples
print load_data()
Run Code Online (Sandbox Code Playgroud)
"改进"版本:
import numpy as np
#load_data:
def load_data():
data_one = np.load ('/Users/usr.... file_name.npy')
list_of_tuples = [(x,y) for x, y, label in data_one]
return list_of_tuples
print load_data()
Run Code Online (Sandbox Code Playgroud)
我想知道:
是否obj == iter(obj)意味着obj不能重复迭代,反之亦然?我没有在文档中看到任何这样的措辞,但根据这个评论,标准库通过测试检查对象是否可重复迭代 :if iter(obj) is obj
@agf:Python标准库的某些部分依赖于规范的这一部分; 它们通过测试检测某些东西是否是迭代器/生成器
if iter(obj) is obj:,因为真正的迭代器/生成器对象将__iter__定义为标识函数.如果测试为真,则转换为list允许重复迭代,否则,假设对象可重复迭代,并且可以按原样使用它.
- ShadowRanger 6月3日17:23
文档确实声明如果obj是迭代器,则需要iter(obj)返回obj.但我认为这并不足以得出结论,可以使用非重复可迭代对象来识别iter(obj) is obj.
文档说明图中的孤立顶点可以使用networkx.isolates(G)获得.它补充说,可以使用代码G .remove_nodes_from(nx.isolates(G))从图G中移除孤立的顶点.
但是当我运行代码时,我得到运行时错误"字典在迭代期间改变了大小".
错误报告:-
>>> G.remove_nodes_from(nx.isolates(G))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/iiitdm/anaconda2/lib/python2.7/site-packages/networkx/classes/graph.py", line 617, in remove_nodes_from
for n in nodes:
File "/home/iiitdm/anaconda2/lib/python2.7/site-packages/networkx/algorithms/isolate.py", line 94, in <genexpr>
return (n for n, d in G.degree() if d == 0)
File "/home/iiitdm/anaconda2/lib/python2.7/site-packages/networkx/classes/reportviews.py", line 443, in __iter__
for n in self._nodes:
RuntimeError: dictionary changed size during iteration
这是可以理解的并且是预期的,因为(我认为)使用函数isolates()创建的生成器对象随G更改,因此在"迭代"时更改图G应该给出类似的错误.那么文档中的那一行肯定是错的,不是吗?我完全没有了吗?我对python很新.
顺便说一句,networkx.isolates()返回的对象是一个生成器对象.
谢谢
我习惯于for循环的C++方式,但Python循环让我感到困惑.
for party in feed.entry:
print party.location.address.text
Run Code Online (Sandbox Code Playgroud)
这里for party in feed.entry在for party in feed.entry.它意味着什么以及它如何实际起作用?
根据Python文档,当我执行范围(0,10)时,此函数的输出是0到9的列表,即[0,1,2,3,4,5,6,7,8,9].然而,尽管有很多这样的在线工作示例,但我的PC上的Python安装并没有输出.
这是我的测试代码......
test_range_function = range(0, 10)
print(test_range_function)
print(type(test_range_function))
Run Code Online (Sandbox Code Playgroud)
我想的输出应该是打印的列表,类型函数应该将其作为列表输出.相反,我得到以下输出...
c:\Programming>python range.py
range(0, 10)
<class 'range'>
Run Code Online (Sandbox Code Playgroud)
我没有在网上的任何一个例子中看到这一点,并且非常欣赏这方面的一些亮点.
我正在编写一个小的包装类open,它将从文本文件中过滤出特定的行,然后在将它们传递给用户之前将它们拆分为名称/值对.当然,这个过程有助于使用生成器实现.
class special_file:
def __init__(self, fname):
self.fname = fname
def __iter__(self):
return self
def __next__(self):
return self.next()
def next(self):
with open(self.fname, 'r') as file:
for line in file:
line = line.strip()
if line == '':
continue
name,value = line.split()[0:2]
if '%' in name:
continue
yield name,value
raise StopIteration()
Run Code Online (Sandbox Code Playgroud)
for g in special_file('input.txt'):
for n,v in g:
print(n,v)
Run Code Online (Sandbox Code Playgroud)
遗憾的是,我的代码有两个巨大的问题:1)special_file当它确实需要返回一个元组时返回一个生成器,以及2).我怀疑这两个问题是相关的,但我对生成器和可迭代序列的理解相当有限.我是否遗漏了一些关于实施发电机的痛苦明显的事情?StopIteration()永远不会引发异常,因此无限期地重复读取文件
我通过将第一个生成器移动到循环外部然后循环遍历它来修复我的无限读取问题.
g = special_file('input.txt')
k = next(g)
for n,v in k: …Run Code Online (Sandbox Code Playgroud) 让我们it成为python中的可迭代元素.在什么情况下,it一个循环内部的变化it反射?或者更直接:这样的事情什么时候起作用?
it = range(6)
for i in it:
it.remove(i+1)
print i
Run Code Online (Sandbox Code Playgroud)
导致打印0,2,4(显示循环运行3次).
另一方面呢
it = range(6)
for i in it:
it = it[:-2]
print it
Run Code Online (Sandbox Code Playgroud)
导致输出:
[0,1,2,3]
[0,1]
[]
[]
[]
[],
Run Code Online (Sandbox Code Playgroud)
显示循环运行6次.我想这与就地操作或可变范围有关,但不能100%肯定地绕过它.
Clearification:
一个例子,不起作用:
it = range(6)
for i in it:
it = it.remove(i+1)
print it
Run Code Online (Sandbox Code Playgroud)
导致'None'被打印并且Error(NoneType没有属性'remove')被抛出.
我知道的iterator是iterable,但只有一次通过.
例如,许多功能中itertools取iterable为参数,例如islice.iterator如果我看到api说的话,我可以随时通过iterable吗?
正如@delnan指出:
虽然每个
iterator都是一个iterable,但有些人(在核心团队之外)说"可迭代",当他们的意思是"可以用相同的结果迭代几次".野外的一些代码声称可以使用iterables但实际上不起作用iterators.
这是我的担忧.是否有iterable支持多通道的名称?喜欢IEnumerableC#?
如果我要构建一个声称支持的功能iterable,那么实际支持iterator也是最佳实践吗?
这是我的任务,对于我的生活,我似乎无法想办法.这是我到目前为止的代码:
sum = 0
k = 1
while k <= 0.0001:
if k % 2 == 1:
sum = sum + 1.0/k
else:
sum = sum - 1.0/k
k = k + 1
print()
Run Code Online (Sandbox Code Playgroud)
这是我的任务:
创建一个名为sumseries.py的python程序,它执行以下操作:将注释放在程序顶部,并附上您的名称,日期和程序的描述.
编写一个程序来计算和显示系列的总和:
1 - 1/2 + 1/3 - 1/4 + ......
直到达到小于0.0001的期限.
10,000次迭代的答案似乎是0.6930971830599583
我以1,000,000,000(十亿)次迭代运行该程序,并提出了一些0.6931471810606472.我需要创建一个循环来可编程地创建系列.
我试图迭代列表列表中的每一行,将每行中的一个元素附加到新列表中,然后在新列表中查找唯一元素。
我知道我可以使用 for 循环轻松完成此操作。我正在尝试不同的路线,因为我想了解有关类和函数的更多信息。
这是列表列表的示例。第一行是标题:
legislators = [
['last_name', 'first_name', 'birthday', 'gender', 'type', 'state', 'party'],
['Bassett', 'Richard', '1745-04-02', 'M', 'sen', 'DE', 'Anti-Administration'],
['Bland', 'Theodorick', '1742-03-21', '', 'rep', 'VA', ''],
['Burke', 'Aedanus', '1743-06-16', '', 'rep', 'SC', ''],
['Carroll', 'Daniel', '1730-07-22', 'M', 'rep', 'MD', ''],
['Clymer', 'George', '1739-03-16', 'M', 'rep', 'PA', ''],
['Contee', 'Benjamin', '', 'M', 'rep', 'MD', ''],...]
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
import csv
f = open("legislators.csv")
csvreader = csv.reader(f)
legislators = list(csvreader)
class Dataset:
def __init__(self, data):
self.header = data[0] #Isolate header from …Run Code Online (Sandbox Code Playgroud)