扩展我的评论:
你有一个list
。访问是通过迭代(循环)或索引完成的。, ETC..dict
list
for
my_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__
迭代器(生成器是)上的方法并基本上推进生成器。因此,如果我们的生成器要产生1
then 2
then 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
.