python—在“for”循环中,在循环之前访问迭代器

c2e8gylq  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(474)

我正在尝试访问“for”循环之前的迭代器“obj”,如下所示

  1. class MyClass:
  2. CLASS_CONST1 = 'some_rand_const'
  3. def __init__(self, type, age):
  4. self.type = type
  5. self.age = age
  6. var1 = 5
  7. age = 7
  8. # # I tried to individually add the following lines here, none of them work
  9. # obj = MyClass
  10. # obj = MyClass()
  11. condition = obj.type == MyClass.CLASS_CONST1
  12. if var1 > 10:
  13. condition = obj.type == MyClass.CLASS_CONST1 and obj.age == age
  14. list_of_objects = [MyClass('rand1', 'rand2'), MyClass('rand1', 'rand2'), MyClass('rand1', 'rand2')]
  15. for obj in list_of_objects:
  16. if condition:
  17. # do some stuff
  18. pass

问题是它在定义之前就被访问了(它在for循环中被定义)。我不想在for循环中引入条件行,因为这些行在每次迭代中都会执行,没有必要这样做。
其思想是,所有这些都进入一个函数,“var1”和“age”是函数的参数。

gt0wga4j

gt0wga4j1#

obj = MyClass 只需将类对象(不是示例)赋给另一个变量。 obj = MyClass() 将引发错误,因为您尚未为 type 以及 age 这些都是 __init__ . 你试过了吗 obj = MyClass(var1, age) ? 你后来为我做的 list_of_objects .
不管怎样,你试着创造 condition 作为一个变量,应该在迭代过程中应用它自己。python不是这样工作的。当它被计算一次时,它被赋予一个静态值。要使其应用于所有对象,请 condition 作为一个函数,它要么接受对象,要么接受两个变量 type 以及 var 作为参数,然后返回检查结果:

  1. var1 = 5
  2. age = 7
  3. def condition(obj):
  4. # will return the True/False result of the check below
  5. return obj.type == MyClass.CLASS_CONST1 and obj.age == age
  6. for obj in list_of_objects:
  7. if condition(obj): # call the function with that object
  8. # do some stuff
  9. pass

从你的代码来看,不清楚你想要什么 condition . 也许是这个?

  1. var1 = 5 # or put these inside `condition` so they are local
  2. age = 7 # to condition and not globals.
  3. # Or pass them in as parameters and modify `condition` to accept
  4. # the additional params
  5. def condition(obj):
  6. result = obj.type == MyClass.CLASS_CONST1
  7. if result and var1 > 10:
  8. # don't re-check `obj.type == MyClass.CLASS_CONST1`
  9. result = obj.age == age
  10. return result
展开查看全部
mkh04yzy

mkh04yzy2#

你宣布 condition 作为一个简单的布尔变量,而它的值必须依赖于 obj . 可以使用一组函数并将条件赋给相关的函数,或者由于条件很简单,可以使用lambdas:
条件=obj.type==myclass.class\u const1

  1. if var1 > 10:
  2. condition = lambda obj: obj.type == MyClass.CLASS_CONST1 and obj.age == age
  3. else:
  4. condition = lambda obj: obj.type == MyClass.CLASS_CONST1

然后将其用作变量函数:

  1. for obj in list_of_objects:
  2. if condition(obj):
  3. # do some stuff
  4. pass

相关问题