プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (3件)

ライブラリの関数を呼び出す場合



import モジュール名

モジュール名.関数名(・・・)

が基本。難しい言い方をすると
ローカルスコープにモジュール名が束縛されるのがこの書き方。

from モジュール名 import オブジェクト名

はモジュールからオブジェクト名を抜き出して
口一力ルスコープに束縛するもの。

使う時は 、関数名の場合
関数名(・・・)
と短くかけてよいのだが、
どのライブラリの関数だかわかりにくくなるし
モジュ―ル名という名前空間が無くなるので
関数名の衝突の危険もある。
#衝突しても上書きされるだけで警告は無し

特に、
from モジュ―ル名 import *
#モジュール内の全オブジェクトのインポート
は危険過ぎて使ってはいけないものとされてます。

普通は

import numpy as np

np.~

みたいに、モジュール名を短い別名でインポートして
使うことが多く、fromは
from モジュール名 import オブジェクト名 as 別名
というふうに別名で衝突の回避とわかりやすさを確保しつつ
使うことが多いですね。
ごく少数使うだけなら、別名要らないけど・・・

この辺、初心者用の説明がネットに腐るほどあるので
もっと詳しい使い方を学んだ方が良いと思う。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2022/09/30 12:12

> 何故、ソース1ではエラーが出ないのでしょうか?



それは、

> from random import random

と言う書式が

「randomモジュールからrandom関数だけ持って来い」

と言う意味だから、ですよ。
その書き方をした場合、Pythonはrandomモジュールから持ってきた、って事を覚えてるんで、モジュール名を付けなくてもrandomだけで関数だ、って事が分かるから、です。

おかしいな。この辺の話って入門書でフツーは書いてるんだけどねぇ。
モジュールの使い方の説明ページか名前空間の説明とか無いですかね?
「モジュール」あるいは「名前空間」で索引から調べてみてください。
    • good
    • 0
この回答へのお礼

ありがとうございました。よく理解できました。

お礼日時:2022/09/30 12:10

> 何故ソース2はエラーになるのでしょうか。



randomはモジュール名であって関数ではない。
従って、

print(random())

は間違い。
「randomモジュール内のrandom関数を使う」を意図するには

print(random.random()

にしないといけない。

# ソース2の正しい書き方

import random
N = 10
for _ in range(N):
 print(random.random())
    • good
    • 0
この回答へのお礼

ありがとうございます。
それでは、何故、ソース1ではエラーが出ないのでしょうか?
よろしくお願い申し上げます。

お礼日時:2022/09/20 17:44

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