【Python で占いゲーム】今日の運勢は??randintで星座占い♪

この記事では、

・乱数を使って星座を占う

・randintで1から12までの乱数を生成する

・if、elif、elseの分岐


・改行「 \n 」の使い方

について学べます。

私は「おうし座」ですので、変数seizaのところに「おうし」と入れました。
ここにあなたの星座やお好きな星座を入れてみて下さい。

まずは、乱数を使った順位の結果のみのコードを掲載いたします。

import random

seiza="おうし"

#1から12までの変数を生成
num=random.randint(1,12)

print("今日の"+seiza+"座は"+str(num)+"位です")

実行結果です。

乱数なので、実行する度に順位が変わります。
最後のprint文のところで、文字列の中で数値である順位のnumを扱う場合には、str(num)としています。

randintと似たようなもので、randrangeがありますが、これはrandom.randrange(1,12)の様に書いた場合には、12「未満」になります。

次に、順位に応じてメッセージを表示する様に、if,elif,elseで分岐を行います。
メッセージは変数msgに格納します。

では、コードです。

import random

seiza="おうし"

#1から12までの変数を生成
num=random.randint(1,12)

print("今日の"+seiza+"座は"+str(num)+"位です")

if num==1:
  msg="超超超超超超超超超・・・おめでとう!!\n"
elif num<=3:
  msg="チョベリグ!\n"
elif num<=9:
  msg="ふつー\n"
elif num==11:
  msg="チョベリブ!\n"
else:
  msg="がび〜〜〜〜〜〜ん\nチョベリバ(涙)\n"

print(msg)

実行結果です。

演算子についてですが、
例えば「num==1」とイコールを2つ書くことによって、その順位(1位)と等しいということを表しています。
=と、一つだけだと代入になりますので。

elif文のnum<=3は3位以下(この場合、2位と3位)を表しています。
elseでそれ以外(この場合12位)です。

msgの中の「\n」バックスラッシュとnで、改行を表しております。

宜しかったら上記のコードをコピペしてアレンジしてみて下さい。


msgの所で「チョベリなんとか・・・」ってありますけれど、かつて「コギャル」と呼ばれた方が女子高生だった頃に流行った言葉です。

チョベリグ・・・超ベリーグッド
チョベリブ・・・超ベリーブルー
チョベリバ・・・超ベリーバッド

だったかな。懐かしいな。


お疲れ様でした。ブレイクタイムPhotoは、

千葉県柏市、あけぼの山農業公園のひまわりです。

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

episode4 GAS【IFとループ】ヒソカの念チェック「HUNTER×HUNTERで覚えるGoogle Apps Script」

この記事のシリーズを読むことで、アニメHUNTER×HUNTER(ハンターハンター)を通してGAS(Google Apps Script)の最初の一歩が学べます。

この記事では、

・GASによるIF分岐とループでヒソカと同じ念系統か調べる

・配列で処理時間を短縮

・最後の行をgetLastRow()で求める

SpreadSheetApp→アクティブシート→アクティブセルと階層を辿ることによって処理時間がかかってしまうことを空の配列を用意することで解決する方法を掲載しています。

GASでは配列の扱いがとても重要になります。

ますは、前回(episode3)の復習をします。

・セルA1からB4にキャラクター名を入力する関数と消去する関数を作り、それぞれをボタンに登録しました。

//アクティブなスプレッドシートを選択するグローバル領域
const ss=SpreadsheetApp.getActiveSheet();


//スプレッドシートにキャラクターの名前と念系統の入った配列を出力する
function nenArray(){

  //二次元配列hhにキャラクターの名前と念系統を格納
  const hh = [
      ['ゴン','強化系'],
      ['キルア','変化系'],
      ['クラピカ','具現化系'],
      ['レオリオ','放出系']
    ];
  
  //配列hhをログに出力
  console.log(hh);

  //行の長さを調べる
  console.log(hh.length);

  //列の長さを調べる
  console.log(hh[0].length);

  //二次元配列hhを格納するために、スプレッドシートの4行2列を確保して出力する
  ss.getRange(1,1,hh.length,hh[0].length).setValues(hh);

}


