【Pythonループ】ループと論理和orで、「3時のヒロイン」登場!!

この記事は、Pythonのループを学習中で、「3時のヒロイン」さん(郷ひろみさんと一緒に「にしたんクリニック」のCMに出演している、吉本興業所属の芸人さん)をご存知の方、CMを見たことのある方を対象にしています。
電車でも広告を見かけます。

このCMですね。
「♪ た〜ん、たん、にしたん、たんたんた〜ん」
タンバリンを持って踊っている所が可愛いです。
そこで、Pythonでループを使って、3時と15時の時に3時のヒロインさんに登場して頂きます。

このループでは、range(24)で0時から23時まで表示させます。

論理和のorを使って、3時と15時の時にprint文を変えて3時のヒロインさんを登場させるだけのシンプルなループになっています。

print()

#3時と15時に「3時のヒロイン」を登場させる
for hour in range(24):
    if hour==3 or hour==15:
        print('\n\n<<<【'+str(hour)+'時】のヒロイン登場!!!>>>\n\n')
    else:
        print(str(hour)+'時')

print()

実行結果です。

3時のヒロインさんのプロフィールです。

最後までお読み頂きありがとにゃん(=^x^=)

■ 参考文献の紹介 ■
じっくり丁寧にPythonを学びたい方向けの書籍を紹介します。

Pythonを基礎から中級程度まで丁寧に学びたい方におすすめの書籍です。
まずはpaizaラーニングなどの学習コンテンツで1〜2巡(苦手な所は納得がいくまで何巡でも)してからこの本で学ぶと、自分の学習状況をブログなどでアウトプット出来るようになり、また、エラーなどの不明点を調べられる力もついていきます。

Python自作サンプル集へ
これからプログラミングを学ぶ方へ
プログラミングと資格へ
基本情報技術者試験トップへ
自己紹介

GASで「ねこあつめ」をChatworkにメッセージを装飾して送る「ねこあつめシリーズその15」

この記事では、GAS(Google Apps Script)で「ねこあつめ」をChatworkに送信する時に、メッセージを装飾して送る方法を掲載しています。

お世話になった記事は、いつも隣にITのお仕事さんの

【初心者向けGAS】チャットワークのメッセージ記法でBot送信するメッセージを装飾する方法

です。

今回の内容に入る前に、前回の復習をします。
前回はスプレッドシートの猫ちゃんの「なまえ」〜「とくちょう」までを配列として取得して、Chatworkに送ることによって、スプレッドシートのアクセス回数を格段に減らせました。

こちらのスプレッドシートです。

このスプレッドシートを元に、Chatworkに出力した画像とコードです。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body="";  //←ここで、bodyにA列、B列、C列のデータを追加していくので、bodyをletで変数として宣言
      body+=cat[0][0]+'\n';//A列:猫ちゃんの「なまえ」
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+=cat[0][2]+'\n';//C列:猫ちゃんの「とくちょう」
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){
  const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
  cw.sendMessageToMyChat(body);
}

今回の内容に入る前に、ねこあつめ画像で癒されます。

さて、今回の内容に入ります。

Chatworkにメッセージを送る際にタグを使って、メッセージを装飾します。
角カッコを使った、「メッセージ記法」という書き方を使ってコードを書いて行きます。

ここでは、メッセージを[info]というタグを使って囲い始め、水平の線を[HR]というタグで挿入して、丸カッコを使って体裁を整えて、[/info]で閉じます。

タグは、シングルクォーテーションで囲います。
「/」は、バックスラッシュではなく、普通のスラッシュです。

下記のコードで、14行目から17行目までにタグを入れてコメントを付けました。

//メインの関数でAmazonにDVDの注文をする
function myFunction() {
  const ss = SpreadsheetApp.getActiveSheet();
  let lastRow = ss.getLastRow();//最終行を取得
  const token=PropertiesService.getScriptProperties().getProperty('CW_TOKEN');//←ここを追加

  for (let i = 2; i <= lastRow; i++) {

    //もしもD列の「済」が空白だったらA列の「なまえ」を出力してD列を「済」にする
    if (!ss.getRange(i, 4).getValue()) {
      let cat=ss.getRange(i,1,1,3).getValues();//←配列catで一気に1行3列分のデータを取得する ※getValue[s]でsが付く

      //AmazonがDVDの注文を受け取る
      let body='[info]';  //←ここで、囲い枠線で装飾する
      body+=cat[0][0]+'[hr]';//←A列:猫ちゃんの「なまえ」に水平線を入れる
      body+=cat[0][1]+'\n';//B列:猫ちゃんの「しゅるい」
      body+='('+cat[0][2]+')[/info]';//←C列:猫ちゃんの「とくちょう」を送ったら囲い枠線を閉じる
      
      //ここでAmazonが宅配業者みたいなsendMessage関数にDVDの配達を依頼する
      sendMessage(token,body);
      ss.getRange(i, 4).setValue('済');

      //もしも最終行以上になったらセル範囲を消去する
      if (i >= lastRow) {
        ss.getRange(2, 4, lastRow - 1).clearContent();
      }
      break;
    }
  }
}

