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

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

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

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

Q&A

解決済

3回答

1195閲覧

global変数について教えてください

22Go

総合スコア55

Python

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

0グッド

0クリップ

投稿2018/12/29 13:27

python

1with open("sequence.fasta.txt") as f: 2 3 max_len = 0 4 max_protein = "" 5 6 min_len = 0 7 min_protein = "" 8 9 def change(protein, seq): 10 global max_len,max_protein,min_len,min_protein 11 seq_len = len(seq) 12 if seq_len == 0: 13 return 14 15 else: 16 a = [seq_len] 17 print(a) 18 19 if seq_len > max_len: 20 max_len,max_protein,min_len,min_protein = seq_len,protein,seq_len,protein 21 22 else: 23 if seq_len < min_len: 24 min_len,min_protein = seq_len,protein 25

ファイルの中から最大値と最小値を検索し続け、見つかり次第、最小値、最大値、その時のタンパク質を更新していくのですが、change関数内のglobalをやめて、関数外で同じ機能を果たせるようにしたいです。
強いて言えば、globalを使用せずに他の関数で現在のコードのままの機能を果たすにはどのような関数を定義したら最適でしょうか?

また、globalは関数外から定義した数値を変更できる。との認識ですが、間違っていますでしょうか?
pythonは通常がlocalなのでできるだけglobalを使用したくないと考えています。

無理な要望ではあるかと思いますが、知っている方教えていただきたいです。
宜しくお願い致します。

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

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

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

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

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

KojiDoi

2018/12/29 14:30

「関数外で同じ機能を果たせる」とは具体的にどういうことでしょうか。最終的に今のプログラムでできていない何をやりたいのかが全く見えません。
22Go

2018/12/29 14:33

今のプログラムの機能で満足しているのですが、できるだけglobalを使わずにこの機能を持つコードを書きたいと思ってます。
guest

回答3

0

returnで、戻り値で呼び出し側に返せば良いでしょう。
#追記
return命令の使い方:

Python

1def foo(): 2 x = 123 3 return x 4 5kekka = foo() 6print(kekka)

投稿2018/12/29 14:46

編集2019/01/06 11:05
otn

総合スコア84491

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

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

22Go

2019/01/02 00:46

どのように現コードに組み込んだらいいでしょうか?
hayataka2049

2019/01/02 01:12

提示されているコードにchange関数の呼び出し部分が書かれていないので、具体的な書き換え方法は誰も答えようがないと思います。
22Go

2019/01/02 01:27

globalを消してchange関数を呼び出したらいいのでしょうか?
hayataka2049

2019/01/02 02:12

あなたが質問に示しているコードではchangeは定義されただけで、どう使っているのかがわかりません。たぶん何らかのループで呼び出しているのだろうなぁと想像できる程度です。 なので、具体的な助言が得たいのなら、changeを呼び出して処理を行っている部分のコードを追記した方が良いです。
otn

2019/01/03 12:15

return max_len,max_protein,min_len,min_protein
22Go

2019/01/06 00:20 編集

with open("sequence.fasta.txt") as f: max_len = 0 max_protein = "" min_len = 1000000000000 min_protein = "" def change(protein, seq): global max_len,max_protein,min_len,min_protein seq_len = len(seq) if seq_len == 0: return else: print([seq_len]) if seq_len > max_len: max_len,max_protein,min_len,min_protein = seq_len,protein,seq_len,protein if seq_len < min_len: min_len,min_protein = seq_len,protein a_line = "" a_seq = "" for line in f: strip_line = line.rstrip() if strip_line.startswith(">"): a_line = strip_line change(a_line, a_seq) a_seq = "" print(strip_line+'\n') else: #A = [len(a_seq+strip_line)] a_seq += strip_line msg1 = "最大アミノ酸エントリ:" msg2 = "長さ:" msg3 = "最小アミノ酸エントリ:" print(msg1,max_protein,msg2,max_len) print(msg3,min_protein,msg2,min_len) このように下の方でもchange関数を使っているのですがこれで関数の使いたあってますでしょうか?
22Go

