1

使用以下命令,我可以从我的 binance ac 打印我的资产余额。

命令:

USDT_BAL = client.futures_account_balance(asset='USDT')

返回:

[{'accountAlias': 'sRuXXqTioCfWFz', 'asset': 'BNB', 'balance': '0.00000142', 'withdrawAvailable': '0.00000142', 'updateTime': 1621516315044}, {'accountAlias': 'sRuXXqTioCfWFz', 'asset': 'USDT', 'balance': '0.00000000', 'withdrawAvailable': '0.00000000', 'updateTime': 0}, {'accountAlias': 'sRuXXqTioCfWFz', 'asset': 'BUSD', 'balance': '0.00000000', 'withdrawAvailable': '0.00000000', 'updateTime': 0}]

它返回其他资产的余额,但我只需要 USDT 资产的余额。我如何过滤 USDT_BAL 变量呢?

4

1 回答 1

0

扩展我的评论:

你有一个list。访问是通过迭代(循环)或索引完成的。, ETC..dictlistformy_list[0]

dict访问也可以通过迭代完成,但一个很大的好处是密钥访问。my_dict['some_key'], ETC..

Python 简化了常见的方法listdict构建通常称为“理解”的方法。

因此,对以下内容的list理解:

my_list = []
for i in range(10):
    my_list.append(i)

可以写成

my_list = [i for i in range(10)]

我给你的不一定是list理解,而是遵循相同的想法。它被称为“生成器表达式”。不同之处在于,当您对其进行迭代时,它会生成一些输出,但它的输出作为一个整体并不是某些内置集合(listdict)的形式。

在这种情况下有意义的原因是:

  1. 我需要遍历list以找到dict正确的'asset'密钥。
  2. 我希望这种情况只会发生一次,所以我只关心第一次发生。

所以要分解它,你有一个生成器表达式:

(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.

于 2021-05-25T01:21:15.627 回答