//宅配業者のようなsendMessage関数がAmazonからDVDを受け取って、配達を行う
function sendMessage(token,body){
  const cw=ChatWorkClient.factory({token:token}); //←APIトークンの所をtokenに置き換える
  cw.sendMessageToMyChat(body);
}

まずは1匹目の猫ちゃん、「ヘキサにゃん」

1匹目の「ヘキサにゃん」が「済」になりました。
他のコ達も送ってみました。

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

■参考文献の紹介■
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本を通してじっくり学べます。

サイトマップはこちらから

GASサンプル集に戻る
メインメニューに戻る
これからプログラミングを始める方へ
基本情報技術者へ
自己紹介

←前に戻るにゃん    次行くにゃん(=^x^=) <最終回>→

paiza レベルアップ問題集 「STEP: 5 10 進数から 2 進数に変換」をPythonとGASで解いてみた

この記事を読むことで、PythonとGASで10進数から2進数に基数変換するコードの書き方を学べ、whileやForループの書き方、スライスを使った書き方、剰余演算子、リスト(配列の追加)など、プログラミングの基幹となる文法の習得を強化できます。

whileループで2で割った余りをリスト(配列)に格納し、Pythonではスライスを使ってForループでリストの逆順から表示させます。

別解として2進数に変換した計算結果をansという変数に格納するコードも記述しました。GASではこの別解に基づいてコードを書いています。

このコーナーでは、学習コンテンツpaizaラーニングレベルアップ問題集をPythonとGASの両方で解いて全コードの解説をしています。
PythonとGASの両方のコードを用いて、全コード及び部分的にも可能な限り詳細に記載いたしました。

GASはスプレッドシートを使っています。
GASはGoogle Apps Scriptと言って、JavaScriptの文法をベースにしているので、JavaScriptの学習中の方にもお役立て出来るかも知れません。

サイトマップはこちらから

paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験

paizaでの解答はPythonで行いましたが、この記事ではPythonのコードと共に、同じ問題を現在学習中のGASだったらどう解くのか、スプレッドシートでバインドして作ってみました。

10 進数から 2 進数に変換 (paizaランク D 相当)

10 進数で表された整数 N が与えられます。
N を 2 進数に変換して出力してください。

この記事では、下記の入力例3の場合、10進数N=10が与えられた時に2進数でどのように変化していくかを求めて行きます。

入力例3
10

出力例3
1010

ではまず、Pythonで解いてみます。

今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。

■ Pythonでの解き方 ■

下準備として、paiza.ioにこの様に入力します。
(入力例1をそのままioにコピーしただけ。)

手順として、

1:10進数の数値N=10を取得する

2:余りを格納する整数arrayを宣言する

3:whileループでN>=1の間、2で割り続けて余りをarrayに格納する

4:Forループでスライスを使ってarrayを逆順に取り出す

で、行います。

10進数を2進数に基数変換をする時は、下記のような2で割った余りを求めて、下から記述する方法で計算しました。
これは、10進数の10を2進数の「1010」に変換する時の計算過程です。

この図では、10を2で割った余りが「0」、5を2で割った余りが「1」、2を2で割った余りは「0」、最後1が残ります。
この余りを下から上に向かって「1010」と書くことで10進数の10を2進数の「1010」に変換出来ました。

この計算過程をwhileループを使って行います。
余りは配列arrayに順次追加して行きます。

まずは、プログラムの各変数の動きを追いやすいように、トレースのio出力結果と、トレースのコードを添えます。
Whileループのトレースをします。

1回目の除算

2回目の除算

3回目の除算

4回目の除算

余りを格納したリストをForループでスライスを使って逆から取り出しました。
以上を踏まえて、トレースのコードを掲載します。

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

#whileループでN>=1の間、2で割り続けて余りをarrayに格納する

print('<<<ループに入る>>>')

while N>=1:
    print('除算前のリストarray:'+str(array))
    print('除算前のNの値:'+str(N))
    array.append(N%2)
    print('格納する余り:「'+str(N%2)+'」')
    
    N/=2
    N=int(N)
    print('除算後のNの値:'+str(N))
    print('除算後リストarray:'+str(array))
    print('------------------------')


print('<<<ループを抜ける>>>')    

#arrayを表示する
print(array)

#Forループを使って逆順から取り出す
for num in array[::-1]:
    print(num,end="")

#ループを抜けた所で改行をする
print()

このままでは、出力結果である出力例3に対して冗長なコードが含まれているので、解答以外のprint文をコメントアウトします。

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

