• ベストアンサー

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
  • 回答数1
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

これ、実はかなり質問の仕方が悪くって(しょーがない部分もありますが)、と言うのも、「抜粋だ」ってのは分かるんですが、Pythonの話なのか何なのかかなり分かりづらいんですね。 大局的にはPythonの話なんですが、言語の問題と言うより使用ライブラリのせいで物凄く分かりづらいんです。 どうも見てるとSQL(データベースの問い合わせ言語)が絡んでるところを見ても、SQLite3か何かのライブラリを使用してるコードなんじゃないでしょうか。そうなるとPythonの問題かどうか切り分けが難しいし、再現して「何を返す」って言いづらいわけです。 それと、Pythonは現在2.7系と3.x系が並列に存在して使われてますんで、どっちを使用してるのか明言するように心がけた方が良いでしょう。 さて、*が何か、と言うのはそれはこちらを見てください。 4.7.4. 引数リストのアンパック: http://docs.python.jp/2/tutorial/controlflow.html#tut-unpacking-arguments つまり、冒頭でSynsetって名前のnamedtuple namedtuple: http://docs.python.jp/2/library/collections.html#collections.namedtuple を定義してるんですが、データベースから返してきた情報をfetchone()メソッドでシーケンス化して、そいつを*演算子でアンパック(要素を展開、と言えば良いんでしょうか)して引数としたnamedtupleであるSynsetを返してる、って事ですね。

remokon
質問者

お礼

返答ありがとうございます "*"の機能が”アンパック”という事が分かりました。 戴いた情報で調べてみます。 不明な点があったら、また質問します。 今後もおねがいします

関連するQ&A

  • python2.5を使用してSQLite3のデータベースを読み込みたいのです。

    いま、python2.5を使用してSQLite3のデータベースを読み込みたいのですが、うまく接続できません。pythonとSQLiteは単体ではうまく起動しているので、問い合わせ方に問題があるようなのですが、参考書のとおりに実行してもエラーが出てしまします。接続の書き方を教えていただければ幸いです。以下には、エラーが出た問い合わせを書きました。違うところがあれば指摘してください。 import sqlite3 con = sqlite3.connect("データベース名") cur = con.cursor() //ここまではうまくいきました。 cur.execute("""create table テーブル名(name text,age text)""") cur.execute("select * from テーブル名") print cur.fetchall()

  • python の引数についてですがですが、

    python の引数についてですがですが、 def sum (x1, x2=o, x3): return x1 + x2 + x3 これがなぜ文法上間違っているのかよくわかりません。よろしくお願いします。

  • 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 で SQL データベース

    こんにちは、現在Pythonにて、sqlite3を使ったデータベース作成の基本を勉強しているのですが、全く何がなんだかわからないとちょっと混乱した状況に陥ってしまったので、お助け頂きたく書き込みさせて頂きました。 先ず、サンプルを見て勉強しているのですが、 con = sqlite.connect(dbname) cur = con.cursor() cur.execute('SELECT City FROM Precipitation') すみません。親のファンクションが解らないです。 Pythonはhelp(Function name)で勉強ができるのですが、 sqlite.connect(dbname)でconに入ったのは、一体何属性の物なんでしょうか。正直、それぞれcur と con に入ったのが何属性のものか解らなければヘルプを使って勉強のしようも無く、立ち往生しています。 そもそも用語の使用が不適切ですみません。訳解らなかったらできるだけ付属しますので、お助け下さい。

  • 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 ver3について

    python3を勉強している初心者です。 参考書に載っていた、階乗を計算する例題を変更したいと思っています。 このプログラムを書き換えて、input文で任意の数字nをキーボードから入力して、結果を表示させたいんですが、どうすれば良いでしょうか。 このプログラムでは思う様に動きません。 n=input() def fact(n):   if n ==0:     return 1   return n*fact(n-1) print(fact(n)) input() よろしくお願いいたします。

  • Python勉強中の初心者です。

    只今、Pythonを勉強中です。オライリーの”初めてのPython”で勉強中なのですが途中で分からないところがあったので質問させてください。 >>>def min1 (*args): res = args[0] for arg in args[1:]: if arg < res: res = arg return res >>>print min1(3,4,1,2) 1 という参考が有り考えてたら訳が解らなくなってしまいツマづいていますでどういう流れで1になるのかわかる方アドバイスください。

  • 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プログラミングでエラー

    Pythonのプログラムを教科書をみながら勉強しはじめました。 バージョンは3.0.1です。 下記の初歩的なプログラムで#の行でエラーがでて対応方法が わかりません。 アドバイスいただけませんでしょうか。 #! /python30/python # coding:shift_jis ''' 簡単な電卓です。 Usage: mycalc.py n (+-*/) m ''' import sys, operator OP={'+':operator.__add__,\ '-':operator.__sub__,\ '*':operator.__mul__,\ '/':operator.__truediv__,\ } def calc(ls): assert len(ls)==3 #ここでエラー try: op=OP(ls.pop(1)) # 真ん中の文字列をpop,数字のみ残る。 x,y=[float(u) for u in ls] # 残った文字列をfloatに変換 except: print('Err:数字 演算子(+-*/) 数字 の順に引数をセットしてください。') sys.exit() return op(x,y) if __name__=='__main__': print(calc(sys.argv[1:])) #ここでエラー (ここで質問するとTABのインデントがなくなってしまうようです。)

  • pythonのコードで教えてください。

    def fizz_count(x):   count = 0 for item in x: if item == "fizz": count += 1 return count y = ["fizz","fizz" ,"cat"] print fizz_count(y) リスト”y"の中に含まれる "fizz"の個数をカウントして出力したいのですが、 上記のコーデはうまく行きません。 どこが間違っているのか、教えていただけないでしょうか?