🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

関数

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

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Python

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

Q&A

解決済

2回答

2323閲覧

pythonで関数(def)を自動生成したい

pokemonta

総合スコア170

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

関数

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

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Python

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

0グッド

2クリップ

投稿2021/02/25 08:53

編集2021/02/25 08:54

私が作ったpythonプログラムは以下の通りです。
nameやcountryは、ループ数を渡すと取得できるものとします。(本質ではないので割愛します)

py

1for i in range(100): 2 3 dict[i] = { 4 "name" : getName(i), 5 "Items": { 6 "Item" : {"country" : getCountry(i)} 7 } 8 } 9 10with open('abc.txt', mode='a',encoding='shift-jis') as f: 11 json_str = json.dumps(dict, sort_keys=False, ensure_ascii=False, indent=4) 12 f.write('return ' + json_str + '\n')

実行結果は以下の通りです

json

1return { 2 "0": { 3 "name": "yokota", 4 "Items": { 5 "Item": { 6 "country": "chaina" 7 } 8 } 9 }, 10 "1": { 11 "name": "maeda", 12 "Items": { 13 "Item": { 14 "country": "japan" 15 } 16 17 } 18 }, 192021

私が実現したい形式は以下の通りです
どのようにすれば実現できるのでしょうか
defを自動で生成したいです。

def item_0(): return { "name": "yokota", "Items": { "item": { "country": "chaina" } } } def item_1(): return { "name": "maeda", "Items": { "item": { "country": "japan" } } }

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

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

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

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

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

siruku6

2021/02/25 09:07 編集

lambda関数であれば簡単に自動生成でき、配列に格納できるような気もするのですが、そうではなく、あくまでも名前のある関数をプログラムで自動生成したいということでしょうか? lambdaの参考記事 https://qiita.com/nagataaaas/items/531b1fc5ce42a791c7df
quickquip

2021/02/25 09:30

なぜこんなことをしたいのか? という情報がないと答えづらい質問です(回答の第1候補が「そんなことは意味がないししちゃいけない」なので)
TakaiY

2021/02/25 09:34

すでに回答付いてますが、item_0 から item_100 までの関数を作ったとして、それをどのように使う(呼び出す)のですか?
hayataka2049

2021/02/25 11:23

これはpythonコードを自動生成したいという質問でしょうか(どのみちあまりいいやり方とは思えませんが)。
pokemonta

2021/02/25 12:54

一旦、以下のような形でテキストに名前付き関数を出力したいです。 (関数名が自動で採番されreturnでオブジェクトが返ってくる形) def 関数名(): return { オブジェクト } 出力結果を確認したうえで 呼び出し元を以下のように追加すれば簡単に実行できると考えています。 for num in range(100): item_ + num() このやり方よりいい方法はございますでしょうか?
pokemonta

2021/02/25 13:15 編集

なぜこんなややこしいことをしているのかという点に関してですが、 nameやcountryをわかりやすく固定値を入力していますが 動的に変わるwebサイト(複数のサイト)から値を取得しますので 値が取れているのかまた、値が妥当なものかをいったん目視で確認したいからです。 さらに上記データを元に別の用途で利用するデータを出力します。 そのため取得したデータと出力したデータを切り分けられるようにしています。 他にも取得したデータは正常値だったものの出力したデータを補正したいケースもあります
ppaul

2021/02/26 01:44

子供にマッチを触らせるのは危ないという育て方もあれば、一度自分で火傷をしたほうが良くわかるという育て方もあります。我が家は後者の方針で子育てしました。 ソフトウェア技術者育成でも、両方の方針があると思います。
guest

回答2

0

ベストアンサー

データをJSONファイルに書けば、内容を目視で確認できますし、修正もできますよね。

python

1import json 2 3 4with open('abc,json') as f: 5 data = json.load(f) 6 7 8def get_item(i): 9 return data[str(i)] 10 11 12# 使う方 13for num in range(100): 14 x = get_item(num) 15 # xでなにかする

のような、ファイルからデータを読みこんで利用する普通の関数で不足な理由が今のところ見当たりません。(関数である必要もなさそうです)


呼び出し元を以下のように追加すれば簡単に実行できると考えています。

pyhton

1for num in range(100): 2 item_ + num()

これは正しいPythonのコードではなく動きません。

投稿2021/02/25 14:54

quickquip

総合スコア11231

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

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

pokemonta

2021/02/26 01:03

その発想がなかったですね。。
TakaiY

2021/02/26 01:04

僕も、引数に必要なデータを渡すと、生成したデータを返す関数で充分だと思います。
guest

0

こういう場合はexecを使うのでしょう。

python

1>>> print(d) 2[{'name': 'yokota', 'Items': {'Item': {'country': 'chaina'}}}, {'name': 'maeda', 'Items': {'Item': {'country': 'japan'}}}] 3>>> 4>>> for i in range(2): 5... exec(f'def item_{i}():\n return {d[i]}') 6... 7>>> item_0() 8{'name': 'yokota', 'Items': {'Item': {'country': 'chaina'}}} 9>>> item_1() 10{'name': 'maeda', 'Items': {'Item': {'country': 'japan'}}}

投稿2021/02/25 09:25

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問