乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

初心者向け

久しぶりに初心者向けの
講座をしようと思います。

数値に単位をつけるだけの
簡単なプログラムです。

解説動画はこちら



12345のような数値を
1万2345のように
単位をつけるだけの簡単なプログラムです。

出来上がりはこれです。
# 数値を4桁で分割する
def sli_num(st):
    s = str(st)
    return [s[::-1][i:i+4][::-1] for i in range(0, len(s), 4)]

# 数値に単位をつける
def num_unit(num):
    sufs = ('無量大数','不可思議','那由他','阿僧祇','恒河沙',
            '極','載','正','澗','溝','穣','杼','垓','京', '兆', '億', '万', '')
    res = []
    for i,p in enumerate(sli_num(num)):
        res += [p+sufs[(i+1)*-1]] 
    return ''.join(res[::-1])
num_unit(数値)で実行できます。

num_unit(10297540795524400449443986866480693)
102溝9754穣0795杼5244垓0044京9443兆9868億6648万0693
num_unit(6344814611237963971310297540795524400449443986866480693646369387855336)
63無量大数4481不可思議4611那由他2379阿僧祇6397恒河沙1310極2975載4079正5524澗4004溝4944穣3986杼8664垓8069京3646兆3693億8785万5336


関数の中でどんなことをしているのかを
解説します。

1つ目の関数sli_num
# 数値を4桁で分割する
def sli_num(st):
    s = str(st)
    return [s[::-1][i:i+4][::-1] for i in range(0, len(s), 4)]
この関数は入力された数値を
文字列に直して分割します。


戻り値の結果部分見てみると
s = str(1234567890)
[s[::-1][i:i+4][::-1] for i in range(0, len(s), 4)]
['7890', '3456', '12']

入力された数値を4桁で区切って
文字列のリストとして返しています。


str関数で入力値を文字列に直した後
[::-1]で文字列をひっくり返すことができます。
s[::-1]
'0987654321'

そうすれば、後ろから区切って
とることができます。

スライス機能を用いて
ひっくり返した数値から4桁ずつ取り
i=0
s[::-1][i:i+4]
'0987'


最後にまた[::-1]でひっくり返して
元に戻します。
s[::-1][i:i+4][::-1]
'7890'

そうすると元の入力値を4桁区切りで
切り取った文字列のリストが出来上がります。

['7890', '3456', '12']

これに単位を付けていきます。

2つ目の関数num_unitでは
1つ目の関数を用いて分割した数値に
単位を付けています。
# 数値に単位をつける
def num_unit(num):
    sufs = ('無量大数','不可思議','那由他','阿僧祇','恒河沙',
            '極','載','正','澗','溝','穣','杼','垓','京', '兆', '億', '万', '')
    res = []
    for i,p in enumerate(sli_num(num)):
        res += [p+sufs[(i+1)*-1]] 
    return ''.join(res[::-1])

あらかじめ単位をリスト値等で作っておき
それと数値を組み合わせた物を
最終的な結果として保持しておきます。

スライス機能では インデックスに
マイナスの値を用いると後ろ側から
値を取得することができます。

sli_numの戻り値は千の位から始まるので
一番末尾は空、続いて万の位、億の位・・・
と言うふうに文字をくっつけていき
最後にひっくり返して文字列のjoinメソッドで
結合して1つの文字列に直しています。

Python言語の中でも
数値と文字列の取り扱いや
リストの操作、for文の使い方などは
よく用いられる部分なので

ここをしっかり覚えておくと
仕事が捗ります。

是非、いろんなプログラムを作って
操作方法に慣れておきましょう。

今回はこれまでです
それでは。



今回は知らない人向けに
データベースとSQLについてを
解説してみました。

営業さんや
これから技術を学ぶ人に
むいていると思います。

解説動画はこちら



内容はめちゃくちゃ簡単な内容で
SQLについても詳細な書き方などについては
触れていません。

全く知らない、触れたことがない人向けで
30分ほどあれば読み追われると思います。

さてまず最初はデータベース編です。

30分で理解する データベースとSQL.003

データベースとは何でしょう?

簡単に言うとデータを効率よく
管理するソフトウェアのことです。

表形式のデータを取り扱いするものは
リレーショナルデータベースと呼ばれ
RDBと略されています。

