如何使用字典列表作为函数参数

时间:2018-03-02 08:19:54

标签: python list dictionary arguments

我开始使用此代码:

import bs4, requests

def bal(address, symbol, name):
        r = requests.get('https://bitinfocharts.com/' + name + '/address/' + address)
        soup = bs4.BeautifulSoup(r.text, 'html.parser')
        elems = soup.find('div', itemprop = 'offers').contents[0].text
        elems = elems.replace(symbol,'').strip()
        return(elems)

print(bal('3D2oetdNuZUqQHPJmcMDDHYoqkyNVsFk9r', 'BTC', 'Bitcoin'))
print(bal('LQL9pVH1LsMfKwt82Y2wGhNGkrjF8vwUst', 'LTC', 'Litecoin'))

哪个有效并产生:

174,631.39464194
897,135.38526651

但是,此函数需要在大量字典中运行,因此我尝试修改代码并将数据放在字典中,然后将字典列表作为函数参数传递。

import bs4, requests

wallet1 = {
    'address' : '3D2oetdNuZUqQHPJmcMDDHYoqkyNVsFk9r',
    'symbol' : 'BTC',
    'name' : 'Bitcoin',
    }

wallet2 = {
    'address' : 'LQL9pVH1LsMfKwt82Y2wGhNGkrjF8vwUst',
    'symbol' : 'LTC',
    'name' : 'Litecoin',
    }

wallets =  [wallet1, wallet2]

def bal(address, symbol, name):
        r = requests.get('https://bitinfocharts.com/' + name + '/address/' + address)
        soup = bs4.BeautifulSoup(r.text, 'html.parser')
        elems = soup.find('div', itemprop = 'offers').contents[0].text
        elems = elems.replace(symbol,'').strip()
        return(elems)

print(bal(wallets))

我收到以下错误消息:

Traceback (most recent call last):
  File "/Users/tfountain/Desktop/python_work/stack.py", line 46, in <module>
    print(bal(wallets))
TypeError: bal() missing 2 required positional arguments: 'symbol' and 'name'
>>> 

我到底哪里错了?

如何使用字典列表作为函数参数?

2 个答案:

答案 0 :(得分:1)

功能&#39; bal&#39;期望采取3个论点。

你用一个参数调用bal,因此它抱怨它缺少2(3 - 1 = 2)。

你需要修改你的bal函数,因此它只能采用一个参数,例如。

def bal(wallets):

并通过例如从传递的参数中提取钱包字典迭代它:

for w in wallets

现在您可以从'address, symbol, name' dict访问w,例如:

address = w['address']
symbol = w['sumbol']
name = w['name']

这是适合您的代码:

def bal(wallets):
    elems_all = []
    for w in wallets:
        address = w['address']
        symbol = w['symbol']
        name = w['name']

        r = requests.get('https://bitinfocharts.com/' + name + '/address/' + address)
        soup = bs4.BeautifulSoup(r.text, 'html.parser')
        elems = soup.find('div', itemprop = 'offers').contents[0].text
        elems = elems.replace(symbol,'').strip()
        elems_all.append([elems, w])

    return elems_all

这是非常基本的实现,但它适合您。你可能想修改它以使用更漂亮的Python实现。

您可以通过访问elems_all元组列表来访问带钱包的正确元素。

答案 1 :(得分:0)

TL; DR

for w in wallets:
   print(bal(**w))

解决方案需要理解两个不同的概念,循环和参数解包

你不能打电话

bal(wallets)

因为那是调用不存在的函数bal(<list>) ...(你的函数有三个args,而不是一个)。由于您的bal功能需要一个钱包,我们只需为您列表中的每个钱包拨打一次。

你的功能仍然期待三个args,所以我们不能只传递w,因为它是一个字典。您可以使用一些python语法糖来自动从字典中提取值,并将它们作为命名参数传递给函数。因此bal(**w)的行为将为bal(address=<the value of address>, symbol=<val...>, name=<val...>)

使用这种方法要记住的一件事是参数解包会将dict中的 ALL 键/值传递给函数,因此如果你添加了一些意想不到的东西,你就会收到错误。