//出力した配列を消去する
function myClear() {

  //出力した配列をgetDataRangeを使って取得して消去する
  ss.getDataRange().clear();

}

実行するとこの様になっていると思います。

ヒソカの念は「変化系」でキルアと一緒です。


今回はIF文を使って、ゴンからレオリオまでのキャラの念が、ヒソカと同じ変化系かどうか調べます。

ゴンは「強化系」なので「変化系」とは異なる為、条件が当てはまらないelseへと分岐します。

ゴンの念が入力されているセル「B1」は「1行目の2列目」ですので、(行,列)で書くと(1,2)と書くことも出来ます。

処理はelseになる為、隣のセルである「C1 (1,3)」には「XXX」と入力されます。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//【ゴン】がヒソカと同じ念系統か判定する関数
function Hisoka() {
  let nen = ss.getRange(1,2).getValue(); //ゴンの念を取得
  console.log(nen);
  
  //【ゴン】の念はヒソカと同じ「変化系」か?
  if(nen=='変化系'){
    ss.getRange(1,3).setValue('ヒソカと一緒');
  }else{
    ss.getRange(1,3).setValue('XXX'); //違うからこっちに分岐
  }
}

ログ出力です。
ゴンの念系統「強化系」が出力されました。

スプレッドシートです。
C1に「XXX」と入りました。


次に、「キルア」を調べます。

キルアは「変化系」なので、「ヒソカ」と同じという条件が当てはまり「ヒソカと一緒」と表示されます。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//【キルア】がヒソカと同じ念系統か判定する関数
function Hisoka() {
  let nen = ss.getRange(2,2).getValue(); //キルアの念を取得
  console.log(nen);
  
  //【キルア】の念はヒソカと同じ「変化系」か?
  if(nen=='変化系'){
    ss.getRange(2,3).setValue('ヒソカと一緒'); //同じだからこっちに分岐
  }else{
    ss.getRange(2,3).setValue('XXX'); 
  }
}

ログ出力です。

スプレッドシートです。
キルアの念はヒソカと同じなので、セルC2に「ヒソカと一緒」と入力されました。


次に、「クラピカ」を調べます。

クラピカは「具現化系」なので、「変化系」とは異なる為、条件が当てはまらないelseへと分岐します。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//【クラピカ】がヒソカと同じ念系統か判定する関数
function Hisoka() {
  let nen = ss.getRange(3,2).getValue(); //クラピカの念を取得
  console.log(nen);
  
  //【クラピカ】の念はヒソカと同じ「変化系」か?
  if(nen=='変化系'){
    ss.getRange(3,3).setValue('ヒソカと一緒'); 
  }else{
    ss.getRange(3,3).setValue('XXX'); //違うからこっちに分岐
  }
}

ログ出力です。

スプレッドシートです。
ヒソカとは念が異なるので、C3に「XXX」と入力されました。


最後に、「レオリオ」を調べます。
レオリオは「放出系」なので、ヒソカの「変化系」とは異なる為、条件が当てはまらないelseへと分岐します。

//アクティブなスプレッドシートを選択するグローバル(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//【レオリオ】がヒソカと同じ念系統か判定
function Hisoka(){
  let nen=ss.getRange(4,2).getValue();  //レオリオの念を取得
  
  //【レオリオ】の念はヒソカと同じ「変化系」か?
  if(nen=='変化系'){                      
    ss.getRange(4,3).setValue('ヒソカと一緒');
    }else{
    ss.getRange(4,3).setValue('XXX'); //違うからこっちに分岐
  }
}

ログ出力です。
レオリオの「放出系」が出力されました。

スプレッドシートではC4に「XXX」と出力してelseの処理を実行しました。


ここまでで、「なんだか同じような処理をしていて、それで一部だけを変更している」と言う感覚になられたと思います。