代表的なものとしては
MysqlやOracleなんかがあります。

30分で理解する データベースとSQL.004

データベース界隈の用語としては
データの最小単位として
テーブルというものがあります。

テーブルは表のことで
行列のデータの集まりです。


テーブルには
カラム:列のこと

30分で理解する データベースとSQL.005
ロウ:行のこと
レコードも1件のデータで
行と同じような扱いです。

行列が交わるところはフィールドです。

スキーマはテーブルの構造を
定義したもので
テーブルのカラムには
データ型と言うものがあります。

テーブルをまとめたものはデータセット

データセットをまとめて
データベースと言っていたりします。

30分で理解する データベースとSQL.010


様々なデータ型が存在します。
カラムは何かしら1つのデータ型で統一して
データが格納されています。

主なデータ型としては
文字列型
整数型
小数型
timestamp型
などがあります。

30分で理解する データベースとSQL.011


ここからはSQLの話です。

まずSQLは
リレーショナルデータベースを
操作するための言語です。

テーブルにデータを格納したり
テーブルからデータを抽出したりする際に
使用することができます。

今回は実際にSQLの実行環境などを
紹介しませんので、SQLや
文法の触りだけの紹介になります。

SQLには
DML
DDL
DCL
という3つの系統があり
それぞれにいくつかの文が存在します。


30分で理解する データベースとSQL.014

今回はその中でもよく使われる
DMLについてのみご紹介します。



一番最初はSELECT文からです。

SELECT文はデータを
抽出・参照するための文です。

たくさんの「句」で構成され
順番通りに書いて実行すると
条件に応じた結果が
出力されるというものです。

30分で理解する データベースとSQL.016
基本構成としては
7つの句があります。

1.SELECT句
2.FROM句

3.WHERE句
4.GROUP BY句
5.HAVING句
6.ORDER BY句
7.LIMIT句

上二つは何をどこから
を指定します。

下の5つは
どういう条件で抽出するか
抽出条件を書くところになります。

一番上はSELECT句です。
SELECT句は出力する物を
指定するところで
基本はカラム名を書きます。

複数ある場合は
カンマ「,」でつなぎます。


30分で理解する データベースとSQL.017

出力時はそのカラム名で
出力されますが
AS で別名をつけたりできます。

30分で理解する データベースとSQL.018

FROM句はどこのテーブルから
抽出をするか
テーブル名を書くところです。

30分で理解する データベースとSQL.019

WHERE句は条件指定をする所で
基本的にはカラムの値を条件にして
指定します。

その値に該当する結果が


30分で理解する データベースとSQL.020

GROUP BY句は
指定したカラムの値でグループ化し
そのグループ化したもので
別のカラムの値を集計することができます。

集計には集計関数を用います。


30分で理解する データベースとSQL.021



HAVING句は
GROUP BY句で指定したグループ化後の
集計結果をさらに絞り込む指定を
するところになります。


30分で理解する データベースとSQL.022


ORDER BY句は
並び替えの指定をするところです。

カラムの値で昇順か降順に
並び替えが行われます。

30分で理解する データベースとSQL.023

LIMIT句は単純に
出力行数を制御するところです。


30分で理解する データベースとSQL.024
基本構文の他にも
UNION句
JOIN句
WITH句
などが使えます。

UNION句は
縦に結果をつなげるイメージです。

SELECT文同志を
UNION句でつなげたりします。


30分で理解する データベースとSQL.026

JOIN句は横につなげるイメージで
4通りの指定方法があります。

FROM句の後に
JOIN句でくっつけたいテーブルを指定し
双方にあるデータをキーにして
片方のテーブルにしかないデータを
横につなげることができます。


30分で理解する データベースとSQL.027

30分で理解する データベースとSQL.028

INNER JOINはデフォルトで
双方のテーブルにある
データが結合します。

LEFT JOINは左側に対して
右側にある物をくっつけます。
RIGHT JOINはその逆です。

FULL JOINは全てのデータを
くっつけます。

FROMの後に書いた方が左側
JOIN句に書いたものが右側になります。

WITH句は一時的なテーブルを作成でき
後続のSQLでそのテーブルを利用できます。


30分で理解する データベースとSQL.029



INSERT文はテーブルにデータを追加します。

30分で理解する データベースとSQL.030


UPDATE文はデータの更新を行い
条件指定した行のデータを書き換えます。

