Python入門サイトの説明不足で私は悪くありません。
私の理解力がないわけではありません。

定義、呼び出し、結果から推測するに
呼び出しの第二引数から変数=代入まで*argumentsに文字列が入ってますが
例えば*a,*bと関数を定義した場合どのように*aと*bの判断するのでしょうか?
def cheeseshop(*a,*b)
cheeseshop("aaaaaaa","iiiiiiiiii","uuuuuuuu","eeeeeeeee","oooooo")

**keywords(ポインタのポインタ)は変数名と文字列を引き込んでますよね?
keysで変数名を引き出しsortedで昇順ソート
そして、ここからが難解なのですが
for kw in keys:
print(kw, ":", keywords[kw])
kwにkeysの文字列を代入しているのはわかりますが
keywords[kw]はどんな動きをしているのですか?
最初のループではkeywords["Michael Palin"]ってことですよね?わけが分かりません。

明らかに前提知識が不足していますがpython3の入門サイトが
http://docs.python.jp/3/tutorial/controlflow.htm …
以外見つからず悪戦苦闘してます。


#定義
def cheeseshop(kind, *arguments, **keywords):
print("-- Do you have any", kind, "?")
print("-- I'm sorry, we're all out of", kind)
for arg in arguments:
print(arg)
print("-" * 40)
keys = sorted(keywords.keys())
for kw in keys:
print(kw, ":", keywords[kw])

#呼び出し!
cheeseshop("Limburger", "It's very runny, sir.",
"It's really very, VERY runny, sir.",
shopkeeper="Michael Palin",
client="John Cleese",
sketch="Cheese Shop Sketch")


#結果
-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch

このQ&Aに関連する最新のQ&A

A 回答 (3件)

ええと、まずは。



> **keywords(ポインタのポインタ)は変数名と文字列を引き込んでますよね?

引き込んでません。
と言うか、大前提として、Pythonには「ポインタ」がないのです(笑)。

実はこの * とか ** とか言うのはC言語で言うポインタじゃなくって、可変長引数とその仲間だ、と言う意味です。

*の使用例:

>>> def foo(*a):
    return a

>>> foo(1, 2, 3, 4, 5)
(1, 2, 3, 4, 5) # a に与えられた引数はタプルとして表現される
>>>

上のように、引数aを指定してても、これは*で可変長引数だ、と言ってるので、引数は(理論上は)何個でもツッコんで大丈夫だ、って事です。

一方、**は次のような「キーワード引数」(C言語にはない)と言う指定です。
これは、またもや「C言語だとわざわざ実装しなきゃいけない」ハッシュテーブル(Pythonでは辞書型と呼ぶ)への引数として機能します。

>>> def bar(**b):
    return b

>>> bar(教えて="goo", OK="WAVE")
{'教えて': 'goo', 'OK': 'WAVE'} # Pythonのハッシュテーブルの表記

教えて="goo"と言う指定がハッシュテーブルのキー、'教えて'とその値'goo'、OK="WAVE"と言う指定が'OK'と言うハッシュテーブルのキー、'WAVE'がその値になってるのが分かるでしょうか。

この辺は次の部分をお読み下さい。

キーワード引数:
http://docs.python.jp/3/tutorial/controlflow.htm

任意引数リスト:
http://docs.python.jp/3/tutorial/controlflow.htm

> for kw in keys:
   print(kw, ":", keywords[kw])
> kwにkeysの文字列を代入しているのはわかりますが
> keywords[kw]はどんな動きをしているのですか?

んー、なるほど、ちょっとC言語なんかに比べるとちょっと高度な事やってるかもしれませんね。
まず大前提としては。構文は似てるんですが、PythonのforはC言語のforとはちょっと違うんです。こいつはイテレータ(繰り返し機能)を呼び出しす役目を担っていて、実は「繰り返し要素」を持ってるのはデータ型(この場合はkeysと言うリスト)に含まれてる「イテレータ」の方なんですね。