#whileループでN>=1の間、2で割り続けて余りをarrayに格納する

#print('<<<ループに入る>>>')

while N>=1:
    #print('除算前のリストarray:'+str(array))
    #print('除算前のNの値:'+str(N))
    array.append(N%2)
    #print('格納する余り:「'+str(N%2)+'」')
    
    N/=2
    N=int(N)
    #print('除算後のNの値:'+str(N))
    #print('除算後リストarray:'+str(array))
    #print('------------------------')


#print('<<<ループを抜ける>>>')    

#arrayを表示する
#print(array)

#Forループを使って逆順から取り出す
for num in array[::-1]:
    print(num,end="")

#ループを抜けた所で改行をする
print()

スッキリするように、コメントアウトした部分を省いたコードです。

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)

    N/=2
    N=int(N)

#Forループを使って逆順から取り出す
for num in array[::-1]:
    print(num,end="")

#ループを抜けた所で改行をする
print()

ioの出力結果です。

上記ではスライスを使ってリストをForループで逆から取り出していましたが、リストを反転させて、[1,0,1,0]を1010と表記させる方法のコードを掲載します。

この部分を別解のコードでは、[1,0,1,0]を1010になるようにansという変数を使って、Forループで計算しています。

ansの初期値は0で10倍すると0、
そこにリストから「1」を加えると「ans=1」になります。
ans=1を10倍すると10、そこにリストから「0」を加えて「ans=10」になります。
ans=10を10倍すると100、そこにリストから「1」を加えて「101」になります。
ans=101を10倍すると1010、そこにリストから「0」を加えて「1010」になります。

そのForループのトレースと、コメントアウトをしたコード、コメントアウトを取り除いたコードを掲載します。

ループに入る前にリストを反転します。

1回目のansの計算

2回目のansの計算

3回目のansの計算

4回目のansの計算

以上を踏まえて、トレースのコードを掲載します。

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)

    N/=2
    N=int(N)

#リストarrayを出力
print(array)

#リストarrayを反転させる
array=list(reversed(array))

#反転させたリストarrayを出力
print(array)

#基数変換の計算結果を格納する変数ansを0で初期化
ans=0

#Forでリスト内の数を基数変換した形式で表示する

print('<<<Forループに入ります。>>>')

for num in array:
    print('計算前のans:'+str(ans))
    ans*=10
    print('10倍したans:'+str(ans))
    ans+=num
    print('計算後のans:'+str(ans))
    print('-------------------')

print('<<<Forループを抜けました>>>')


#基数変換の計算結果ansを表示させる
print(ans)

冗長な部分をコメントアウトしたコードです。

#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)

    N/=2
    N=int(N)

#リストarrayを出力
#print(array)

#リストarrayを反転させる
array=list(reversed(array))

#反転させたリストarrayを出力
#print(array)

#基数変換の計算結果を格納する変数ansを0で初期化
ans=0

#Forでリスト内の数を基数変換した形式で表示する

#print('<<<Forループに入ります。>>>')

for num in array:
    #print('計算前のans:'+str(ans))
    ans*=10
    #print('10倍したans:'+str(ans))
    ans+=num
    #print('計算後のans:'+str(ans))
    #print('-------------------')

#print('<<<Forループを抜けました>>>')


#基数変換の計算結果ansを表示させる
print(ans)

更にトレース部分のコメント部分を削除したコードです。


#10進数の整数Nを取得する
N=int(input())

#余りを格納するリストarrayを宣言する
array=[]

while N>=1:
    array.append(N%2)
    N/=2
    N=int(N)


#リストarrayを反転させる
array=list(reversed(array))

#基数変換の計算結果を格納する変数ansを0で初期化
ans=0


#Forでリスト内の数を基数変換した形式で表示する

for num in array:
    ans*=10
    ans+=num

#基数変換の計算結果ansを表示させる
print(ans)

別解でも無事正解しました。

■ GASでの解き方 ■

では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。

スプレッドシートの黄色いセルの所に「10進数N(=10)を2進数に基数変換をした結果1010」を出力します。
基数変換の計算結果はansに格納します。
また、ansを二次元配列ans2に追加して、スプレッドシートに出力します。

※スプレッドシートに表示する場合は、ループを使って一次元配列ではなく、二次元配列としてからの配列に追加をして作成します※

手順はこのようになります。

1:スプレッドシートからアクティブシートをアクセスする

2:スプレッドシートの緑色のセルから10進数の整数N(この例では「10」)を取得する


3:2で割った余りを格納する配列を宣言する


4:whileループを使って余りを配列に格納する


5:配列を表示


6:配列を反転させる


7:反転した配列を表示


8:2進数を変数ansに格納する為、ansを0で初期化する

9:ループで2進数を計算する

10:ansを表示

