- 締切済み
python:関数が複数globalを読むロジック
pythonの次のコードがあります #------------------------------------ #code default_name = "Ichiro" def kyodai1(name=default_name): return f"Hello {name}," def kyodai2(name=None): if name is None: name = default_name return f"Hello {name}." default_name = "Jiro" print(kyodai1(), kyodai2()) # 出力 # Hello Ichiro, Hello Jiro. #----------------------------------- kyodai2()関数では、 name = default_name とあり、default_nameは最初の行の"Ichiro"を呼ぶかと思ったら、関数の下にある"Jiro"を読みに行っています default_nameはglobal変数として default_name = "Ichiro" があるのに、def kyodai2()関数だけ default_name = "Jiro" を読みに行った理由がわからずにいます このロジックを3つのAIにコードを読ませて説明させたところ、うち1つが 「(kyodai2スコープ内で)default_nameが定義されていません。この場合、default_name = "Ichiro"ではなく、default_name = "Jiro"を参照します」 と答えました 質問: この説明が正しいかどうかもわからないのですが、なぜkyodai2()関数は、最初のIchiroではなくJiroを読みにいくのでしょうか? Tutolialで該当箇所がわからずにいます 【回答上のご注意】 回答は、解答(答え)を求めています わたしはプログラマーではないので、昭和的な「自分で考えろ」的なものは求めていません わからなければ答えない自由もあなたにはあります 不明点があれば説明いたします
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- cametan_42
- ベストアンサー率61% (154/250)
- chie65535
- ベストアンサー率43% (8548/19428)
- redslove10
- ベストアンサー率40% (372/918)
- chie65535
- ベストアンサー率43% (8548/19428)
- redslove10
- ベストアンサー率40% (372/918)
関連するQ&A
- pythonの関数内での関数の定義について
Python Cookbook 3rd の2章6節の内容でわからないことがあります。 コード import re #サンプルテキスト text = 'UPPER PYTHON, lower python, Mixed Python' #正規表現で文字のケースに合わせて置換する def matchcase(word) .....def replace(m): ..........text = m.group() ..........if text.isupper(): ...............return word.upper() ..........elif text.islower() ...............return word.lower() ..........elif text[0].isupper(): ...............return word.capitalize() ..........else: ..............return word .....return replace #実行分 re.sub('python', matches('snake'), text, flags=re.IGNORECASE) #実行結果 >>>'UPPER SNAKE, lower snake, Mixed Snake' このサンプルコードのmatchcase内のreplace関数に引数を渡していないと思うのですが、どのような仕組みでこのコードは動いているのでしょうか? m.group()とあるので実行分のre.sub(...)でのマッチしたという情報がreplace(m)のmに渡されているだろうとは思うのですが、なぜ引数を指定せずにそのようなことが起こるのかが理解できません。 何卒よろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- python: nonlocalとglobal文
pythonで次のような関数の書き方がチュートリアル本に書かれていました ------------------------------------------- スコープと名前空間の例 def scope(): loc = "abc" def do_local(): loc = "local" def do_nonlocal(): nonlocal loc loc = "nonlocal" def do_global(): global loc loc = "global" ------------------------------------------- VS Codeでブレークポイントを置き走らせ、 nonlocal loc → loc = "nonlocal" global loc →loc = "global" の代入(バインディング?)が起こることはわかりました チュートリアル本では、nonlocalとglobalは次のように書かれています 説明文 nonlocal文 その変数が自分を取り囲むスコープにある global文 その変数がグローバルスコープにある 質問; 上の2行(説明文)の 1)nonlocal文 その変数が自分を取り囲むスコープにある 2)global文 その変数がグローバルスコープにある これらのスコープが何、どこ、どのように、指しているか教えてください また 3)これらと名前空間の関係をわかりやすく教えてください (本ではわからず) 【回答上のご注意】 回答は、解答(答え)を求めています わたしはプログラマーではないので、昭和的な「自分で考えろ」的なものは求めていません わからなければ答えない自由もあなたにはあります 不明点があれば説明いたします
- 締切済み
- Python
- VBAからPythonを動かしたいのですが…
いつもお世話になっております。 icevainと申します。 python超初心者です。 【質問】 『VBAでPythonを動かす』という興味のあるサイトを見つけました。 https://qiita.com/O_LUPAN/items/1ceb5c950ff40f3558ab サイトのpythonコード #ここから import sys def sum(suji1, suji2): return suji1 + suji2 if __name__ == "__main__": argv = sys.argv suji1 = str(argv[1]) suji2 = str(argv[2]) total = sum(suji1, suji2) print(total) #ここまで サイトのpythonコードを無理やり変更して、 #ここから import sys def sum(suji1, suji2): rst="OK" return rst if __name__ == "__main__": argv = sys.argv suji1 = str(argv[1]) suji2 = str(argv[2]) total = sum(suji1, suji2) print(total) #ここまで OKがかえってくると思ったのですが、 0がかえってきてしまいます。 OKをかえすにはどうすればよいのかわかりません。 お分かりの方おりましたらご協力お願い致します。
- ベストアンサー
- Python
- python
pythonについての質問です。 def S_sa(k=1) for step in xrange(k) : if step == 0 : print 'a' else print 'b' というコードがあって、なぜかprint aが実行されるのはなぜでしょうか? xrangeのreturnは1ではないのでしょうか?
- 締切済み
- その他(プログラミング・開発)
- Pythonにて不明な部分
あるPythonコードからの抽出です。 Synset = namedtuple('Synset', 'synset pos name src') def getSynset(synset): print synset x = "select * from synset where synset='" + synset + "';" print x cur = conn.execute(x) return Synset(*cur.fetchone()) このgetSynsetを呼んだ時に、どのような内容が返されるか分かりません。 特に *cur の"*"は機能は何でしょうか。Cならポインタが指す内容ですが、Pythonにポインタは無いと思います。
- ベストアンサー
- Python
- pythonの問題を解くのを助けていただきたいです
スペースが2つ以上ある場合スペースを一つだけにする、そして文の最初と最後にスペースがあった場合そのスペースを消すというコードをこのコードをベースに書き換えていただくことは可能でしょうか? def removeExtraSpaces(theString): outSt = "" foundExtraSpaces = False for ch in theString: if ch = " ": foundExtraSpaces = True elif foundExtraSpaces == True: outSt += ch return outSt print(removeExtraSpaces(" Hello Joe ")) #この場合”Hello Joe”と出力されるはずです。
- 締切済み
- Python
- Pythonに詳しい方助けてください!
--------------------------------------------------- class Node: def __init__(self, x, bros = None, child = None): self.data = x self.bros = bros self.child = child def traverse(self, leaf): if self.data == leaf: yield [] else: child = self.child while child: for x in child.traverse(leaf): yield [self.data] + x child = child.bros --------------------------------------------------- Nodeクラスの一部を抜粋いたしました。 関数traverseが何をやっているのか知りたいのです。 Pythonの知識はほぼないですが、C++が多少分かるので、 C++に書き換えていただけると一番ありがたいです。 本当にすみません。 お分かりになる方いらっしゃいましたら教えて下さい。 ※インデントが重要と思われるPythonで投稿したらインデントが消えちゃいました。 画像を添付いたします。 本当にどうか助けてください. (;_;).
- ベストアンサー
- その他(プログラミング・開発)
- python print文のエラーがでます
#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import print_function import datetime class TZ(datetime.tzinfo): def __init__(self, name, offset): self.name = name self.offset = offset def utcoffset(self, dt): return datetime.timedelta(hours=self.offset) def tzname(self, dt): return self.name def dst(self, dt): return datetime.timedelta(0) def main(): path = '/sys/bus/w1/devices/28-000*********/w1_slave' with open(path) as f: data = f.read() temp = float(data[data.index('t=')+2:])/1000 FMT = '{},{:.1f}' JST = TZ('JST', 9) now = datetime.datetime.now(JST) print(FMT.format(now.strftime("%Y/%m/%d %H:%M:%S"), temp)) if __name__ == '__main__': main() とうってじっこうすると print(FMT.format(now.strftime("%Y/%m/%d %H:%M:%S"), temp)) の部分に SyntaxError: invalid syntax とエラーがでます。 どういうことなのか教えていただけるとうれしいです!
- 締切済み
- その他(プログラミング・開発)
- Pythonでのプログラミングについて。
Pythonでのプログラミングについて。 大学の授業でPythonが出たのですが、なんせ先生が適当すぎてさっぱり意味がわかりません・・; 以下の問題の答えか、もしくは解説してくれる方はいらっしゃいませんでしょうか。 Q1:オレンジの数(count)を受け取って、"Number of oranges:<count>"を返すorange関数(a)を書け。 ただし、countが10以上の場合は実際の値のかわりに"many"を使え。 def orange(count): (a) return str print orange(4) print orange(99) Q2:文字列を受け取って、最初と最後の各2文字から作成した文字列を返すboth_ends関数(b)を書け。 ただし、文字列の長さが1のときは空文字列を返せ。 def both_ends(coun): (b) return str print both_end("hello") print both_end("a") Q3:文字列を反転するプログラム(c)を書け。 orig="hello" (c) print result Q4:文字列を反転するreverse関数(d)を書け。 (d) orig="good" result=reverse(orig) print result Q5:キーボードから受け取った文字列が回文(palindrome)かどうか判定するプログラム(e)を書け。 (d) orig=raw_input("Type a phrease:") result=reverse(orig) (e) Type a phrease:alice reverse=ecila Type a phrease:anna **palindrome** 自分で本を読んだり色々調べてみたのですが、判りませんでした。。 今日の12時までなのですが、誰かお願いします(;_;)
- 締切済み
- その他(プログラミング・開発)
- pythonで実体参照文字を直す方法
pythonで以下のコードを使って実体参照、文字参照を直しているのですが「~」 など特定の文字がうまく直されませんどういうことでしょうか? python2.7です。 下のコードで4~6人を直すと46人になる。 文字参照とか実体参照とかhtmlentitydefsの使い方も詳しく分かってません。 その辺も総合して教えていただけるとありがたいです。 def sansyounaosi(text): # 正規表現のコンパイル reference_regex = re.compile(u'&(#x?[0-9a-f]+|[a-z]+);', re.IGNORECASE) num16_regex = re.compile(u'#x\d+', re.IGNORECASE) num10_regex = re.compile(u'#\d+', re.IGNORECASE) result = u'' g = 0 while True: # 実体参照 or 文字参照を見つける match = reference_regex.search(text, g) if match is None: result += text[g:] break result += text[g:match.start()] g = match.end() name = match.group(1) # 実体参照 if name in htmlentitydefs.name2codepoint.keys(): result += unichr(htmlentitydefs.name2codepoint[name]) # 文字参照 elif num16_regex.match(name): # 16進数 result += unichr(int(u'0'+name[1:], 16)) elif num10_regex.match(name): # 10進数 result += unichr(int(name[1:])) return result
- ベストアンサー
- その他(プログラミング・開発)
お礼
実際AIにコードを読ませたあと、実行させると Hello Jiro, Hello Jiro. と出したのがあったので、pythonではない言語の振る舞いではそうなるかなと昨日思っていました 同時にAIはglobal変数の多用は勧めないともいうので、これは問題集上の問題だなと思います ありがとうございます