相关疑难解决方法(0)

Python foreach等价

我正在深入研究Python,我对foreach迭代有疑问.我是Python的新手,我在C#方面有一些经验.所以我想知道,如果我的集合中的所有项目都有Python中的等效函数用于迭代,例如

pets = ['cat', 'dog', 'fish']
marks = [ 5, 4, 3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

或类似的东西.

python foreach

154
推荐指数
6
解决办法
22万
查看次数

如何为对象列表调用相同的方法?

假设这样的代码:

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)

python

62
推荐指数
6
解决办法
8万
查看次数

消耗迭代器的最快(最Pythonic)方式

我很好奇消耗迭代器的最快方法是什么,以及最恐怖的方式.

例如,假设我想创建一个带有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_setmy_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 optimization iterator python-3.x

10
推荐指数
2
解决办法
966
查看次数

它是pythonic:命名lambdas

我开始意识到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 lambda

9
推荐指数
2
解决办法
3914
查看次数

从左到右在python3中的列表上应用操作

有没有办法在列表中实现非懒惰的从左到右调用操作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 functional-programming list operator-precedence

7
推荐指数
1
解决办法
144
查看次数

这个循环如何工作?

我正在尝试学习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)发生了什么.有人可以向我解释发生了什么事吗?

python for-loop

3
推荐指数
1
解决办法
233
查看次数