2019/01/06 00:22

return max_len,max_protein,min_len,min_protein はどの部分に組み込んだらいいでしょうか?
otn

2019/01/06 03:09

return命令の意味を復習しましょう。
22Go

2019/01/06 10:21

関数内で戻り値を使用することはわかったのですが、 global変数を使用しない場合、max_len,max_protein,min_len,min_protein はchange関数に組み込んでいいのでしょうか?
otn

2019/01/06 10:31

はい。関数の中のローカル変数にします。
22Go

2019/01/06 10:55

with open("short.sequ.txt") as f: max_len = 0 max_protein = "" min_len = 10000000000000 min_protein = "" def change(protein,seq,max_len,max_protein,min_len,min_protein): seq_len = len(seq) if seq_len == 0: return else: print([seq_len]) if seq_len > max_len: seq_len = max_len max_protein = protein return protein,seq,max_len,max_protein,min_len,min_protein if seq_len < min_len: seq_len = min_len min_protein = protein return protein,seq,max_len,max_protein,min_len,min_protein a_line = "" a_seq = "" for line in f: strip_line = line.rstrip() if strip_line.startswith(">"): a_line = strip_line change(a_line, a_seq,max_len,max_protein,min_len,min_protein) a_seq = "" print(strip_line+'\n') else: A = [len(a_seq+strip_line)] a_seq += strip_line msg1 = "最大アミノ酸エントリ:" msg2 = "長さ:" msg3 = "最小アミノ酸エントリ:" print(msg1,max_protein,msg2,max_len) print(msg3,min_protein,msg2,min_len) このように組み込んで見たのですが、 最後の部分が 最大アミノ酸エントリ: 長さ: 0 最小アミノ酸エントリ: 長さ: 10000000000000 となってしまったのですが、どのように修正したらいいでしょうか?
otn

2019/01/06 11:05

return命令の使い方を追記しました。
22Go

2019/01/06 12:11

ありがとうございます。 ですが、どうしてもうまく機能しませんでした。 理解できずに申し訳ありません。
22Go

2019/01/06 12:16

with open("short.sequ.txt") as f: max_len = 0 max_protein = "" min_len = 10000000000000 min_protein = "" def change(protein, seq,max_len,max_protein,min_len,min_protein): seq_len = len(seq) if seq_len == 0: return else: print([seq_len]) if seq_len > max_len: seq_len = max_len protein = max_protein return seq_len and protein if seq_len < min_len: seq_len = min_len protein = min_protein return seq_len and protein kekka = change(protein, seq,max_len,max_protein,min_len,min_protein) a_line = "" a_seq = "" for line in f: strip_line = line.rstrip() if strip_line.startswith(">"): a_line = strip_line change(a_line, a_seq) a_seq = "" print(strip_line+'\n') else: A = [len(a_seq+strip_line)] a_seq += strip_line msg1 = "最大アミノ酸エントリ:" msg2 = "長さ:" msg3 = "最小アミノ酸エントリ:" print(msg1,max_protein,msg2,max_len) print(msg3,min_protein,msg2,min_len) このようにしてみました
otn

2019/01/06 12:24

def add(x,y)のような、引数の2つの数値の和を返す関数を書いて、それを使って1+2の結果を求める というプログラムを書いてみてください。
22Go

2019/01/06 12:36

def add(x,y): a = x+y return a n = add(1,2) print(n) こういったものでしょうか?
otn

2019/01/06 12:56

そうですね。 ではなぜ、 change(a_line, a_seq,max_len,max_protein,min_len,min_protein) などと書いているのか?
22Go

2019/01/06 15:41

addの中身をifの条件にtrueのときだけ変えるには change(a_line, a_seq,max_len,max_protein,min_len,min_protein) にするしかないのではと考えてしまうのですが、、、、
otn