先ほど見ましたが、Pythonでのハッシュテーブル、辞書型自体が「イテレータ」としての情報を持っています。
キーワード引数によって与えられた引数は、このコードの場合、内部的には次のような「辞書型」を持つようになっています。

keywords = {'shopkeeper': 'Michael Palin', 'client': 'John Cleese', 'sketch': 'Cheese Shop Sketch'}

Cでハッシュテーブルの実装経験があるのでしたら、先ほどにも説明した通り、

キー: 値

の組が3つ、keywordsと言うハッシュテーブルに入っています。
ここからキーだけを取り出すメソッド(C++で言うとメンバ関数)が、keys()です。

>>> keywords.keys()
dict_keys(['shopkeeper', 'client', 'sketch'])

ハッシュテーブルのキーだけが取り出されていますね。
んで、ハッシューテーブルは、繰り返しますが、Cでの実装経験がおありでしたら、「データの格納方法」はアルゴリズム上での「任意」で、順番は保証されていません。これは検索用データ構造、って前提から言ったらオーケーで、要は検索して速く値を返すのがハッシュテーブルの本懐で、「データ格納の順番は重要ではない」と言う事の裏返しです。
従って、キーを取り出してもそいつが「アルファベット順に整然とならんでる」保証がないんですね。だからソートしてるんです。

>>> keys = sorted(keywords.keys())
>>> keys
['client', 'shopkeeper', 'sketch']

そして、Pythonでのハッシュテーブルでの値の取り出し方、です。
これはCの配列の参照のような形式で書きます。

>>> keywords['client']
'John Cleese'
>>> keywords['shopkeeper']
'Michael Palin'
>>> keywords['sketch']
'Cheese Shop Sketch'
>>>

ハッシュテーブルkeywordsにキーを与えたらその値が返ってきてるのが分かるでしょう。
そうすれば、

keys = sorted(keywords.keys())
for kw in keys:
  print(kw, ":", keywords[kw])

と言うのは

1. キーワードからキーだけ取り出して、アルファベット順にソートしたリストkeysを作る
2. リストkeysに含まれてる要素(取り敢えずkwと呼ぶ)に対して

  「keysに含まれる要素(kw), ":" ハッシュテーブルからkwに対する値を呼び出し」

を順繰りに印字せよ

となってるのが分かるのではないでしょうか。

多分Pythonのハッシュテーブル(辞書型)にも慣れてない感じがするんで、次のページを参考にしてください。

辞書型:
http://docs.python.jp/3/tutorial/datastructures. …

> 明らかに前提知識が不足していますがpython3の入門サイトが
> http://docs.python.jp/3/tutorial/controlflow.htm
> 以外見つからず悪戦苦闘してます。

では次のサイトを紹介しておきます。

Dive Into Python 3 日本語版:
http://diveintopython3-ja.rdy.jp
    • good
    • 1

冗談がお好きなようですねw



> Python入門サイトの説明不足で私は悪くありません。
> 私の理解力がないわけではありません。

> 例えば*a,*bと関数を定義した場合どのように*aと*bの判断するのでしょうか?

疑問に思われていらっしゃるとおり、判断できません。そのため、そのような定義は禁止されています。

これについては、問題の箇所の直後の「4.7.3. 任意引数リスト」に、

> 通常このような 可変 引数は、関数に渡される入力引数の残りを全て掬い取るために、仮引数リストの最後に置かれます。
> *args 引数の後にある仮引数は ‘キーワード専用’ 引数で、位置指定引数ではなくキーワード引数としてのみ使えます。

と明記されています。
    • good
    • 0

ちょっと聞いてみよう.



「最初のループではkeywords["Michael Palin"]ってことですよね」のところは, 何をどう考えた結果としてそのような結論になったんでしょうか?
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QASP,net,cgi,javascript,php等の技術

ASP,net,cgi,javascript,php等の技術で、Webアプリケーションを開発するに当って
どれで作成したほうがいいですか?