上記のコードで「i」の部分のみを変えています。
そこで、ゴンからレオリオまでを繰り返して調べられる、Forによるループを使います。

getRange(i,2)getValue(); //キャラの念を取得 
getRange(i,3)setValue(‘ヒソカと同じか違うか’)      

実はここまでの記事で、ループのトレースを行えておりました。

追加としては、

ゴン・・・i=1
キルア・・・i=2
クラピカ・・・i=3
レオリオ・・・i=4

と、変数が出てくるぐらいです。

なぜ「i」なのか、それは、ループで慣習的に使う変数として、「i、j、k」がよく使われるからです。

このことについては、「なぜ、新人つぶしのトンパさんは、トンパさんという名前なのか」と突き詰めてしまうことの様なものなので、ループではiとかを使うんだな、程度に捉えておりましたが、やはり気になって調べた所、分かりやすい記事を見つけました。

「i, j, k」ってなに?知っておきたいfor文の変数名の由来


ゴン〜レオリオまでメンバーは4人ですので、その人数を調べるために、変数Nに「getLastRow()」(最後の行)を調べて格納します。

最後の行…getLastRow();

以上を踏まえてループとIFを使ったコードを書くと、下記の様になります。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();


//【メンバー】がヒソカと同じ念系統か判定する関数
function Hisoka() {

  const N = ss.getLastRow(); //人数は変数Nに格納。この場合は4人
  console.log(N);

  for(i=1;i<=N;i++){
    let nen = ss.getRange(i,2).getValue(); //メンバーの念を取得
    console.log(nen);
  
    //【メンバー】の念はヒソカと同じ「変化系」か?
    if(nen=='変化系'){
      ss.getRange(i,3).setValue('ヒソカと一緒'); //キルアの場合
    }else{
      ss.getRange(i,3).setValue('XXX'); //キルア以外
    }
  }
}

ログ出力です。
スプレッドシートには同様に出力されております。

この「Hisoka」をボタンの「スクリプトを割り当て」でボタンに登録します。
ボタンを右クリックして3点リーダーから登録します。


また、下記のコードで、ヒソカと念が同じかどうか調べた範囲の判定結果を削除します。

//ヒソカチェックのクリア
function HisokaClear(){
  
  //行数を取得して変数Nに人数を格納
  const N=ss.getLastRow();

  ss.getRange(1,3,N).clear();
}

一旦ここまでのコードをまとめます。
人数の行数をは判定もクリアも同じ4人でNですので、グローバル領域に移動しました。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//行数(人数)を取得する
const N=ss.getLastRow();
// console.log(N); 確認済みなのでコメントアウトしました。


//【メンバー】がヒソカと同じ念系統か判定する関数
function Hisoka() {

  for(i=1;i<=N;i++){
    let nen = ss.getRange(i,2).getValue(); //メンバーの念を取得
    // console.log(nen); 確認済みなのでコメントアウトしました。
  
    //【メンバー】の念はヒソカと同じ「変化系」か?
    if(nen=='変化系'){
      ss.getRange(i,3).setValue('ヒソカと一緒'); //キルアの場合
    }else{
      ss.getRange(i,3).setValue('XXX'); //キルア以外
    }
  }
}

//ヒソカチェックのクリア
function HisokaClear(){
  
  ss.getRange(1,3,N).clear();
}

紫のボタン「ヒソカチェック」に関数「Hisoka」を、灰色のボタン「ヒソ消し」に関数「HisokaClear」それぞれスクリプトを割り当てます。

これで、ボタンを使って、判定したり消したりが出来る様になりました。
現在、ヒソ消しを押して、判定の列は削除してあります。


このままでも良いのですが、GASでループを使う場合、1回1回SpreadsheetAppからアクティブシートを辿ってしまうので処理に時間がかかってしまいます。

そこで、一旦B列4行分の各メンバーの念系統を配列arrayに格納します。
配列arrayには[[‘強化系’],[‘変化系’],[‘具現化系’],[‘放出系’]]が入ります。

