Pythonの初心者です。Google Colabで独習しています。書籍「ゼロから学ぶPythonプログラミング」の例題を実行しています。ライブラリrandom以下のプログラムなんですが、ソース1は動くのですがソース2はエラーで落ちます。ライブラリの宣言の仕方が違うのですが、何故ソース2はエラーになるのでしょうか。このエラーメッセージに意味するところは何でしょうか。本の中で、他の例題ではすべてソース2の宣言の仕方で、この例題だけがソース1の宣言の仕方になっていました。
よろしくお願い申し上げます。
<ソース1:正常に終了>
from random import random
N = 10
for _ in range(N):
print(random())
<ソース2:エラー>
import random
N = 10
for _ in range(N):
print(random())
-->TypeError: 'module' object is not callable
No.3ベストアンサー
- 回答日時:
ライブラリの関数を呼び出す場合
import モジュール名
モジュール名.関数名(・・・)
が基本。難しい言い方をすると
ローカルスコープにモジュール名が束縛されるのがこの書き方。
from モジュール名 import オブジェクト名
はモジュールからオブジェクト名を抜き出して
口一力ルスコープに束縛するもの。
使う時は 、関数名の場合
関数名(・・・)
と短くかけてよいのだが、
どのライブラリの関数だかわかりにくくなるし
モジュ―ル名という名前空間が無くなるので
関数名の衝突の危険もある。
#衝突しても上書きされるだけで警告は無し
特に、
from モジュ―ル名 import *
#モジュール内の全オブジェクトのインポート
は危険過ぎて使ってはいけないものとされてます。
普通は
import numpy as np
np.~
みたいに、モジュール名を短い別名でインポートして
使うことが多く、fromは
from モジュール名 import オブジェクト名 as 別名
というふうに別名で衝突の回避とわかりやすさを確保しつつ
使うことが多いですね。
ごく少数使うだけなら、別名要らないけど・・・
この辺、初心者用の説明がネットに腐るほどあるので
もっと詳しい使い方を学んだ方が良いと思う。
No.2
- 回答日時:
> 何故、ソース1ではエラーが出ないのでしょうか?
それは、
> from random import random
と言う書式が
「randomモジュールからrandom関数だけ持って来い」
と言う意味だから、ですよ。
その書き方をした場合、Pythonはrandomモジュールから持ってきた、って事を覚えてるんで、モジュール名を付けなくてもrandomだけで関数だ、って事が分かるから、です。
おかしいな。この辺の話って入門書でフツーは書いてるんだけどねぇ。
モジュールの使い方の説明ページか名前空間の説明とか無いですかね?
「モジュール」あるいは「名前空間」で索引から調べてみてください。
No.1
- 回答日時:
> 何故ソース2はエラーになるのでしょうか。
randomはモジュール名であって関数ではない。
従って、
print(random())
は間違い。
「randomモジュール内のrandom関数を使う」を意図するには
print(random.random()
にしないといけない。
# ソース2の正しい書き方
import random
N = 10
for _ in range(N):
print(random.random())
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# pythonで外部のファイルを読み込む際のエラー 2 2022/04/12 19:22
- その他(プログラミング・Web制作) ラズパイ上の、pythonのエラーについて 1 2023/04/12 23:27
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- その他(プログラミング・Web制作) Pythonでエクセルファイルの列を指定してスライス 3 2022/08/28 17:35
- その他(プログラミング・Web制作) プログラミングについて(Python) 添付した画像はC言語で簡単に作ったソースで、1つの配列に5つ 3 2022/09/10 19:15
- その他(プログラミング・Web制作) pythonのWebスクレイピングでfind_allだとurlがNoneに 4 2022/04/17 18:21
- Ruby vscode 文字化け 1 2022/05/21 19:17
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAで#Regionに変わるものは無...
-
jsファイルの中身を確認したい…
-
generatorとは?
-
【VC++6.0(MFC)】Access Violat...
-
プログラム時のヘッダコメント...
-
#ifdef多用でソースが見づらい
-
c言語の改修されたソースから改...
-
HTMLソースの文字コードがutfの...
-
ソースの表示を無効にする方法。
-
Dreamweaverのコードカラーが黒...
-
HTMLソースを他人に見られない...
-
phpとaspの違い? 実力の違い?
-
aspファイルを修正する方法
-
ソースの追加行数と変更行数
-
HTML,JSの隠蔽
-
現在、開いているIEの子Window...
-
ホームページビルダーのソース...
-
「INT86(・・・・・・);」 っ...
-
Pythonのライブラリ、randomに...
-
▲▲HTML/CSSでのリスト作成▲▲以...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで#Regionに変わるものは無...
-
プログラム時のヘッダコメント...
-
【VC++6.0(MFC)】Access Violat...
-
ソースの追加行数と変更行数
-
Dreamweaverのコードカラーが黒...
-
レストラン、英語のメニュー表記
-
JSPの実行結果をHTMLに変換
-
#ifdef多用でソースが見づらい
-
ソースの表示を無効にする方法。
-
generatorとは?
-
VBAでhtmlソースから特定の文字...
-
c言語の改修されたソースから改...
-
「INT86(・・・・・・);」 っ...
-
コメントが閉じてないというエ...
-
jsファイルの中身を確認したい…
-
borderの下線が表示されない
-
画像と文字が重なって表示される。
-
VisualBasicがインストールされ...
-
htmlでソースを表示させたくな...
-
innerHTML で表示変更した時の...
おすすめ情報