2019/01/14 12:10

changeの返り値を代入しないと意味がありません。 やはり、関数と返り値についての理解が足りていません。
guest

0

ベストアンサー

現在のコードのままという制約が厳しすぎて回答難しいのですが…
関数の引数としてリストや辞書を渡して、その要素値を変更する手法はどうででしょうか?

Python

1def change(protein, seq, ret): 2 # 略 3 if seq_len > max_len: 4 ret['max_len'],ret['max_protein'],= seq_len, protein,5 6ret = {} 7change(, ret)

投稿2018/12/29 14:53

編集2019/01/06 01:59
can110

総合スコア38256

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

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

22Go

2019/01/06 00:23

できるだけこのコードのままでありたいと思っているのですが手を加えても全然大丈夫です! リストや辞書も考えたのですがうまく応用ができなくて、、、やり方を教えていただけたらと思います。 宜しくお願い致します。
22Go

2019/01/06 02:56

with open("sequence.fasta.txt") as f: max_len = 0 max_protein = "" min_len = 10000000000000 min_protein = "" def change(protein, seq, ret): max_len,max_protein,min_len,min_protein seq_len = len(seq) if seq_len == 0: return else: a = [seq_len] print(a) if seq_len > max_len: ret["max_len"],ret["max_protein"],ret["min_len"],ret["min_protein"] = seq_len,protein,seq_len,protein K = {} change(protein, seq, ret) else: if seq_len < min_len: min_len,min_protein = seq_len,protein a_line = "" a_seq = "" for line in f: strip_line = line.rstrip() if strip_line.startswith(">"): a_line = strip_line change(a_line, a_seq) a_seq = "" print(strip_line+'\n') else: #A = [len(a_seq+strip_line)] a_seq += strip_line msg1 = "最大アミノ酸エントリ:" msg2 = "長さ:" msg3 = "最小アミノ酸エントリ:" print(msg1,max_protein,msg2,max_len) print(msg3,min_protein,msg2,min_len) このような感じで書き換えましたが change(a_line, a_seq) TypeError: change() missing 1 required positional argument: 'ret' のエラーが出てしまいました。 これはどのように対処したらいいでしょうか
can110

2019/01/06 03:03

回答コードと異なるようです。 具体的にはchangeにretを渡していないようです。 回答内容をご理解されてからご自身のコードに組み込むようお願いします。
22Go

2019/01/06 03:46

with open("sequence.fasta.txt") as f: max_len = 0 max_protein = "" min_len = 10000000000000 min_protein = "" def change(protein, seq, ret): seq_len = len(seq) if seq_len == 0: return else: print([seq_len]) if seq_len > max_len: ret["max_len"],ret["max_protein"],ret["min_len"],ret["min_protein"] = seq_len,protein,seq_len,protein if seq_len < min_len: min_len,min_protein = seq_len,protein ret = {} change(protein, seq, ret) a_line = "" a_seq = "" for line in f: strip_line = line.rstrip() if strip_line.startswith(">"): a_line = strip_line change(a_line, a_seq) a_seq = "" print(strip_line+'\n') else: #A = [len(a_seq+strip_line)] a_seq += strip_line msg1 = "最大アミノ酸エントリ:" msg2 = "長さ:" msg3 = "最小アミノ酸エントリ:" print(msg1,max_protein,msg2,max_len) print(msg3,min_protein,msg2,min_len)
22Go

2019/01/06 03:48

これであってますでしょうか? エラーの内容としては change(protein, seq, ret) NameError: name 'protein' is not defined なのですが、最初のdef changeでproteinは定義されていることにはならないのでしょうか?
guest

0

全てのデータを関数のパラメータとして渡すようにすればいい……というような話でしょうか。

投稿2018/12/29 14:42

KojiDoi

総合スコア13671

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問