機能としては、顧客管理、掲示板、グラフ表示、データベースアクセス等の機能を使います。

それぞれの言語で作成するあたって、長所と短所を頂けると幸いです。

Aベストアンサー

・ASP
確かに古いですが、まだASPで動いているサイトはけっこうあると思います。性能面はCGIよりはいいのではないでしょうか。
IISでしか動作しないのが欠点です。

・.net
よく知りません。確かに古いASPよりはASP.netの方がいいかもしれ
ません。最近少しみかけるようになりました。
拡張子 aspx のサイトはこの作りですね。

・cgi
効率が悪いのでやめた方がいいと思います。ただ、いまだに一番
よく使われていると思います。自身でサーバが管理できないプロ
バイダのサーバにおくような場合はこれ以外の選択肢はないかも
しれません。

・javascript
通常はクライアント側で使う言語ですが、サーバ側で使うことも
あり得ます。たとえば、ASPでは、VBScriptの代わりにJavaScript
を使うこともできます。使って何のメリットがあるかは、よくわかり
ません。たとえば、ASPではVBScriptを使った方が動作は早いと
思います。

・PHP
よく知りません。

・あとはサーブレット・JSPも候補にあげた方がいいですね。
特に欠点もなく、無難に何でもこなせると思います。

・ASP
確かに古いですが、まだASPで動いているサイトはけっこうあると思います。性能面はCGIよりはいいのではないでしょうか。
IISでしか動作しないのが欠点です。

・.net
よく知りません。確かに古いASPよりはASP.netの方がいいかもしれ
ません。最近少しみかけるようになりました。
拡張子 aspx のサイトはこの作りですね。

・cgi
効率が悪いのでやめた方がいいと思います。ただ、いまだに一番
よく使われていると思います。自身でサーバが管理できないプロ
バイダのサーバにおくよう...続きを読む

Qいったい,,,,.NETって。。。

質問タイトルがあまりにプアでごめんなさい。素人なもんで。。。。。
MS .NETって、端的にいって何ができるの?何が違うの?アプリケーションの開発環境が向上しただけ?例えば、VB6で作ったアプリでは動作不可能だったことが、.NET環境では可能になるとかあるんですか?

あとWinXPの管理ツールをみると、MS.NET Framework1.1 xxxxxがありますけど、何に使うの?

Aベストアンサー

>アプリケーションの開発環境が向上しただけ?

その認識でいいと思います。
開発側からすると大きな違いです。
ユーザのメリットとしては、ソフトの品質が上がり、安くなる。
# 現状はそうでもないか

新しく出来ることは、ノータッチデプロイメントぐらいですかね。

QInvalid procedure call or argument エラー発生時の対応

Run-time error '5':
Invalid procedure call or argument

作成中のエクセルマクロ(xls)で、上記エラーが発生しました。
日本語版PCでは問題ないのですが、英語版PCでは上記エラーが出ております。

日本でも海外でも両方で使えるように仕組みを改修したいのですが、何かいい方法はありませんでしょうか。

インターネットで検索したところ、「現地の言語設定を日本語に変更すればよい」という記述を数件確認したのですが、現地の言語設定は変更せずに現地のままでエラー解消できる方法を探っています。
(現地いわく、何故このマクロの為に言語設定を日本語に変えないのいけないのかと・・まぁそれもそうかと)

どんな内容のご回答でも結構です。何かヒントになることでも結構ですので、アドバイスください。
困っています。。

Aベストアンサー

>「現地の言語設定を日本語に変更すればよい」
VBAにとっては、日本語は、単にユーザーフレンドリーという役割でしかないと思います。私の持っているVBAエラー表は英語です。

日本語に変える必要はまったくないと思います。ただし、日本語/2バイト文字を扱うならば、ちょっと事情が違ってきますが。

Invalid procedure call or argument
プロシージャの呼び出し、または引数が不正です。

と読めませんか?そして、引数に数値を入れるところなのに、文字列(2バイト文字)が入ってしまった場合などに発生します。さしずめ、全角空白ということろでしょうか。