また、そのメンバーの念系統がヒソカの変化系と等しいかどうかの判定結果を格納する配列judgeを用意します。
配列arrayには[[‘XXX’],[‘ヒソカと一緒’],[‘XXX’],[‘XXX’]]が入ります。

それぞれの空の配列を用意しております。

//【メンバー】の念を格納する配列を宣言
  let array=[];

//変化系と等しいか判定結果を入れる配列
  let judge=[];

配列arrayを使って、念系統がヒソカと同じ変化系かどうか調べて、その判定結果を配列judgeに格納する処理にループを用います。
また、judgeに格納するときにpushを使います。

この配列を使うことによって、スプレッドシートからアクティブシートに階層を辿って行く処理時間を短縮できます。

ここまでの処理について、ログ出力のところまでのコードを掲載致しました。
配列は0から始まるので、ループの条件部分を修正しました。

i=0、i<Nと変更してあります。

また、配列judgeに入れる際、スプレッドシートに出力するのに二次元配列の形にするので、と[ ]を付けて配列に追加しております。

judge.push([‘ヒソカと一緒’]) → ifでキルアの念系統の場合

judge.push([‘XXX’]) → elseでキルア以外のメンバーの念系統の場合


その部分のコードの抜粋です。

//【メンバー】の念はヒソカと同じ「変化系」か?
    if(array[[i]]=='変化系'){
      judge.push(['ヒソカと一緒']); //キルアの場合
    }else{
      judge.push(['XXX']); //キルア以外
    }

ここまでのログ出力までのコードです。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//行数(人数)を取得する
const N=ss.getLastRow();


//【メンバー】がヒソカと同じ念系統か判定する関数
function Hisoka() {

  let array= [];
  let judge = [];

  //B列の各メンバーの念を配列arrayに格納
  array=ss.getRange(1,2,N).getValues();
  console.log(array);

  for(i=0;i<N;i++){
   
    //【メンバー】の念はヒソカと同じ「変化系」か?
    if(array[[i]]=='変化系'){
      judge.push(['ヒソカと一緒']); //キルアの場合
    }else{
      judge.push(['XXX']); //キルア以外
    }
  }
  console.log(judge);

}

配列arrayとヒソカの念との比較のログを出力しました。

【配列array】


【配列judge】

この後、配列judgeをスプレッドシートのC列に4行分書き出します。
関数Hisokaにこの2行を加えたのみです。

//スプレッドシートC列4行分に判定結果の入った配列judgeごと入力する。
  ss.getRange(1,3,N).setValues(judge);

ここまでのコードをまとめました。

//アクティブなスプレッドシートを選択するグローバル領域(共通の処理)
const ss=SpreadsheetApp.getActiveSheet();

//行数(人数)を取得する
const N=ss.getLastRow();


//【メンバー】がヒソカと同じ念系統か判定する関数
function Hisoka() {

  let array= [];
  let judge = [];

  //B列の各メンバーの念を配列arrayに格納
  array=ss.getRange(1,2,N).getValues();
  console.log(array);

  for(i=0;i<N;i++){
   
    //【メンバー】の念はヒソカと同じ「変化系」か?
    if(array[[i]]=='変化系'){
      judge.push(['ヒソカと一緒']); //キルアの場合
    }else{
      judge.push(['XXX']); //キルア以外
    }
  }
  console.log(judge);

  //スプレッドシートC列4行分に判定結果の入った配列judgeごと入力する。
  ss.getRange(1,3,N).setValues(judge);
}

//ヒソカチェックのクリア
function HisokaClear(){
  
  ss.getRange(1,3,N).clear();
}

お疲れ様でした。ブレイクタイムPhotoは、

横浜の夜景です。
思わずこの歌を歌いたくなりました。

←episode3               episode5→

←GAS自作サンプル集へ戻る

HUNTER×HUNTERのGAS自作サンプル集のページに戻る
初めてのGASに戻る


自己紹介

【PythonのIF文】関西人度と関東人度診断をチェック

この記事を読むことで、

・IF文

標準入力


