List

<Code>

# Practice Project4

grid=[['.', '.', '.', '.', '.', '.'],
    ['.', 'O', 'O', '.', '.', '.'],
         ['O', 'O', 'O', 'O', '.', '.'],
         ['O', 'O', 'O', 'O', 'O', '.'],
         ['.', 'O', 'O', 'O', 'O', 'O'],
         ['O', 'O', 'O', 'O', 'O', '.'],
         ['O', 'O', 'O', 'O', '.', '.'],
         ['.', 'O', 'O', '.', '.', '.'],
         ['.', '.', '.', '.', '.', '.']

for x in range(len(grid)):

  for y in range(len(grid)):
    try:
      if y == len(grid)-1:
        print(grid[y][x])

      else:
        print(grid[y][x], end=' ')
    except IndexError:
      break

 

<Result>

.  .  O O . O  O  .  .
. O O O O O O O .
. O O O O O O O .
.  .  O O O O O  .  .
.  .  .  O O O  .  .  .
.  .   .  .  O  .  .  .  .

 

<Comment>

このListがどのような動きをするのかということは、結果からわかったので理解することが出来たが、このプログラム自体がなぜこのような結果をもたらすのかが理解できていない。2重for文の動きは簡単なコードを書いて確認することが出来た。

 

grid = [['.', '.', '.', '.', '.', '.'],
           ['.', 'O', 'O', '.', '.', '.'],
           ['O', 'O', 'O', 'O', '.', '.'],
           ['O', 'O', 'O', 'O', 'O', '.'],
           ['.', 'O', 'O', 'O', 'O', 'O'],
           ['O', 'O', 'O', 'O', 'O', '.'],
           ['O', 'O', 'O', 'O', '.', '.'],
           ['.', 'O', 'O', '.', '.', '.'],
           ['.', '.', '.', '.', '.', '.']]


for x in range(len(grid)):
  for y in range(len(grid)):
    print(x)
  break

print("----------"*5)

for x in range(len(grid)):
  for y in range(len(grid)):
    print(y)
  break

print("----------"*5)

for x in range(len(grid)):
  for y in range(len(grid)):
    print(grid[y][x])
  break

0
0
0
0
0
0
0
0
0
--------------------------------------------------
0
1
2
3
4
5
6
7
8
--------------------------------------------------
.
.
O
O
.
O
O
.
.
--------------------------------------------------

ただ、なぜこうなるという部分が理解できていないので、疑問を解消したい。

 

Automate the boring stuff/Practice Projects

この年で、初めてギックリ腰ならぬギックリ背中を経験し、勉強したくても出来ず、寝れない数日を過ごした。ストレートネックが原因で体を壊したらしい。もうあんな思いは嫌なので、トレーニングはもちろん普段パソコンを使用しているときや、スマホを触るときの姿勢にも気を使いたい。

 

<Code>

# Practice Projects

# Define collatz which has a parameter named number
def collatz(number):

if number%2==0:
return number//2
elif number%2!=0:
return 3*number+1

print("Enter number:")

 

# try~exception statement

try:
number=int(input())

 

# Parmanent repeat

while True:
if collatz(number)!=1:
number=collatz(number)
print(number)
else:
print("Success!")
break

except ValueError:
print("Type an integer, please.")

 

<Result of the execution>

*When I typed 3,this program ran like...

Enter number:
3
10
5
16
8
4
2
Success!

 

*When I typed string,this program ran like...

Enter number:
A
Type an integer, please.

 

このプログラムについては自分なりに理解が出来たが、全くプログラミングに関して知識がない人に教えることが出来るまで深い理解度にはまだ達していないのでこれからも試行錯誤を続けつつ複数のことを熟していきたい。

 

今度こそフローチャート

f:id:crown_666:20171012000421p:plain

name=""

while not name!="":
print("Enter your name:")
name=input()

print("How many guests will you have?")
numOfGuests=int(input())

if numOfGuests:
print("Be sure to have enough room for all your guests.")

print("Done")

 

この問題の答えがあるわけではないが、実際にこのプログラムのフローチャートはどのようになっているのか、フローチャートを見て理解しプログラムをつくることは可能なのか、を個人で検証するためにプログラムを参照し、フローチャートを作成した。

 

作成時に迷ったのは、while not name!="":の部分をどこに描けばよいのかということ、通常であれば、プログラム通りに描いていくのが筋であると考えていることが原因であると思う。

フローチャート

沖縄旅行にオズビジョンの一員として行ってきた。

とりあえず、団体で行ってあんなに楽しい旅行は初めてだった。

初日から、テンションFull-Maxで飲みすぎたのも初めて、旅行先での二日酔いも初めて、タンクトップでのサプライズ内定式も初めて(新卒としては、最初で最後...)、あんなに大勢の前でのカラオケも初めて、アクティブな旅行も初めてだった。

そんなに色々なことをすでに沢山経験させてもらっているし、いい人に囲まれている。ここまで頑張ってきてよかったと思う反面、内定式で宣言した通り、みんなをリードしていけるようなエンジニア(英語の話せるマッスルエンジニア)になるためにこれからのバイトや研究、遊び以外の空いた日は最低でも10時間程度は、エンジニアになるための勉強やビジネスの勉強に充てようと思う。

 

英語習得には1000時間かかるといわれていて、プログラミングの習得には300時間かかるといわれている。なので、この通りに進めることが出来れば、入社までにPythonを完璧に仕上げることが出来る!!!

また、それ以外にもアルゴリズムの勉強や、何かサービスもしくはアプリの開発などやり方は全然わからないけれど、成功するか完成できるかは置いておいて、やってみようと思う。しかし、目標は、どんなヘンテコなアプリでも完成させること。

それこそ、電卓で計算したら結果が全てランボーで返ってくる必ず受けて速攻飽きられてしまうアプリなんかでもいい。とりあえず、やろう!!!

 

オズビジョンに出会えて、心底良かったと思っています。

橋本さんには、ありがとう。と何度でも言いたいです!!!

またすぐに会えると思いますが、入社まで、入社後も、それより後でも、一緒に高めあっていける仲間でいようという言葉しっかり大切に刻んでおきます。

そのためには、越えていける勢いでこれからも前のめりで、ぶっとんで行こうと思います!!! 何事にも全力で!!!

 

本題ですが、今まであまりフローチャートを描いたことが無かったので意識して書くようにしています。なんか、プログラムの動きが分かりやすい。あ、そのためにあるのか。。。 以上です

 

これはたぶん題名を変えた方がよかったと思うが、エンジニアブログであり、勉強の軌跡を残すためなので、ご了承下さい。。。

基本の応用

AIとのチャットのプログラム作成で行き詰ってしまったので、初心に戻るために偶々見つけた無料でプログラミング学習教材を読むことが出来るサイトで、基本からの見直し。英語学習や筋トレと同じで、高いレベルに挑戦したら必ず壁や難題にぶち当たる。そこでそのレベルに挑み続けるというのも一つの手段だけれども、決して後ろを振り返るのではなく今まで手にしてきた地図に見落としはないのか再度確認しに戻る方が力になると思う。人間は、良い意味でも悪い意味でも欲深い生き物であるから、先へ急ごうとするけれども、そうするといずれガタが来る。そうならないためにも手にした地図を参考に行き来し、最強装備を手に入れて、先に進む。最強装備を手に入れる冒険に出かけている間にレベルアップするから、レベルは気にせずに、ひたすら自分を高めることに全力を尽くすのみ。

 

今回の作成プログラムの内容は、名前とパスワードが一致したらアクセスを許可したという一文を表示するというシンプルなものであったが、少し教材の内容を個人的に変更し正確に名前とパスワードを入力するまで、何度も確認し続けるものに変更して、フローチャートを作成した。

 

# This is just a program in order to check who you are.

print('Hello!')
print('What is your name?')
myName=input()
if myName=='Takuya':
print('Hi ' + myName + ' What\'s up?')
print('What is your password?:')

while myName!="Takuya":
print("Try again.")
myName=input()

if myName=="Takuya":
print('Hi ' + myName + ' What\'s up?')
print('What is your password?:')
myPassword=input()

if myPassword=="12345"':
print('Access Granted.')

while myPassword!='12345':
print('Wrong password.Try Again.')
myPassword=input()

if myPassword=='12345'

print('Access Granted.')

 

これで想像したものができあがった。これをさらに応用して、名前とパスワードを登録するプログラムを作成し、そのデータをデータベースに保存。そして、今回作成したようなプログラムとの関連付けを行い、データベースにアクセスし、登録内容との照合を行えばよくあるサインアップとログインのシステムが出来上がりそうだ。

人工知能(2)

<program>

class Dictionary:

def __init__(self):
self.random=
rfile=open('dics/random.txt','r',encoding='Shift-JIS')
r_lines=rfile.readlines()
rfile.close()

self.random=
for line in r_lines:
str=line.rstrip("\n")

if(str!=""):
self.random.append(str)

pfile=open('dics/pattern.txt','r',encoding='Shift-JIS')
p_lines=pfile.readlines()
pfile.close()
self.new_lines=

for line in p_lines:
str=line.rstrip("\n")

if(str!=""):
self.new_lines.append(str)

self.pattern={}

for line in self.new_lines:
ptn,prs=line.split("\t")
self.pattern.setdefault("pattern",).append(ptn)
self.pattern.setdefault("phrases",[]).append(prs)

 

<result>

ValueError: not enough values to unpack (expected 2, got 1)

 

前回の人工知能の記事での疑問点は解消し、かなり頭の悪い人工知能とのチャットを完成させることが出来た。その人工知能に感情を盛り込む勉強をしているが、エラーが出てきてしまい、解決が難しい。恐らく、プログラムの中にreturnか何かが1つ足りないことが原因だと思う。

 

前回の投稿からかなり期間が空いたが、その中で一つ気づいたことが。プログラムの問題は期間を空けて取り組むと解決することが多いなと思った。

人工知能

import tkinter as tk
from ptna import *
"""グローバル変数の定義
"""
entry = None
response_area = None
lb = None
action = None
ptna=Ptna("ptna")
def putlog(str):
  """対話ログをリストボックスに追加する関数
  @str 入力文字列または応答メッセージ
  """
  lb.insert(tk.END, str)
def prompt():
  """ピティナのプロンプトを作る関数
  """
  p=ptna.name
  if(action.get())==0:
    p += ":" + ptna.responder.name
  return p + "> "
def talk():
    """対話を行う関数
    ・Ptnaクラスのdialogue()を実行して応答メッセージを取得
    ・入力文字列および応答メッセージをログに出力
    """
    value = entry.get()
    #入力エリアが未入力の場合
    if not value:
      response_area.configure(text="なに?")
    #入力されていたら対話オブジェクトを実行
    else:
      #入力文字列を引数にしてdialogue()の結果を取得
      response = ptna.dialogue(value)
      #応答メッセージを表示
      response_area.configure(text=response)
      #入力文字列引数にしてputlog()を呼ぶ
      potlog("> " + value)
      #応答メッセージを引数にしてputlog()を呼ぶ
      putlog(prompt() + response)
      #入力エリアをクリア
      entry.delete(0, tk.END)
#==============================================================================
# 画面を描写する関数
#==============================================================================
def run():
  #グローバル変数を利用するための記述
  global entry, response_area, lb, action
  #メインウィンドウを作成
  root = tk.Tk()
  #ウィンドウのサイズを設定
  root.geometry("880x560")
  #ウィンドウのタイトルを設定
  root.title("Intelligent Agent : ")
  #フォントの用意
  font = ("Helevetica", 14)
  font_log = ("Helevetica", 11)
  #メニューバーの作成
  menubar = tk.Menu(root)
  root.config(menu = menubar)
  #「ファイル」メニュー
  filemenu = tk.Menu(menubar)
  menubar.add_cascade(label = "ファイル", menu = filemenu)
  filemenu.add_command(label = "閉じる", command = root.destroy)
  #「オプション」メニュー
  action = tk.IntVar()
  optionmenu = tk.Menu(menubar)
  menubar.add_cascade(label = "オプション", menu = optionmenu)
  optionmenu.add_radiobutton(
    label = "Responderを表示",
    variable = action,
    value = 0
  )
  optionmenu.add_radiobutton(
    label = "Responderを表示しない",
    variable = action,
    value = 1
  )
  #キャンパスの作成
  canvas = tk.Canvas(
    root,
    width = 500,
    height = 300,
    relief = tk.RIDGE,
    bd = 2
  )
  canvas.place(x=370, y=0)
  img = tk.PhotoImage(file = "img1.gif")
  canvas.create_image(
    0,
    0,
    image = img,
    anchor = tk.NW
  )
  #応答エリアを作成
  response_area = tk.Label(
    root,
    width = 500,
    height = 10,
    bg = "yellow",
    font = font,
    relief = tk.RIDGE,
    bd = 2
  )
  response_area.place(x=370, y=305)
  #フレームの作成
  frame = tk.Frame(
    root,
    relief = tk.RIDGE,
    borderwidth = 4
  )
  #入力ボックスの作成
  entry = tk.Entry(
    frame,
    width = 70,
    font = font
  )
  entry.pack(side = tk.LEFT)
  entry.focus_set()
  #ボタンの作成
  button = tk.Button(
    frame,
    width = 15,
    text = "話す",
    command = talk
  )
  button.pack(side = tk.LEFT)
  frame.place(x=30, y=520)
  #リストボックスを作成
  lb = tk.Listbox(
    root,
    width = 42,
    height = 30,
    font = font_log
    )
  #縦のスクロールバーを作成
  sb1 = tk.Scrollbar(
    root,
    orient = tk.VERTICAL,
    command = lb.yview
  )
  #横のスクロールバーを作成
  sb2 = tk.Scrollbar(
    root,
    orient = tk.VERTICAL,
    command = lb.xview
  )
  #リストボックスとスクロールバーを連動させる
  lb.configure(yscrollcommand = sb1.set)
  lb.configure(xscrollcommand = sb2.set)
  #grid()でリストボックス、スクロールバーを画面上に配置
  lb.grid(row = 0, column = 0)
  sb1.grid(row = 0, column = 1, sticky = tk.NS)
  sb2.grid(row = 1, column = 0, sticky = tk.EW)
  #メインループ
  root.mainloop()
#==============================================================================
# プログラムの起点
#==============================================================================
if _name_ == "_main_":
  run()
 
- 実行結果 -
Traceback (most recent call last):
  File "ptnaForm.py", line 179, in <module>
    if _name_ == "_main_":
NameError: name '_name_' is not defined
 
写経を続けたものの '_name_' が定義されていないので、エラーで返って来ているのは理解できるが、問題はどのように定義したらいいのかという事。エラーの改善法を頑張って見つけたいと思います。