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

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

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

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

Python

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

Q&A

解決済

4回答

1451閲覧

Python 関数にてglobal変数の値を増加させる方法

unser

総合スコア58

関数

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

Python

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

0グッド

0クリップ

投稿2021/11/14 10:33

編集2021/11/14 10:42

global変数を1増加させる関数を用意したいと考えております。

現在作成したコードは

python

1# 増加させたいglobal 2a=1 3def add(value): 4 global a 5 a +=value 6add(2) 7print(a) 8# 3

と確かにaの値を変化させることができます。

しかし,変数aにしか対応していないためゆくゆくは

python

1def arbitrary_add(variable, value=1): 2 """ 3 global variableにvalueを足す関数 4 """

としたいと考えております。

こちらのarbitrary_add の実装方法をご教授いただけると幸いです。

追記(2021/11/14 19:40)

実装としては以下を想定しています

python

1variable=2 2arbitary_add(variable,value=3) 3print(variable) 4# 5

今回は返り値を返すような場合のものは想定していません。
(理由としましては,ニューラルネットのmodel.train()に似た挙動をこちらで確認したいためです。)

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

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

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

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

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

guest

回答4

0

inspect を使ってスタックの中身を覗いてみると、function call のコード断片が入っていますので、それを利用します。しかし、正規表現がいい加減なので失敗することもあるでしょう。

def arbitrary_add(variable, value): """ global variableにvalueを足す関数 """ import re import inspect my_name = inspect.currentframe().f_code.co_name callers_name = inspect.stack()[-1].code_context[0] callers_name = re.findall(rf'\s*{my_name}\s*(\s*(.+?)\s*,', callers_name) if callers_name: callers_name = callers_name[0] else: return if callers_name in globals(): globals()[callers_name] += value if __name__ == '__main__': global_variable = 3 print(f'before = {global_variable}') arbitrary_add(global_variable, 1) print(f' after = {global_variable}') _ = ''' before = 3 after = 4 '''

投稿2021/11/14 11:47

編集2021/11/14 12:31
melian

総合スコア20655

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

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

0

ベストアンサー

arbitary_add(variable,value=3)というのは原理的に不可能(関数にはvariableの値だけしか渡らない)です。

arbitary_add("variable",value=3)と変数名を渡すのでいいのであれば出来ます。

Python

1def arbitary_add(varname,value=0): 2 globals()[varname] += value 3 4XXX=123 5arbitary_add("XXX",value=876) 6print(XXX)

投稿2021/11/14 11:35

otn

総合スコア85901

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

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

0

Pythonでは、関数を呼び出す前に引数を評価する(つまり値を取り出す)ので、そういうことはできません。
求めるものが良くわかりませんが、np.ndarrayを対象とするなら以下のようになります。

python

1>>> import numpy as np 2>>> a = np.array([5]) 3>>> arbitrary_add(a, 3) 4>>> print(a) 5[8] 6>>> b = np.array([42]) 7>>> arbitrary_add(b, 10) 8>>> print(b) 9[52]

投稿2021/11/14 10:48

ppaul

総合スコア24670

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

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

0

その関数の返り値に増加した結果を返すようにすればよろしい

a=1 a= arbitrary_add(a) print(a)

投稿2021/11/14 10:37

y_waiwai

総合スコア88042

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

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

unser

2021/11/14 10:40

すみません。そのような回答は今回望んでいません。
y_waiwai

2021/11/14 10:41

どのような回答を望んでるんでしょうか。 それを質問文に書いときましょう
unser

2021/11/14 10:43

追記しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問