VBA別館・Python別館

22958

Python 英単語帖を作る - Tak

2018/10/17 (Wed) 09:10:26

いままで習ったことを使って英単語帖を作ります。

codeは次のようになります。 今回はPython Shellを使います。 

-------------------------------
import random

rum=random.randrange(1,6)

e_word = ['gaunt', 'ransack', 'clarion', 'chasm', 'diffidence', 'desolation']
j_word = ['やせた', 'くまなく捜す', '明るく響き渡る', '(岩・地面の)深い割目', '自信のなさ, 内気, はにかみ, 遠慮', '荒廃(させること), 荒涼']

e_word = e_word[rum]
j_word = j_word[rum]
print(rum,e_word + ' ' + j_word)
-----------------------------------

一度保存してから、F5で処理します。 F5で何回も乱数に沿った単語が表示されます。

取敢えず、乱数で単語+意味が表示されます。 

Re: Python 英単語帖を作る - Tak

2018/10/21 (Sun) 10:29:14

② 単語帖から呼び出します

ここへ行きつくまで苦労しました。 覚えるというより、決まりきった処理の重ね合わせですので、本やネットから例文を頂きtesttestでした。

pythonに実際にcodeを書いてお試し下さい。 まずはエラーの連続になるはずです。 エラーが出た時が覚えるチャンスです。

・次のような単語帖(textファイル)を作ります。
 cat 猫
 dog 犬
 spring 春
 summer 夏
 autom 秋
 winter 冬

・pythonのnew fileを作り、次のcodeを書きます。
#------------------
 import random

def read_words():
# file = open("names2.txt", "r", encoding="utf_8")
file = open("word2.txt") #, "r", encoding="utf_8")
lines = file.readlines()
file.close()

e_words = []
j_words = []

for line in lines:
line = line.rstrip("\n")
name = line.rsplit(" ")
if len(name) == 2:
e_words.append(name[0])
j_words.append(name[1])
return [e_words, j_words]

def show_data(num, e_words, j_words):
e_word = e_words[num]
j_word = j_words[num]
print(e_word + " " + j_word)

words = read_words()
e_words = words[0]
j_words = words[1]

while True:
x = input("Enter for next word.(終了するなら exit を入力)")
if x == 'exit':
break

num = random.randrange(0, 6)
print(num)
show_data(num, e_words, j_words)
#-------------------------

・これを実行すると図の様な表示が出ます。

codeの説明は次回。

掲示板の都合が悪く二三日止りましたが、今後とも宜しくお願い致します。

Re: Python 英単語帖を作る - Tak

2018/10/21 (Sun) 15:39:11

③ codeの説明

#以下はコメントです。

#------------------
import random  #乱数発生関数を使用するため、python書庫から手元に出しておく

def read_words(): #def 関数宣言、ここではread_words()と言う関数を作っている

file = open("word2.txt")  #word2.txtを開く
lines = file.readlines() #word2.txtを一行一行読み込む
file.close() #読み終わったらfileを閉じる

e_words = [] #e_wordと言うリスト(配列)を作る、まだ何も入っていない
j_words = [] #j_wordと言うリスト(配列)を作る、まだ何も入っていない

for line in lines: #読み込むlineに次の処理を行う(上のlinesからlineに読み込む)
line = line.rstrip("\n") #文字列の段落、折り返しをする
name = line.rsplit(" ") #文字列の段落、折り返しをする

if len(name) == 2: #もしnameのデータが二つあれば、次の処理を行う
e_words.append(name[0]) #データの最初の項[0]をe_wordsへ追加する
j_words.append(name[1]) #データの次の項[1]をj_wordsへ追加する
return [e_words, j_words] #その情報を先のe_word[],j_word[]へ持ち帰る

def show_data(num, e_words, j_words): #show_dataという関数を作る(乱数num、eとj_word))
e_word = e_words[num] #e_wordsリストの乱数番目の英単語をe_wordsへ格納する
j_word = j_words[num] #j_wordsリストの乱数番目の日本語をj_wordsへ格納する

print(e_word + " " + j_word) #e_wordとj_wordを半角スペースをいれて表示する(ここは全角スペースでもOK)

words = read_words() #次の三行はインデントを入れないこと。入れるとpythonの文法でエラーとなる<---これには参った。
e_words = words[0] #理由は、変数のスコープ(効く範囲)が変わることらしい。
j_words = words[1] #上の二行は、全てのデータを入れなおしている(繰り返しに備えて)

while True: #「下のif文が出しい時は」と言っている
x = input("Enter for next word.(終了するなら exit を入力)") #input()で入力待ち
if x == 'exit': #exitと入力されたら、処理を完了してbreakでプログラムを終了する
break

num = random.randrange(0, 6) #0~5までの6個の乱数を発生する
print(num)  #0~5までの6個の乱数を発生する
show_data(num, e_words, j_words) #乱数、英単語、日本語の表示をする

#---------------------------

pythonを始めてから分かったことですが、大分他の言語とは違います。 今回分かったのは、codeの始まる位置でスコープの範囲が変わります。 スコープとは変数の適用範囲のことです。

だから、見かけ上すこし変なのですが、変数をshellの一番左に書けば、全体にその変数が使えるということです。 VBAではdim XXX as YYYと書いた部分でしか、有効ではありませんが、pythonではインデントをせずに左端にかけば、プログラム全体に有効と言うことらしいです。 

codeのindentは普通自動でpythonがやってくれます。また間違えていると、保存するとき警告が出ますが、全体に影響する変数の場合は、処理の段階でエラーとなります(プログラムの内容にもよると思いますが)

この問題解決に丸一日かかりました。

きょうはゆっくり眠れます。 お休みなさい。

名前
件名
メッセージ
画像
メールアドレス
URL
文字色
編集/削除キー (半角英数字のみで4~8文字)
プレビューする (投稿前に、内容をプレビューして確認できます)

Copyright © 1999- FC2, inc All Rights Reserved.