30分で理解する データベースとSQL.031

DELETE文はデータの削除を行い
条件指定した行の削除を行います。

30分で理解する データベースとSQL.032

以上
簡単ではありますが
データベースとSQLについて
紹介を行いました。

実際に業務で取り入れる際は
データベースをインストールしたり
実行環境を整備したり
するのが必要になります。

まずはどんなものなのか
知識を蓄えておくと
良いのかなと思います。

今回はここまでです
それでは。


プログラム言語の文法を覚えても
どうやって書いたら良いか
まだまだ解らないよーって人多いと思います。

そんな方のためのプログラミング上達講座です。
考えたい方は動画を止めて
プログラムを考えてみてください。

解説動画はこちら



今回のテーマは「星を書いてみる」です。
次のような星を描く関数を作成してみましょう。

条件:
n = 行数
def star(n):
    処理

※星や口は全角

初級の問題:
n段目にn個の星を描く

例えば
star(5)
と実行したら、次のように感じに
表示されるような関数を作りましょう。


★★
★★★
★★★★
★★★★★


中級の問題:
n段に三角形になるように星を描く

star(5)

口口口口★口口口口
口口口★★★口口口
口口★★★★★口口
口★★★★★★★口
★★★★★★★★★


上級の問題:
n段にダイヤを描くように星を描く

star(9)

口口口口★口口口口
口口口★口★口口口
口口★口口口★口口
口★口口口口口★口
★口口口口口口口★
口★口口口口口★口
口口★口口口★口口
口口口★口★口口口
口口口口★口口口口

star(10)

口口口口★★口口口口
口口口★口口★口口口
口口★口口口口★口口
口★口口口口口口★口
★口口口口口口口口★
★口口口口口口口口★
口★口口口口口口★口
口口★口口口口★口口
口口口★口口★口口口
口口口口★★口口口口

※偶数個と奇数個の時で処理が変わり
真ん中からは折り返す


さあ、考えてみましょう。





----回答----




さて回答編です。

初級編:

まずprint関数で文字を出力できます。

n段目にn個の星ということで
毎回個数が変わりますので

このような繰り返しを行うには
for文を用います。

def star(n):
    for i in range(n):
        print('★'*(i+1))
star(5)

range関数を用いると
数値の代わりになるものを
生成できます。

数値は0から始まるので
1を足してあげます。

Pythonでは文字に関しては
*で繰り返しを表現できるので
print関数で文字をn段分だけ
表示するようにすれば完成です。




中級編:

まず、引数で入力された行数で
総量を求めておきます。
ピラミッド型に星を出力する個数は
行数 x 2 -1 個になります。

次に出力を

星の左側の口

星の右側の口

というように3分割し
それぞれの個数を計算します。

星の個数が決まれば
全体から引いて2で割れば
外側の口の個数になります。

このような関数になりました。
def star(n):
    tmp = n*2-1
    for i in range(n):
        s = ((i+1)*2-1)
        k = (tmp - s)//2
        res = '口'*k + '★'*s + '口'*k
        print(res)
        
star(5)


上級編:

上級は解くのに時間がかかると思います。

まず入力された行数が奇数の時と
偶数の時で処理が変わります。
ひし形の上部と下部では
処理が変わることに注意が必要です。

・ひし形の左の口
・ひし形に描くための★の外枠と口
・ひし形の右の口

と分けて考えて
各部分の個数を計算して繋げれば
正解にたどり着けます。

if文の条件分岐で個数を先に考え
出力する1行分の文字を考えます。

コードはこうなりました。

def star(n):
    for i in range(n):
        s = (i+1)*2-1        
        k = (i-n//2) if (i+1>n//2) else (n - s)//2
        w = (n-(k*2)-2) if (i+1>n//2) else (i*2 if n%2==0 else i*2-1) 
        res = '口'*k
        if (i+1)==1 or (i+1)==n:
            res += '★★' if n%2==0 else '★'
        else:
            res += '★' + '口'*w + '★'
        res +='口'*k
        print(res)

参考例なので
結果があっていれば正解です。

さていかがだったでしょうか?

プログラミングの考え方が
身についてきましたでしょうか。

引き続きやっていきたいと思いますので
プログラミングを上達したい方は
解いてみてください。

それでは。

このページのトップヘ