11:スプレッドシートに格納する二次元配列ans2を宣言

12:ansをans2に二次元配列として格納

13:スプレッドシートに出力前にans2を出力して確認する

14:スプレッドシートの黄色い所に2進数に基数変換した結果を格納する

手順1: スプレッドシートからアクティブシートをアクセスする

const ss=SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

手順2:スプレッドシートの緑色のセルから10進数の整数N(この例では「10」)を取得する

let N=ss.getRange(1,2).getValue();

※Nを2で割っていくので、Nの値が変わる、すなわち変数なので定数のconstではなく変数のletで宣言をします※

手順3:2で割った余りを格納する配列を宣言する

let array=[]

手順4:whileループを使って余りを配列に格納する

1回目の除算

2回目の除算

3回目の除算

4回目の除算

whileループのコードの部分です。

//whileループを使って余りを配列に格納する

  console.log('<<<whileループに入る>>>');

  while(N>=1){
    console.log(`除算前のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    //配列に余りを追加する
    array.push(N%2);
    console.log(`余り:${N%2}`);
    //除算実行
    N/=2;
    //小数点を切り捨てる
    N=Math.floor(N);
    
    console.log(`除算後のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    console.log('--------------------');

  }

  console.log('<<<whileループを抜けました。>>>');

手順5:配列を表示

console.log(array);

手順6:配列を反転させる

array=array.reverse();

手順7:反転した配列を表示

console.log(array);

配列の反転前と反転後のログです。

手順8:2進数を変数ansに格納する為、ansを0で初期化する

let ans=0;

手順9:Forループで2進数に基数変換する

1回目のansの計算

2回目のansの計算

3回目のansの計算

4回目のansの計算

Forループの部分のコードです。

console.log('<<<Forループに入る>>>');

  //ループで2進数を計算する
  for(let i=0;i<=array.length-1;i++){
    console.log(`計算前のansの値:${ans}`);
    ans*=10;
    console.log(`10倍したansの値:${ans}`);
    ans+=array[i];
    console.log(`計算後のansの値:${ans}`);
    console.log('---------------------------');
  }

  console.log('<<<Forループを抜けました。>>>');

手順10:ansを表示

console.log(ans);

手順11:スプレッドシートに格納する二次元配列ans2を宣言

let ans2=[];

手順12:ansをans2に二次元配列として格納

ans2.push([ans]);

手順13:スプレッドシートに出力前にans2を出力して確認する

console.log(ans2);

手順14:スプレッドシートの黄色い所に2進数に基数変換した結果を格納する

ss.getRange(3,2).setValue(ans2);

GASでの全コードはこちらになります。

function loop2no10(){

  //スプレッドシートからアクティブシートをアクセスする
  const ss=SpreadsheetApp.getActiveSheet();


  //スプレッドシートの緑色のセルから10進数の整数N(この例では「10」)を取得する
  let N=ss.getRange(1,2).getValue();

  
  //2で割った余りを格納する配列を宣言する
  let array=[]
  
  
  //whileループを使って余りを配列に格納する

  console.log('<<<whileループに入る>>>');

  while(N>=1){
    console.log(`除算前のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    //配列に余りを追加する
    array.push(N%2);
    console.log(`余り:${N%2}`);
    //除算実行
    N/=2;
    //小数点を切り捨てる
    N=Math.floor(N);
    
    console.log(`除算後のNの値:${N}`);
    console.log(`除算前の配列array[${array}]`);
    console.log('--------------------');

  }

  console.log('<<<whileループを抜けました。>>>');


  //配列を表示
  console.log(array);

  //配列を反転させる
  array=array.reverse();

  //反転した配列を表示
  console.log(array);

  //2進数を変数ansに格納する為、ansを0で初期化する
  let ans=0;

  console.log('<<<Forループに入る>>>');

  //ループで2進数を計算する
  for(let i=0;i<=array.length-1;i++){
    console.log(`計算前のansの値:${ans}`);
    ans*=10;
    console.log(`10倍したansの値:${ans}`);
    ans+=array[i];
    console.log(`計算後のansの値:${ans}`);
    console.log('---------------------------');
  }

  console.log('<<<Forループを抜けました。>>>');

  //ansを表示
  console.log(ans);

  //スプレッドシートに格納する二次元配列ans2を宣言
  let ans2=[];

  //ansをans2に二次元配列として格納
  ans2.push([ans]);

  //スプレッドシートに出力前にans2を出力して確認する
  console.log(ans2);

  //スプレッドシートの黄色い所に2進数に基数変換した結果を格納する
  ss.getRange(3,2).setValue(ans2);

}

宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした、ブレイクタイムフォトはこちらになります。

みなとみらいの海と夜景

■ 参考文献の紹介■

じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。

初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。

GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。

サイトマップはこちらから

paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験

←前の問題へ          次の問題へ→