我正在深入研究Python,我对foreach迭代有疑问.我是Python的新手,我在C#方面有一些经验.所以我想知道,如果我的集合中的所有项目都有Python中的等效函数用于迭代,例如
pets = ['cat', 'dog', 'fish']
marks = [ 5, 4, 3, 2, 1]
Run Code Online (Sandbox Code Playgroud)
或类似的东西.
假设这样的代码:
class Base:
def start(self):
pass
def stop(self)
pass
class A(Base):
def start(self):
... do something for A
def stop(self)
.... do something for A
class B(Base):
def start(self):
def stop(self):
a1 = A(); a2 = A()
b1 = B(); b2 = B()
all = [a1, b1, b2, a2,.....]
Run Code Online (Sandbox Code Playgroud)
现在我想为列表中的每个对象调用方法start和stop(也许还有其他).除了写一堆像这样的函数之外,还有什么优雅的方法吗?
def start_all(all):
for item in all:
item.start()
def stop_all(all):
Run Code Online (Sandbox Code Playgroud) 我很好奇消耗迭代器的最快方法是什么,以及最恐怖的方式.
例如,假设我想创建一个带有map内置函数的迭代器,它会积累一些副作用.我实际上并不关心结果map,只是副作用,所以我希望尽可能少地使用开销或样板来完成迭代.就像是:
my_set = set()
my_map = map(lambda x, y: my_set.add((x, y)), my_x, my_y)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我只是想通过迭代器来积累内容my_set,并且my_set只是一个空集,直到我实际运行my_map.就像是:
for _ in my_map:
pass
Run Code Online (Sandbox Code Playgroud)
或赤身裸体
[_ for _ in my_map]
Run Code Online (Sandbox Code Playgroud)
工作,但他们都觉得笨重.是否有更多的Pythonic方法来确保迭代器快速迭代,以便您可以从一些副作用中受益?
我在上面测试了上面的两种方法:
my_x = np.random.randint(100, size=int(1e6))
my_y = np.random.randint(100, size=int(1e6))
Run Code Online (Sandbox Code Playgroud)
用my_set和my_map如上所定义.我用timeit获得了以下结果:
for _ in my_map:
pass
468 ms ± 20.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
[_ for _ in my_map]
476 …Run Code Online (Sandbox Code Playgroud) 我开始意识到python中lambda表达式的价值,特别是涉及函数式编程map,函数返回函数等等.但是,我也一直在函数中命名lambdas,因为:
当我遇到满足上述标准的情况时,我一直在编写一个名为lambda的表达式,以便干燥并缩小范围功能.例如,我正在编写一个在某些numpy数组上运行的函数,我需要对传递给函数的所有数组进行适度的繁琐索引(可以很容易地放在一行上).我编写了一个名为lambda的表达式来进行索引,而不是编写整个其他函数,或者在整个函数定义中多次复制/粘贴索引.
def fcn_operating_on_arrays(array0, array1):
indexer = lambda a0, a1, idx: a0[idx] + a1[idx]
# codecodecode
indexed = indexer(array0, array1, indices)
# codecodecode in which other arrays are created and require `indexer`
return the_answer
Run Code Online (Sandbox Code Playgroud)
这是滥用python的lambdas吗?我应该吮吸它并定义一个单独的功能吗?
可能值得链接功能内部功能.
有没有办法在列表中实现非懒惰的从左到右调用操作python?
例如 scala
val a = ((1 to 50)
.map(_ * 4)
.filter( _ <= 170)
.filter(_.toString.length == 2)
.filter (_ % 20 == 0)
.zipWithIndex
.map{ case(x,n) => s"Result[$n]=$x"}
.mkString(" .. "))
a: String = Result[0]=20 .. Result[1]=40 .. Result[2]=60 .. Result[3]=80
Run Code Online (Sandbox Code Playgroud)
虽然我意识到许多人不喜欢上面的语法,但我喜欢从左到右移动并随时添加任意操作的能力.
for当有三个或更多操作时,python 理解是不容易阅读的.结果似乎是我们需要将所有内容分解成块.
[f(a) for a in g(b) for b in h(c) for ..]
Run Code Online (Sandbox Code Playgroud)
有没有机会提到这种方法?
注意:我尝试了一些库,包括toolz.functoolz.python3懒惰的评估很复杂:每个级别返回一个map对象.此外,它不能显示它可以在输入上操作list.
我正在尝试学习python,我正在阅读编程python.我非常了解java所以我决定尝试python.我将通过一个使用循环的示例,我对此代码中发生的事情感到困惑
for person in people:
for (name, value) in person:
if name == 'name': print(value)
Run Code Online (Sandbox Code Playgroud)
我知道有两个循环,每次循环时person增加1,我不理解的是第二个循环中(name,value)发生了什么.有人可以向我解释发生了什么事吗?