Qruby "\001\376".unpack("C*") => [1, 254]の意味

"\001\376".unpack("C*") => [1, 254] の
[1, 254]ってどういう数字を意味するのですか?8ビット整数なのに配列で結果が出ていることの意味がわかりません。ご教授ください。

Aベストアンサー

"\001\376"
は、バイナリ文字列で
"C*"

バイトとして数値を取り出し配列にする
ということだと思います。
\376は、8進数で、10進にすると254になります。
見当違いだったらすみません。

Q[TeX,DVI,PS,PDF]

エラーが出て読み込めないepsファイルがあります。
どうすればいいでしょうか?
そもそも「endobj」とは何でしょうか?

** WARNING ** Didn't find "endobj".
** WARNING ** Failed to include image file "./421.eps"
** WARNING ** >>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]
** WARNING ** pdf: image inclusion failed for "421.eps".
** WARNING ** Failed to read image file: 421.eps
** WARNING ** Interpreting special command PSfile (ps:) failed.
** WARNING ** >> at page="17" position="(178.298, 728.302)" (in PDF)
** WARNING ** >> xxx "PSfile="421.eps" llx=16 lly=22 urx=797 ury=986 rwi=7810 "

●GSViewはEncapsulated Postscriptの仕様で定義された「一行が255文字以下」を満たしていないという理由を掲示した上で表示してくれたが、dvioutでは画像は表示されなかった。

●EPSファイルは、VisioのオブジェクトをAdobe Distiller Jにかまして作られたものだと思われる。
ここでエラーが出るせいなのかわからないが
このEPSファイルが貼り付けられたTeXファイルをコンパイルしたDVIではすべて前にある画像(JPEGをjpeg2psでPSに変換して作成)となっている。

こうして出来た(?)dviファイルをdvipdfmxに通して作られたPDFではそれらの画像(同様の方法を用いて作られたPSファイルを含む)は表示されているが、該当エラーが発生した画像は表示されなかった。

エラーが出て読み込めないepsファイルがあります。
どうすればいいでしょうか?
そもそも「endobj」とは何でしょうか?

** WARNING ** Didn't find "endobj".
** WARNING ** Failed to include image file "./421.eps"
** WARNING ** >>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]
** WARNING ** pdf: image inclusion failed for "421.eps".
** WARNING ** Failed to read image file: 421.eps
** WARNING ** Interpreting special command P...続きを読む

Aベストアンサー

>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]

それで確認しましたか?ここが最重要です.
endobj というのは読んで字のごとく,
オブジェクトの終端でしょう.
この手のエラーがでるのはEPSそのものが不正,
もしくはghostscriptがPDFに変換できないということで
はっきりいうとそのEPSに問題があるのです.

dvioutはEPSを表示する際にghostscriptを使うので
dvioutでも画像が表示できないということなら
ますますgsで変換できないものなのでしょう.
(注意:gsで変換できないのと表示できないは別のことです
gsで表示できるものが他の形式に変換できるかは別問題です)

visio由来のEPSはいろいろと問題を起こします.
大抵の場合はフォント周りで問題が発生します.

Ditillerをお持ちならdvipdfmxを使わなければ
うまくいくかもしれません

もしかするとghostscriptのバージョンをあげたりすると
うまくいくかもしれませんが・・・根本的には
EPSそのものを修正するしかありません.

>[コマンドを打って正常にPDFに変換できるか確認しろというメッセージだが長くて質問文に入らないので略]

それで確認しましたか?ここが最重要です.
endobj というのは読んで字のごとく,
オブジェクトの終端でしょう.
この手のエラーがでるのはEPSそのものが不正,
もしくはghostscriptがPDFに変換できないということで
はっきりいうとそのEPSに問題があるのです.

dvioutはEPSを表示する際にghostscriptを使うので
dvioutでも画像が表示できないということなら
ますますgsで変換できないものなの...続きを読む


人気Q&Aランキング

おすすめ情報