質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

910閲覧

Python for文 continueの関数化による出力結果の違い。

Na3430mls

総合スコア3

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/04/18 13:11

編集2021/04/18 13:23

Python初学者です。

実現したいこと
1、BitflyerのAPIに接続
2、残高が0でないコインの情報を取得
3、取得した要素をFlaskを使用してHTMLに表示させたいです。

以下のコードで残高が0でない要素のみを正しく取得することが出来ました。

Python

1import pybitflyer 2import time 3from datetime import datetime 4from pytz import timezone 5from dateutil import parser 6 7BALANCE_KEYS = ["currency_code", 8# "amount", 9 "available"] 10 11API_KEY = "" 12API_SECRET = "" 13 14 15 16api = pybitflyer.API(api_key = API_KEY, api_secret = API_SECRET) 17balances = api.getbalance(product_code="BTC_JPY") 18 19for balance in balances: 20 21 if balance ["available"] == 0: 22 continue 23 for balance_key in BALANCE_KEYS: 24 result =(balance_key + " : " + str(balance[balance_key])) 25 print(result +"\n") 26``` 27 28しかし、上記の処理を関数化しようとして以下のように書き換えたところ、上で出力した返り値の最後の要素のavailableのみしか取得ができません。 29 30```Python 31import pybitflyer 32from flask import Flask, render_template,request 33import time 34from datetime import datetime 35import json 36from dateutil import parser 37from pytz import timezone 38 39 40 41BASE_URL ="https://api.bitflyer.jp" 42url = BASE_URL + "POST /v1/me/sendchildorder" 43 44API_KEY ="" 45API_SECRET ="" 46api = pybitflyer.API(API_KEY,API_SECRET) 47 48BALANCE_KEYS = ["currency_code", 49 "available"] 50balances = api.getbalance(product_code="BTC_JPY") 51 52def get_balance(): 53 for balance in balances: 54 if balance["available"]==0: 55 continue 56 for balance_key in BALANCE_KEYS: 57 balance_result=(balance_key +" : " +str(balance[balance_key])) 58 return balance_result 59 60``` 61残高が0でない全ての要素を取得、かつ関数化するにはどのようにコードを書き換えれば良いのでしょうか? 62returnの書き方に問題があるのでしょうか。 63また、なぜ上記2つのコードの出力結果がこんなにも違うのか、理由がわかりません。 64なお、APIの情報は個人情報保護のため削除しておりますが、実際のコードには記述があります。 65 66どなたかご存知の方がいらっしゃいましたら、ご教授ください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

2つの処理は明確に異なります。 また、質問の「出力」って何でしょう?

python

1for balance in balances: 2 3 if balance ["available"] == 0: 4 continue 5 for balance_key in BALANCE_KEYS: 6 result =(balance_key + " : " + str(balance[balance_key])) 7 print(result +"\n")

これはfor文が回るたびに resultの値を「表示」しています。

python

1def get_balance(): 2 for balance in balances: 3 if balance["available"]==0: 4 continue 5 for balance_key in BALANCE_KEYS: 6 balance_result=(balance_key +" : " +str(balance[balance_key])) 7 # ★ 8 return balance_result

こちらの処理では、for文で回していますが、保存も表示もしていないので、最後に回ったときのbalance_resultの値だけreturnで返しています。
表示するのが目的dえあれば、★のところに balance_resultをprintする処理を入れてみればいいでしょう。

結果を全て返したいのであれば、リストにするか辞書にするかしてそれを返すようにすればいいでしょう。

python

1def get_balance(): 2 all_result = {} 3 for balance in balances: 4 if balance["available"]==0: 5 continue 6 for balance_key in BALANCE_KEYS: 7 balance_result=(balance_key +" : " +str(balance[balance_key])) 8 all_result[balance_key] = balance[balance_key] 9 return all_result

表示するにしても返すにしても、これらではちょっと違うように思いますが、得られた結果をどのように使いたいのか示してもらえれば、もうちょっといいアドバイスができるかもしれません。

投稿2021/04/18 13:43

TakaiY

総合スコア13790

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Na3430mls

2021/04/18 14:16

ご回答ありがとうございます!なるほど、保存をしていないからループの度に取得した値が消えていたのですね。。。。! 大まかな流れは 1、関数を定義 2、関数内で得られた結果を{currency_code: available}の組み合わせでディクショナリに保存→変数に入れる。 3、変数に保存したものを別のファイルで関数を呼び出すことにより、表示させる のような感じです。
Na3430mls

2021/04/18 14:20 編集

該当の関数で実現したいのは、 BALANCE_KEYS = ["currency_code","available"]をAPIを使って取得して、関数を実行すれば呼び出しが可能なように変数に入れて保存しておくことです。 出力というのは、実行結果というような意味合いで使っておりましたが使い方が違うかもしれません。紛らわしかっったらすみません。。。
Na3430mls

2021/04/18 14:30

def get_balance(): all_result = {} for balance in balances: if balance["available"]==0: continue for balance_key in BALANCE_KEYS: balance_result=(balance_key +" : " +str(balance[balance_key])) all_result[balance_key] = balance[balance_key] get_balance() print(all_result[balance_key]) としたら、print(all_result[balance_key])は定義されていませんと言われてしまいました こちらに取得した値を保存しているというわけではないのでしょうか?
TakaiY

2021/04/19 01:11

all_resultやbalance_keyなどの関数内で定義した変数は、関数の外では使えません。 all_result は回答にあるように、returnで返していますので、呼び出し側で変数で受けることで使えるようになります。 balance_result = get_balance() print(balance_result) このようにすれば表示されるはずです。受ける変数はあえて名前を変えています。 いずれにしても、関数と変数のスコープについては、もうちょっと調べて理解を深めるといいと思います。 balances や BALANCE_KEYS は意図的であれ、関数の外の変数を参照しています。これらは引数で渡してやったほうが明確になると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問