比較演算子


関数

の練習になります。

例として「関西人度、関東人度」診断を用います。

標準入力や比較演算子を使い、あなたの関東人ポイントがいくつで、関西人ポイントがいくつで、どちらが多いか比較して【関東人】または【関西人】を判定します。

コードのメンテナンス目的で関数の基本的な説明も掲載しました。

参考にした診断はコチラです。
あなたが「関東人」か「関西人」かを見極める10の質問 隠しても無駄だぞ!!

こちらをヒントにしてPythonでアレンジしてみました。

まず、私(東京都出身)がやってみたコチラの診断結果です。

この診断をPythonでプログラミングしてみました。
質問には半角の1か2を入れて回答するので標準入力を用います。
標準入力で数字を扱う場合は、このように記述します。

#標準入力で数字を入れる
ans=int(input())

これで、ansに標準入力で1または2の解答を入力します。
それでは、1つ分の診断プログラムを作成致します。

#関東人・関西人の質問
print("あなたが人に道を教える時は?")
print("1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#関東人・関西人の分岐処理
if ans==1:
  print("あなたは【関東人】です。")
elif ans==2:
  print("あなたは【関西人】です。")
else:
  print("半角数値の1か2を押して下さい。")

質問の部分のprint文に使われている「\n」は改行はです。
「\」のバックスラッシュは、macの場合は「option」+「¥」です。

また、

if ans==1:

と「==」としているのは、「=」一つだけだと代入になってしまうので、ansが1と等しいか判定する際には、「==」とイコールを2つ並べて書きます。

このコードでは、「あなたが道を教える時は?」と言う質問に対して、
「1:この横断歩道を渡って・・・」と答えるか、
「2:そこをガ〜〜〜〜って行って・・・」と答えるかで処理が分岐されます。
1または2の該当する方を選びますが、それ以外の回答を選んだ場合のメッセージも表示されています。

1を選んだ場合

2を選んだ場合

それ以外(999)などを押してしまった場合

質問が1つだけだと本当に関東人か関西人か分かりづらいので、関東に該当する答えを選んだ場合は、関東人ポイント(eastPoint)が加算され、関西に該当する答えを選んだ場合は、関西人ポイント(westPoint)が加算され、どちらが多いか比較するプログラムに改良してみます。

まず、この部分で各ポイントを0で初期化します。

#関東人、関西人ポイントの初期化
eastPoint=0
westPoint=0

また、「+=」と、加算代入演算子で使って加えています。

if ans==1:
  eastPoint+=1

また、トータルで関東人ポイントと関西人ポイントのどちらが多いかの計算結果による判定のコードはこちらになります。
同じ場合は「ハイブリッド」にしました。

#関東人か関西人かの判定
if eastPoint>westPoint:
  msg="\nあなたは【関東人】です。"
elif westPoint>eastPoint:
  msg="\nあなたは【関西人】です。"
else:
  msg="\nあなたは【ハイブリット】です。"

関東人か関西人かハイブリットかを変数msgに入れて、最後にprint文で出力することにより、printと書く分量を節約でき、コードが簡潔になりました。

それでは、質問1と質問2までのコードを掲載致します。

#関東人、関西人ポイントの初期化
eastPoint=0
westPoint=0


#質問1
print("質問1:あなたが人に道を教える時は?")
print("1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint+=1
elif ans==2:
  westPoint+=1
else:
  print("半角数値の1か2を押して下さい。")


#質問2
print("\n質問2:納豆は?")
print("1:「くさい!!!」\n2:「美味しい」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  westPoint+=1
elif ans==2:
  eastPoint+=1
else:
  print("半角数値の1か2を押して下さい。")

#関東人か関西人かの判定
if eastPoint>westPoint:
  msg="\nあなたは【関東人】です。"
elif westPoint>eastPoint:
  msg="\nあなたは【関西人】です。"
else:
  msg="\nあなたは【ハイブリット】です。"


print("あなたは"+msg+"\nあなたのeastPointは「"+str(eastPoint)+"」、westPointは「"+str(westPoint)+"」でした。")

関東人の場合の実行結果

関西人の場合の実行結果

ハイブリットの場合の実行結果

これでもプログラムは動くのですが、このコードをじっくりと眺めてみて、ちょっと冗長な部分がございました。

例えば、

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint+=1
elif ans==2:
  westPoint+=1
else:
  print("半角数値の1か2を押して下さい。")

と、それぞれのポイントを加算している箇所がございます。

今は質問が2つだけですが、今後質問が増える時にちょっとコードの量が多いので、ここの部分を関数にして見ました。加算するポイントを引数にして、関数add_pointで加算処理をしています。

#ポイントを加算
def addPoint(x):
  return x+1

xの中に加算するポイント(eastPointまたはwestPoint)を入れて、returnで1加えた値を戻り値としています。

呼び出し元です。

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint=addPoint(eastPoint)
elif ans==2:
  westPoint=addPoint(westPoint)

また、1か2以外の数字を入れた場合は、関数otherを定義しました。

#半角の1,2以外が押されてしまった場合
def other():
  print("半角数値の1か2を押して下さい。")

呼び出し元です。
(elseの所)

else:
  other()

更に、関東か関西か分岐をする処理の箇所で、この部分を関数judgeとして定義しました。

#判定
def judge(e,w):
  if e>w:
    return "\nあなたは【関東人】です。"
  elif w>e:
    return "\nあなたは【関西人】です。"
  else:
    return "\nあなたは【ハイブリット】です。"

判定の呼び出し元です。

#関東人か関西人かの判定
msg=judge(eastPoint,westPoint)

関数judgeを呼び出す際に引数として、eastPointとwestPointを入れて、戻り値としてmsgにポイントが多い方の文字列が入る様にしました。

流れとして、呼び出し元のeastPointが関数judgeの仮引数のeに入り、呼び出し元のwestPointが関数judgeの仮引数のwに入って、関東、関西、ハイブリッドの判定をして、その文字列を戻り値として呼び出し元のmsgに入ります。

ここまでをまとめたコードがこちらになります。

#関東人、関西人ポイントの初期化
eastPoint=0
westPoint=0

#ポイントを加算
def addPoint(x):
  return x+1

#半角の1,2以外が押されてしまった場合
def other():
  print("半角数値の1か2を押して下さい。")

#判定
def judge(e,w):
  if e>w:
    return "\nあなたは【関東人】です。"
  elif w>e:
    return "\nあなたは【関西人】です。"
  else:
    return "\nあなたは【ハイブリット】です。"


#質問1
print("質問1:あなたが人に道を教える時は?")
print("1:「この横断歩道を渡って・・・」\n2:「そこをガ〜〜〜〜〜って行って・・・」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  eastPoint=addPoint(eastPoint)
elif ans==2:
  westPoint=addPoint(westPoint)
else:
  other()


#質問2
print("\n質問2:納豆は?")
print("1:「くさい!!!」\n2:「美味しい」")
print("あなたの回答>>>>>",end="")

#標準入力で数字を入れる
ans=int(input())

#回答に応じて関東人、関西人ポイントをそれぞれに加算
if ans==1:
  westPoint=addPoint(westPoint)
elif ans==2:
  eastPoint=addPoint(eastPoint)
else:
  other()


#関東人か関西人かの判定
msg=judge(eastPoint,westPoint)


print("あなたは"+msg+"\nあなたのeastPointは「"+str(eastPoint)+"」、westPointは「"+str(westPoint)+"」でした。")


お疲れ様でした。ブレイクタイムPhotoは、

いたばし花火大会2025です。

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

【Pythonリスト占い】あなたは何八王子!? 何浦和!?

この記事を読むことで、

・Pythonのリストの基礎練習

・リストと乱数の組み合わせ

・IF文の復習

・改行の使い方

・数値と文字列を同時に表示

について占いゲーム感覚で学べます。

今回作るリストは、「八王子(東京の西の方)」と「浦和(埼玉県)」を例にして、
八王子占いと、浦和占いのリストです。

Pythonでリスト(配列)の添え字を乱数にして、「あなたは何八王子か」という
占い診断ゲームを作って行きます。

八王子には、

・西八王子駅
・北八王子駅
・京王八王子駅
・(ふつうの)八王子駅

があります。

以下、プログラムの手順です。

手順
1:乱数を使うためにランダムモジュールをインポートする
2:駅名のリストを用意する
3:リストの要素数(長さを調べる)
4:リストの添字の乱数を発生させて変数indexに代入する
5:結果を「あなたは【北八王子駅】です」などと言った形式で表示させる。

では、各手順ごとに見ていきます。

手順1:乱数を使うためにランダムモジュールをインポートする

import random

手順2:駅名のリストを用意する

station=['西','北','京王','(ふつうの)']

手順3:リストの要素数(長さを調べる)を変数numに格納

num=len(station)

このリストの場合は、要素数の長さが4になります。

手順5:リストの添字の乱数を発生させて変数indexに代入する

index=random.randrange(num)

ここで、randrangeを使うことで0からリストの長さ未満の乱数を発生させます。
この場合、リストの長さが4になりますので、0から3までの乱数が発生します。
リストのインデックスは0から始まりますので、最後の添字はリストの長さ-1になります。


手順5:結果を例えば、「あなたは【北八王子駅】です」と言った形式で表示させる。

print('あなたは【'+str(station[index])+'八王子駅】です。\n')

最後に改行して見やすくなるように、「\n」を入れています。
これは、「バックスラッシュエヌ」と読みます。
バックスラッシュの「\」は、Macでは「option」キーと「¥」を同時に押します。

ここまでのコードをまとめます。

import random

station=['西','北','京王','(ふつうの)']
num=len(station)
index=random.randrange(num)

print('あなたは【'+str(station[index])+'八王子駅】です。\n')

実行結果です。
このようにランダムに何八王子なのか出力されます。


このコードを少しアレンジして、次は埼玉県にある浦和駅占いを作ってみます。
浦和には、浦和駅の他に「浦和」が着く駅名は、

・北浦和駅
・東浦和駅
・西浦和駅
・南浦和駅
・武蔵浦和駅
・中浦和駅
・浦和美園駅

と、こんなにあるんですね。
埼玉あるあるですが、待ち合わせの時は、「何浦和駅なのか」確認が必要です。

そこで、上記の八王子のプログラムを少し変更して、浦和リストのコードを作成します。

変更したのは2点です。
まず、リストです。
長さが8のリストでstation[0],station[1]・・・,station[7]までになります。

station=['東','西','南','北','武蔵','美園','中','(ふつうの)']

先ほどの八王子の例と異なる点は、例えば北浦和、南浦和でしたら、浦和駅の前に「北」とか「南」が付きますが、「浦和美園駅」の場合は「美園」は浦和の後に付きます

その為、添字が5(くどいようですが、リストの添字は0から始まるので、リストの「6番目」である浦和美園駅は、添字は「5」になります。)の時を踏まえて下記の様にIFによる分岐する必要が生じます。

if index==5:#浦和美園駅の場合
  eki='【浦和'+station[index]+'駅】'
else:
  eki='【'+station[index]+'浦和駅】'

ここまでのコードをまとめます。

import random

station=['東','西','南','北','武蔵','美園','中','(ふつうの)']
num=len(station)
index=random.randrange(num)

if index==5:#浦和美園駅の場合
  eki='【浦和'+station[index]+'駅】'
else:
  eki='【'+station[index]+'浦和駅】'

print('あなたは'+eki+'です。\n')

実行結果です。

お疲れ様でした。ブレイクタイムPhotoは、

いたばし花火大会2025です。

ご精読誠にありがとうございました。

■ 独習Python ■
Kindle版
単行本(ソフトカバー)

Python自作サンプル集へ戻る

写真クリエイターとしての活動
自己紹介

モバイルバージョンを終了