扩展我的评论:
你有一个list。访问是通过迭代(循环)或索引完成的。, ETC..dictlistformy_list[0]
dict访问也可以通过迭代完成,但一个很大的好处是密钥访问。my_dict['some_key'], ETC..
Python 简化了常见的方法list和dict构建通常称为“理解”的方法。
因此,对以下内容的list理解:
my_list = []
for i in range(10):
my_list.append(i)
可以写成
my_list = [i for i in range(10)]
我给你的不一定是list理解,而是遵循相同的想法。它被称为“生成器表达式”。不同之处在于,当您对其进行迭代时,它会生成一些输出,但它的输出作为一个整体并不是某些内置集合(list或dict)的形式。
在这种情况下有意义的原因是:
- 我需要遍历
list以找到dict正确的'asset'密钥。
- 我希望这种情况只会发生一次,所以我只关心第一次发生。
所以要分解它,你有一个生成器表达式:
(i['balance'] for i in USDT_BAL if i['asset'] == 'USDT')
大致相当于。
def my_gen():
for i in USDT_BAL:
if i['asset'] == 'USDT':
yield i['balance']
或者,如果您不熟悉生成器并希望将其作为list:
my_list = []
for i in USDT_BAL:
if i['asset'] == 'USDT':
my_list.append(i['balance'])
所以现在你可以看到我们有一个问题。如果我们把它作为一种list理解,它就是list一个元素的形式。
print(my_list) # ['0.00000000']
我们可以使用它来访问它,my_list[0]但这看起来很难看 IMO,但对每个人来说都是它自己的。
所以这就是next函数的用武之地。根据文档 next调用__next__迭代器(生成器是)上的方法并基本上推进生成器。因此,如果我们的生成器要产生1then 2then 3,调用next(my_gen)将产生1然后再次调用它会产生2等等。
因为我希望这个生成器表达式只产生 1 个项目,所以我只调用它一次。给它一个默认的None手段,如果它是空的,而不是引发它会产生的错误None。
所以:
next((i['balance'] for i in USDT_BAL if i['asset'] == 'USDT'), None)
创建一个遍历你的生成器list,只生成s 的'balance'键,dict谁的'asset'键等于'USDT'并调用next该生成器,默认值为None.