2017年2月28日火曜日

高度なプログラミングは基礎の繰り返し


今日思ったことはタイトルで完結しています。

やはり基礎の充実は非常に大事ですので、自分のできる問題を数多くこなすことが重要だと思いました。

受験勉強と違って、ほぼ解き方が決まっていたりするわけではありません。
遠回りしたプログラムでも正解は正解です。

効率化やスピードは後回し後回し。



今日解いた問題は、今まで使ってきたメソッドをふんだんに使いました。
たとえば

mojiwake = input().split(" ")
  #文字列をスペースで分ける

intni = list(map(int,mojiwake))
  #リスト内の文字列を数字列に変化

sumlist =[]
for i in range (n):
  sumlist.append(intni[n])
  #空のリストを作成、n回繰り返してsumlistリストに加えていく
     (意味はないですが例として・・・w)




他にもあと何個か使いましたが、それはまた今度の記事で。
1つのプログラムを書くためにはいろんなメソッド、関数を組み合わせる必要があります。
上記のプログラムだけでも

  • 変数の使い方
  • input()
  • .split(" ")
  • list()
  • map()
  • int()
  • list =[]
  • .append()
  • for i in range()

これだけの文法が組み合わさっているわけです
どうすればプログラムが想定通り動くか、1個1個調べては悩み、調べては悩みでは埒があきません。


よく使う構造は、結局のところよく使って覚えるのが一番です。


2017年2月27日月曜日

paizaスキルチェックCランクの正解率低い問題に挑戦

うーん、なかなか難しいですね

条件を一つ一つ満たしていって、「そろそろいいかなぁ」と思って提出すると結構残念な判定になります。


問題自体をブログに載せる事はできませんので、どんな困難があるのかということを漠然に書いてみたいと思います(例なので色字だけ読んで頂ければ大丈夫です)


例えば
o2i35y28957234h2348ry28rwhr28
fj30497tujf084570956
w3oj42094w6
j2308929754urj8fwj35ru

アルファベットと数字の羅列した文字列が入力されるとして、それぞれ数字部分を選別し、奇数よりも偶数の数字が多ければTrue,同じならEqual,小さければFalseと出力する
(1行目は偶数が5個、奇数が1個なのでFalse,
 2行目は偶数が1個、奇数が1個なのでEqual)

という問題です。

このとき手順として

  • 数字とアルファベットを分ける
  • リストなどでそれぞれの数字を管理する
  • それぞれの数字が奇数か偶数か判定する
  • 偶数or奇数の数字の個数を判定する
  • 偶数が多ければTrue,同じならEqual、小さければFalseを出力


といったいろいろ面倒な手続きを踏まないといけないわけです

初心者の場合、いろんな変数を出したり場合分けをしていくうちに頭の中がごちゃごちゃになってしまい、だんだんちょっと書き直して実行→ちょっと書き直して実行を繰り返してしまいます。

Pさん(仮)は試行錯誤の結果
True
Equal
True
True

と、なんとか問題例の解答に適したコードができたので、そのコードを提出しました



するとどうでしょう、答案は間違いだらけ

なぜPさんは問題例の解答に適したコードを提出したのに間違いだらけだったのでしょうか






------

Pさんの解答を改めて見てみましょう

True
Equal
True
True


解答のなかに"False"がないですね、つまりPさんはFalseの条件判定をどこかで間違えていた可能性が高いです。


例題では正解しても、提出したコードのチェックは条件を満たすさまざまな値を代入してチェックします。

したがって例題とは異なる文字列が入力されたとき、Pさんのコードではそのすべての条件を満たすことはできなかったということになります。


------


Cランクの正答率が低い問題は、おおよそ”さまざまな条件を仮定したときに正確に動くプログラム”というのが求められます。慣れないうちは問題文をしっかり読み、すべての条件に当てはめられるプログラムを作成できるかどうかが重要になるかと思います。プログラミング速度はその後。


当然、1問を解くだけでも時間のかかる作業になりますが、このような正確性の練習の積み重ねがプログラミングの上達に重要だと信じております。



リスト内の文字列を数値(整数など)に変換【Python】最大値最小値の取得

moji = ("2 4 6 8 -10 15 -19 21")

などの文字列を整数型のリストにします

# -*- coding: utf-8 -*-
moji = ("2 4 6 8 -10 15 -19 21")
mojilist = moji.split(" ") #mojiをスペースで区切ってリストに変換
integer = list(map(int,mojilist)) #リスト内の文字列をint型に変換
print (integer)
view raw 02261 hosted with ❤ by GitHub



map関数に関していろいろ書こうと思いましたが、私自身まだmapの使い方がよくわからなかったので、今後勉強していきたいと思います

とりあえず今回は魔法の言葉として書いておきます
integer = list(map(int,mojilist))

型変換のとき、listを追加しないとエラーを吐くようなので忘れないようにしましょう

使い方の例を示します

文字列のうち、最大値を出力するときは max(リスト)を使います
# -*- coding: utf-8 -*-
moji = ("2 4 6 8 -10 15 -19 21")
mojilist = moji.split(" ") #mojiをスペースで区切ってリストに変換
integer = list(map(int,mojilist)) #リスト内の文字列をint型に変換
print (max(integer))
view raw 02262 hosted with ❤ by GitHub


最小値はmin()にします
# -*- coding: utf-8 -*-
moji = ("2 4 6 8 -10 15 -19 21")
mojilist = moji.split(" ") #mojiをスペースで区切ってリストに変換
integer = list(map(int,mojilist)) #リスト内の文字列をint型に変換
print (min(integer))
view raw 02263 hosted with ❤ by GitHub




最近風邪気味で1日だけプログラミング練習できませんでした。
1日だけなのにいろいろと忘れてしまったような感覚に陥ってます。怖いですね。

入門・初心者はやっぱり1日に少しでも練習できると良いですね



2017年2月25日土曜日

はじめての辞書型【Python】(paizaのpython入門じゃ教えてくれない)

ネット上の音声つきの親切な解説はリストまで

これ以上はサンプルコードや本での勉強が重要になってきます

辞書型の使い方

変数= {"文字1":値1,"文字2":値2,..."文字n":値n}

とすると、文字nに対応した値nを取得できます



さて今回のタスクは 「文字の置き換え」です
例えばABCと入力すると、それに対応された数字123が出力される、といった形です。

試しに"Python"という文字を"123456"に変換するコードを書いてみます



最初は愚直に書いてみます

# coding: utf-8
moji = "Python"
mlist = list(moji)
for i in range (len(mlist)):
if moji[i] == "P":
print(1,end="")
elif moji[i] =="y":
print(2,end="")
elif moji[i] =="t":
print(3,end="")
elif moji[i] =="h":
print(4,end="")
elif moji[i] =="o":
print(5,end="")
elif moji[i] =="n":
print(6,end="")
view raw 02225 hosted with ❤ by GitHub



moji = "Python"                   #文字を指定
mlist = list(moji)      #mojiを1文字ずつ区切り、mlistに格納
for i in range (len(mlist)):   #iをmlistの要素数だけ繰り返す
    if moji[i] == "P":     #moji[i]の文字がPであれば
        print(1,end="")    #1を出力する 改行なし
以下



これをスマートに辞書型で書きます

# -*- coding: utf-8 -*-
a = {"P":1,"y":2,"t":3,"h":4,"o":5,"n":6} #辞書に対応した文字と数字を入れる
moji = "Python" #変換前の文字をmoji変数に入れる
mojiList = list(moji) #mojiを1文字ずつリストに入れる
for i in range (len(mojiList)): #mojiListの要素数だけ繰り返し
print (a[mojiList[i]], end="") #辞書型に対応した数字を出力, 改行なし
view raw 02252 hosted with ❤ by GitHub





いやいや、for文にはリストをそのまま入れられるんでしたね、lenはつい癖でいれちゃいます

# -*- coding: utf-8 -*-
a = {"P":1,"y":2,"t":3,"h":4,"o":5,"n":6}
moji = "Python"
mojiList = list(moji)
for i in mojiList:
print (a[i], end="")
view raw 02253 hosted with ❤ by GitHub


だいぶスッキリしました!
最初のforとifの力技では文字が増えるたびにどんどん行数が増えますが、辞書型を使えば辞書の文字をいれるだけで大丈夫です。



今回ブログの書き方も途中でいろいろ思いついて、説明方法がバラバラですみませんでした(直さない)

Python修行 近況2

ブログ開設から1週間が経ちました。

ほぼ独り言を書いているだけですが、Pythonブログを書くことで復習しながら身につけていくというスタイルですのでコメント等なにもなくても続けていきたいと思っています

これまでの閲覧数は246、1記事に6~20程度の閲覧が着いています(だいたいは機械的な巡回だと思いますが詳しくは知りません)


さて、最近は「もし女」でスキルC相当の問題を解き始めています。

Dランクしか解いてこなかった人間にはやや難しくは感じますが、Dランクを数十問解いてきた努力はCランククリアにつながっていると実感しています

たぶんDランク5問ぐらいしか解いてなかったらCランクの問題見た瞬間にブラウザバックしていると思います。


Dランクのランキングでは、すぐに解き方がわかった問題では入賞するようになってきました。ただし3位の壁は厚い・・・w


逆にすぐに解き方が見えなかった問題は10分以上考えることもあり、40位代もそこそこあります。
ちなみにランキングは無作為に選ばれた50人のうちのランキングみたいです。

まぁ、40位代だとしても、正解者が90%とすると
rank = int(40/50)*int(90/100)*100
print (rank)
# 72
なので100人中の72人に入っているわけです。

こいうところ私はポジティブに考えますw
合格率70%の資格というのは"一定以上の勉強すれば"誰でも合格できるレベルですが、要するに"一定以上の勉強"をこなすことができたという称号が与えられるわけです。



paizaからの推定年収は現在422万円です。
10問ぐらい解くと1万円ぐらい上がっている気がします


そろそろスキルランクDを脱却しても良い頃合いでしょうかね




(1週間後の成果やいかに・・・!!)   Python修行3   >>>


2017年2月23日木曜日

~の倍数の値を取得【Python】リスト.append


リスト内の数字の合計【Python】for文とリスト操作の続きです

a = [23,17,13,42,91,83,156,248]

というリストがあるとき、13の倍数を取得します。

方法としてはfor文で取り出すことが考えられますが、取得された数値をprintするだけでなく、次の作業がしやすいリストの形で出力するにはどうすれば良いでしょうか

結果として
13
91
156
と改行した文字列でただ出てくるよりも、

[13,91,156]
とリストで整理されて出力されたほうが、次の作業がしやすいはずです。

ここではfor文で取得した値を"append"で追加するメソッドを使用します

# -*- coding: utf-8 -*-
a = [23,17,13,42,91,83,156,248]
# 13の倍数を取得
b =[]
for i in a:
if i % 13 ==0:
b.append(i)
print (b)
view raw 02234 hosted with ❤ by GitHub



b =[]
#空のリストを作成

for i in a:
#for文でリストaの要素数で繰り返し

    if i % 13 ==0:
 #a[i]を13で割ったときの余りが0であれば

        b.append(i)
   #空のリストbにa[i]を追加

print (b)




もちろん繰り返し回数を"len(a)"で取得しても良いです

# -*- coding: utf-8 -*-
a = [23,17,13,42,91,83,156,248]
b = []
for i in range(len(a)):
if a[i] % 13 ==0:
b.append(a[i])
print(b)
view raw 02235 hosted with ❤ by GitHub

<<<  リスト内の数字の合計【Python】for文とリスト操作



リスト内の数字の合計【Python】for文とリスト操作



for文の繰り返し回数にはリストをそのまま入れることができる!


し・・・知らなかった・・・。

# -*- coding: utf-8 -*-
a = [100, 250, 300]
goukei = 0
for i in a:
goukei += i
print (goukei)
view raw 02231 hosted with ❤ by GitHub


a = [100, 250, 300]
# aというリストを作る

goukei = 0
#goukeiという変数を作る

for i in a:
#aの要素数だけ繰り返す

    goukei += i
  #goukei変数にa[i]を足していく

print (goukei)
#goukeiを出力


なんて便利なんでしょう
私の今までの書き方だと↓

# -*- coding: utf-8 -*-
a = [100, 250, 300]
sum = 0
for i in range(len(a)):
sum += a[i]
print (sum)
view raw 02232 hosted with ❤ by GitHub



for i in range(len(a)):
でわざわざリストの長さを取得して合計を出してますね

まぁ、やってることはまったく同じですが





さて、実際はリストの合計を出すだけなら"sum"メソッドが用意されています

# -*- coding: utf-8 -*-
a = [100, 200, 350]
print (sum(a))
view raw 02233 hosted with ❤ by GitHub


2行。


あっさりしてますなぁ


~の倍数の値を取得【Python】リスト.append   >>>


基礎力が身についてきたらスキルチェックCにチャレンジ!【Python】

先日のブログの内容(PaizaスキルチェックDランクをひたすら解いている理由)をある程度こなしてきたら、やっぱりいろんなものにチャレンジしないといけないかなって思ってきました。

Paizaの問題には模範解答がついていません。このブログを見ても答えは書いてありません。また、自分の解答したコードよりももっといいコードがあるはずですが、どうすれば良くなるのかを知ることができません。

知っている基礎力だけで応用していくことは重要ですが、場合によっては解答へ遠回りをしてしまうかもしれません。

「if文が迷いなくかけるようになってきたなぁ~」、「for文の中にifを入れても頭の中で整理されて使えるようになってきたなぁ~」と、基礎が固まってきたと感じたら、ちょっと上の段階に挑戦してみましょう。

PaizaのDランクよりちょっと上というのは「入門~初心者本を覗いてみる」、「いろんな関数を調べてみる」という感じです。Cランクの問題はDランクの問題みたいに一筋縄ではいきませんので、ちょっとずつ進めていくのが良いです。

ちなみにPaizaスキルチェックと同等の問題を、スキルチェック以外で試してみることもできます。


もし次の常駐先が女子エンジニアばっかりだったら

問題自体はスキルチェックと同じ形ですが、制限時間など縛りはありませんし、ゆっくりと問題を解くことができます。

本の"演習問題"解けたかなー、うーん →次のページぺらっ っていう無機質な作業よりも飾りだけでもゲーム風になっているとぜんぜんモチベ違いますよ

ゲームの中でスキルランクC相当の問題が難しくて解けなかった場合は、今一度スキルチェックDの問題を解きまくって基礎力をつけましょう

C相当の問題を解けたら、スキルチェックCもちょっとずつチャレンジしていきましょう



<< PaizaスキルチェックDランクをひたすら解いている理由

2017年2月22日水曜日

使う関数は違っても結果は同じ【Python】プログラミングは人それぞれ

1~10の数字が入力されるとき、その数字番目のアルファベットを表示します。

例えば
1 ⇒ A
6 ⇒ F


最初に大変な例を
# -*- coding: utf-8 -*-
#1~10の数字が入力されるとき、その数字番目のアルファベットを表示
#5 ⇒ E
num = int(input())
if num == 1:
print("A")
elif num == 2:
print("B")
elif num == 3:
print("C")
elif num == 4:
print("D")
elif num == 5:
print("E")
elif num == 6:
print("F")
elif num == 7:
print("G")
elif num == 8:
print("H")
elif num == 9:
print("I")
else:
print("J")
view raw 02225 hosted with ❤ by GitHub




次にいささか短くした例を
# -*- coding: utf-8 -*-
#1~10の数字が入力されるとき、その数字番目のアルファベットを表示
#5 ⇒ E
a = "ABCDEFGHIJ"
al = list(a)
num = int(input()-1)
print(al[num])
view raw 022226 hosted with ❤ by GitHub


だいぶ短くなりました。

ある意味では最初の例はシンプルで、入門者(プログラム未経験者)でもコードでやりたいことがわかるという、非常に理解しやすいコードだと思います。

対して2番目のコードは少なくともリストの形を知らないとわかりにくいですが、プログラムのコードは4行に抑えられました。




りゅうおうを倒すまでの攻撃回数【Python】if文,while文

竜王のHPを130として、1回攻撃すると10のダメージを与えられるとします。

変数に入れると

HP = 130
damage = 10

となりますね。

攻撃回数はHPが0になるまでなので、HPをダメージで割り切れる場合

HP / damage が攻撃回数です



次にHPをダメージで割り切れない場合を考えます。

damage = 9 のとき、
HP / damage は 14あまり6 となり、もう一回攻撃しなければなりません。

したがってdamage = 9 のときの攻撃回数は
(HP / damage +1) となります。


ループ基本形 if文
これをif文で書くと

# -*- coding: utf-8 -*-
damage = 9
HP = 130
if HP % damage == 0:
print (int(HP/damage))
else:
print (int(HP/damage)+1)
view raw 02221 hosted with ❤ by GitHub

これはdamage = 9と固定しているので、攻撃回数は

In [1]: 15

と表示されます。


--------------------------
それでは次にif文ではなく while文で記述してみます

ループ基本形 while文

臨場感を出して出力される文字も入れてみました。

# -*- coding: utf-8 -*-
damage = 9
HP = 130
while HP > 0:
print ("りゅうおうに " + str(damage) + " のダメージ")
HP -= damage
print ("りゅうおう を たおした")
view raw 022222 hosted with ❤ by GitHub


出力結果は
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおう を たおした

となりました。



while文中でダメージの値をランダムにする

while文の場合はループの回数が決まっていないので、damageがランダムでブレたとしても攻撃回数を出力することができます


# -*- coding: utf-8 -*-
import random
HP = 130
count = 0
while HP > 0:
damage = random.randint(8,10)
print ("りゅうおうに " + str(damage) + " のダメージ")
HP -= damage
count += 1
print ("りゅうおう を" + str(count) + "かい こうげきして たおした")
view raw 02223 hosted with ❤ by GitHub

結果
りゅうおうに 8 のダメージ
りゅうおうに 10 のダメージ
りゅうおうに 10 のダメージ
りゅうおうに 8 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 10 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 10 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 10 のダメージ
りゅうおうに 10 のダメージ
りゅうおうに 9 のダメージ
りゅうおうに 10 のダメージ
りゅうおう を14かい こうげきして たおした

この例では1回のダメージを8から10としてランダム値を生成して攻撃しています。

ランダムなので実行するたびに竜王を倒すまでの攻撃回数は変化します



while文中で会心の一撃やミスを入れる

ここまできたら攻撃するだけでなく、会心の一撃やミスも入れてみましょう

# -*- coding: utf-8 -*-
import random
HP = 130
count = 0
while HP > 0:
lucky = random.randint(1,10)
print("ゆうしゃ のこうげき")
if lucky >= 9:
damage = random.randint(16,20)
print ("かいしんの いちげき!")
print ("  りゅうおうに " + str(damage) + " のダメージ")
elif lucky >= 2:
damage = random.randint(8,10)
print ("  りゅうおうに " + str(damage) + " のダメージ")
else:
damage = 0
print ("ミス")
HP -= damage
count += 1
print ("りゅうおう を" + str(count) + "かい こうどうして たおした")
view raw 02224 hosted with ❤ by GitHub


結果
ゆうしゃ のこうげき
  りゅうおうに 10 のダメージ
ゆうしゃ のこうげき
かいしんの いちげき!
  りゅうおうに 16 のダメージ
ゆうしゃ のこうげき
かいしんの いちげき!
  りゅうおうに 17 のダメージ
ゆうしゃ のこうげき
  りゅうおうに 9 のダメージ
ゆうしゃ のこうげき
  りゅうおうに 10 のダメージ
ゆうしゃ のこうげき
  りゅうおうに 9 のダメージ
ゆうしゃ のこうげき
ミス
ゆうしゃ のこうげき
  りゅうおうに 10 のダメージ
ゆうしゃ のこうげき
かいしんの いちげき!
  りゅうおうに 17 のダメージ
ゆうしゃ のこうげき
  りゅうおうに 10 のダメージ
ゆうしゃ のこうげき
かいしんの いちげき!
  りゅうおうに 18 のダメージ
ゆうしゃ のこうげき
  りゅうおうに 9 のダメージ
りゅうおう を12かい こうどうして たおした



うんのよさに応じて会心の一撃やミスの確率も変動させられますね

こんな感じでwhile文はゴール地点の値が決まっていて、ループ回数が決まっていないときに使いやすそうです

2017年2月21日火曜日

Pythonで文字変換

文字列.replace("変換前","変換後")

さっき覚えました。使い所はイマイチわかりませんが、便利な気がします(てきとう)

現場に残された謎のメッセージ・・・!? 死体の近くに「たぬき」!

angou = hanntaninntahatayasu
print (a.replace("ta","_")
view raw 02212 hosted with ❤ by GitHub


なんてとき便利かもしれません


# hann_ninn_ha_yasu



PaizaスキルチェックDランクをひたすら解いている理由

私は大学時代に個別指導の塾で中高生にいろんな科目を教えていたのですが、大学受験の英語の問題を解くにあたって重要なことを知りました。

”センター試験の英語レベルなら「新中学問題集」をしっかり解ければ大丈夫”

私立英語とかは大学に合わせた勉強が必要になるのですが、国公立の前哨戦ぐらいなら基礎力だけでなんとかなるということです。

といいつつ正確には基礎力があればちょっとした応用がきく、ですね。


中学英語と高校英語の違いというのは根本的には、中学なら"関係代名詞"とか"仮定法"を習いますが、高校になると"関係副詞"とか"仮定法過去完了"を勉強するというだけの話です。

したがって中学で関係代名詞とか仮定法をしっかり身につけている状態であれば、ちょっと形が違う関係副詞とか仮定法過去完了がでてきたときに違和感を感じ、どういうときに使い分ければ良いのかという場合分けが簡単にできるのです。

逆に中学の範囲で判断があやふやになっていると、問題の答えを見てもなんでここでは関係代名詞で次では関係副詞を使うのかがわからなくなってしまいます。




という感じで、長々とすみませんでした、Pythonプログラミングのブログでしたね。

要するに基礎力ってすっごく重要だということが言いたかったのです。

簡単なプログラミングならパッパパッパ仕分け作業でできるということが重要だと思っています。


また、プログラミングであれ英語の勉強であれ、簡単な問題を解き続けるというのはそこそこ忍耐が必要な作業です。基礎力はすぐには身につきません。


よく勉強法の本で「10日でマスター!!~~~」みたいな本がありますが、一般人はそんな要領よくできていません。

基礎力は日々の勉強で培われるもので、時間は掛かります。

地道に勉強を進めていきましょう。





まぁ、プログラミングはコピペできるのでいくらでも自分の能力を飛躍したコード書けちゃうんですけどね (弱いオチ)



電子書籍のススメ【Python】

超初心者からのPython勉強法では「入門のころは本なんて買うな!」と書きましたが、いろいろと視野を広げるためには本というツールも大事だと思います(実際は)。


でもプログラミングの本ってでかくて分厚いですよね

家で勉強するだけなら良いですが、長期休みで実家に帰って読みたいときとか外に持ち出して勉強したいときは本の分厚さがネックになります

1冊でも十分おもいですが、3冊4冊となるともう専用のバッグに入れないと厳しいですね





そこで私がおすすめするのは電子書籍です

電子書籍なら何冊でも外に持ち出せますし、iPadだけじゃなく文庫本ならiPhoneでも十分読めます。 amazonのkindle本なら両方でダウンロードして好きなほうで読むこともできます。



しかもkindle本って紙媒体で買うよりだいぶ安かったりします

↓の「みんなのPython 第4版」の本を見てみると、



単行本 2916円 88ポイント
kindle 2700円 396ポイント

ポイント含めると電子書籍のほうが524円安い!




kindle本の問題点としては、電子書籍を読むということに慣れないときついということぐらいでしょうか

ここはどうしても若干ハードルになってしまいますが、慣れてさえしまえば

  • 安い
  • 持ち運び便利
  • 引っ越しのときに箱に詰める必要がない


といういいことだらけの生活を満喫することができます


ちなみに上で紹介したPythonスクレイピングの本も



驚異のポイント725pt!!


最近、私の家の近所の本屋がどんどん潰れ、自転車で40分ぐらい走らないといけないぐらい本屋がなくなってしまいました。

本屋は好きなんでさみしい気持ちもありますが、こりゃamazonには勝てないよなぁとしみじみ思います


文字列の先頭文字だけを抽出【Python】

今までやったことのない操作をするとき、「自分が知らない関数を使うんじゃないだろうか」と思うことがよくあります。

しかし実際には基本的な関数の組み合わせだけで問題を解決できることも多いのです。



今回のタスクは「文字列の先頭部分だけを抽出して出力」です。

Hello World

と入力を受けた場合に"H"と"W"を取得すればよいのです。


そこで最初に考えるのは

「大文字を取得する関数を使えば終了」

もちろんその通りかもしれませんが、その関数自体を知らないとき、使い方がわからないときは調べないと使えませんね。

単純作業であれば関数を調べなくても知っていることだけで済ませたいものです。

moji = input().split(" ")
print (moji[0][0] + moji[1][0])
view raw 02211 hosted with ❤ by GitHub

というように2行でパパっと書くことができました (初心者の私がこれを思いつくのに10分かかってしまいましたが)

解説

moji = input().split(" ")
#入力される文字を"半角スペース"で区切り、リストに挿入
#moji:   ['Hello' 'World']


print (moji[0][0] + moji[1][0])
#リストmojiの[0]番目の[0]文字目を取得 (1番目の要素の1文字目)
#リストmojiの[1]番目の[0]文字目を取得 (2番目の要素の1文字目)
#して出力


大文字とか関係なく先頭の文字を取得することができました

忘れられしWhile文【Python】

初期値
while 条件式:
  処理
  カウンタ変数の更新
  

単純なようで、使わないとすぐわすれちゃいますね

入門からプログラミングを勉強して for i in range () の形を覚えちゃうとすっごく便利なのでwhileは全然使わず、記憶の彼方に消えてしまいました。

使い方は

n = 0
while n <= 2:
print (a)
n += 1
view raw 02201 hosted with ❤ by GitHub

という感じです





PaizaのスキルチェックはDの問題を相変わらず解いていますが、その中で while は一回も使いませんでした

今一度 while の使い方について考えてみましょう

  • while文は初期値とカウンタ変数の更新が楽
  • for文と違い、回数に規定がない



もちろんfor文もrangeの部分をうまく変えてしまえば同じこともできると思いますが、基本的にはこの2点だと思います

import random
tozan = 0
while tozan < 3776:
climb = random.randint(10,500)
print("富士山を"+ str(climb) + "m登った")
tozan += climb
print ("富士山登頂!")
view raw 02202 hosted with ❤ by GitHub
こんな感じで、ランダムで何回処理するかわからないときとかに使いやすいと思います


whileもちゃんと身に着けて、使うべきときに使う判断ができるようになりたいですね

2017年2月19日日曜日

Python修行 近況1

ブログ始めてまだ2日目ですが、ブログは最初は量で攻めたいのでいろいろ投稿したいと思います


現在の勉強方法


  1. Paiza スキルチェックDランクの問題をひたすら解く
  2. コードガールこれくしょん Pythonの完全クリアを目指す

という感じでやっています。

本をやめてネット上で勉強するようになってから、ほんとうに勉強が捗るようになりました。

Paizaは最初のプログラミング勉強に対して非常にに優れたサイトだと思います。

ということでリンク貼り貼り
https://paiza.jp/
https://paiza.jp/cgc


超初心者からのPython勉強法でも紹介したとおり、最初は「コードガールこれくしょん」のクリアから始めました。


今でもコードガールこれくしょんはやっていますが、改めて見ると
  • 「間違いを正せ」→修正なしで正解
  • 「nが20以上になるように」→問題のコードの変数が「n」でなく「a」
といった理不尽な問題も多数見られますねw

しかしプログラミングはミスの修正が重要なので、修正能力を身につけるという意味で肯定的に捉えましょうww(実はわざと問題文間違ってたりして?)


コードガールこれくしょんは基本的に4問1セットで出題され、1セットの問題を限られた時間内でクリアするとダイヤ(ガチャ回すのに必要)がもらえます。

なので現在は今まで解いてきた問題をすべてダイヤを多くもらえる時間内でクリアすることを目標に解いてます。


現在はStage10まで完全クリアしています。


そしてガチャの引きは・・・



という感じ、URどころかSRさえ集めきれていない


つまりPythonモードを完全クリアし、ガチャ券(ダイヤ)を最大限集めてガチャしたところでURを取得できるとは限らない(できないと思う)。

URほしけりゃ他の言語も頑張れということですね!



引き続きコンプを目指して頑張っていきます( ;∀;)







さて、Paizaのスキルチェックですが、ランクDの問題ならそこそこ短時間で解けるようになってきました。



トロフィー22個ということで、22問解いたということになります。

確実にランクDで勉強した後、ランクCにも挑戦していきたいと思います



1週間後・・・ Python修行 近況2  >>>



文字列が等しいか判定するだけなのにだいぶ悩んだ話【Python】

2つの文字列があったとする

uhyohyoohooho
uhyouhaahaaha

さて機械的にこの文字列が等しいかどうか判定するために、Python初心者の私が考えたことは


---
「うーん、2つの文字を"listA"と"listB"のリストにしてfor文で繰り返し、iのときのa[i]とb[i]が等しいければいけるかなぁ」


listA = list(input())
listB = list(input())
n = len(listA)
for i in range (n):
if listA[i] == listB[i]:
print........
view raw gistfile1.txt hosted with ❤ by GitHub

・・・とprintのところで悩みました。

1文字ずつ何を出力したいんだろう・・・?

あれ、えーと全部正しければいいからprintする必要もないし

iを入れて違うところでelseでfor抜けて"違う文字列でした"を表示すれば、いやいやfor抜けたら正しい文字列でも表示されるんじゃくぁwせdrftgyふじこlp・・・














~10分後~




if listA == listB:
print("同じ文字列です")
view raw 02192 hosted with ❤ by GitHub

超シンプルだよ!

はい、リスト全体を比較するときは変数をそのまま使えばいいだけでした

めでたし めでたし

入力される改行区切りの数字をリストに変換【Python】



# coding: utf-8
a = []
for i in range(10):
a.append(input())
b = list(map(int,a))
print (b)
view raw 02191 hosted with ❤ by GitHub


a = []
#格納するための空のリストを生成

for i in range(10):
#10個の数字が入力されるとする

    a.append(input())
#リスト a に入力された数字を追加していく
#このときリスト内の数字は文字列"str"

b = list(map(int,a))
#魔法の関数mapでintに変換
#list()で囲まないとエラー吐きます

print (b)
#数字のリストを出力


今回からGitHubからプログラムコードの出力を試してみました

若干白黒のコントラストが強すぎるかなぁ

指定された文字数だけ文字を表示する【Python】

入力される文字列 aiueokakikukeko
のうち先頭からn文字を出力する

# coding: utf-8
a = list(input())
n = 10 
for i in range (n):
    print (a[i], end="")



-----
1行ずつ解説

a = list(input())
#入力される文字列を1文字ずつ区切り、リストに挿入する

n = 10 
#例としてn=10, 入力から受けるときはn=int(input())

for i in range (n):
#n回繰り返す

    print (a[i], end="")
  #a[0]からn回入力し、入力後は改行しない
-----

他いい方法があったら教えてください( `・∀・´)ノ

複数の文字列を出力するときに改行でなく"-"で結合するには?

Paizaのスキルチェックをずっとやっていたのですが、タイトル通り

「複数の文字列を出力するときに改行でなく"-"で結合する」方法がなかなかわからず手こずりました


問題の内容をそのまま書くわけにいかないので例を書きます


--------
入力:4 python weiwei nyu mya
(1列目に数字、数個の文字列がスペース有りで入力される)

期待する出力:python-weiwei-nyu-mya.
(最初に入力された数字分、以下の文字列を"-"で結合し表示、最後にピリオド)
--------

そこで私が苦し紛れに書いたコードが以下です


-----
# coding: utf-8
n = input()
nn = int(n)
a =[]
for i in range(nn):
    a.append(input())
for i in range(nn):
    print(a[i],end="")
    if i < nn-1:
        print(",", end="")
    elif i == nn-1:
        print(".", end="")
-----


まぁツッコミどころ満載なのはわかりながら書いてますが、

やさしくツッコんで頂ける方がいらっしゃいましたらお願い致します

自分だけでは改良していくのがむずかしいので・・・




意図(自分で解説)
-----
n = input()
nn = int(n)
#int(input())みたいに1行にしようとしたがエラー出たので2行にしました

a =[]
for i in range(nn):
    a.append(input())
#空のリストを作ってnn個の文字列をリストに挿入

for i in range(nn):
    print(a[i],end="")
#nn回まで、リストa[0]から文字列を挿入、改行を入れないで以下に

    if i < nn-1:
        print("-", end="")
#無理やりハイフンだけ挿入して

    elif i == nn-1:
        print(".", end="")
#無理やり最後だけピリオドを打つ
-----

とりあえずテストは動いて正常ならOKということで合格をもらってますが・・・w

もっとスマートに書きたいですね

2017年2月18日土曜日

超初心者からのPython勉強法

入門向けの本を買って読み進めよう!!


・・・



は、ムリ(結論)

基本的に本を見てもつまらんし、本で勉強できる方はこんなサイトに来ることはないだろう(笑

私がその良い(?)例で、オライリーの本数冊と入門書を買い勉強をしようとしたが、30分と続くことはなかった


いいかい、
なにか勉強するにあたって、現代は"基本無料"でなんでもできる

最初に本を買って無駄にお金を使うな、ネットで無料で勉強を始めよう!





インタラクティブで身につける

そう、繰り返すが"基本無料"でなんでも勉強できる時代だ

数ある勉強方法のうち、最も入門向けに適した方法は「インタラクティブ~(勉強を始めたい)~」という方法だ

インタラクティブは「対話型」とかそんな感じで訳されるが、ネット上の勉強方法として意訳すると、「簡単な操作をすると、その操作が正しいか間違っているのかを教えてくれる」という感じだ。

Pythonにおいてオススメのインタラクティブ勉強サイトは
コードガールこれくしょん」だ
https://paiza.jp/cgc (完全無料、ガチャとかあるけど無料ガチャだけ)


コードガールこれくしょんはプログラムの基礎の基礎、文字の入力方法からきちんと勉強することができる

簡単な演算子を使って計算ができるぐらいの人でも、新たにPythonを始める人は己の力を過信せず、print()からif文、for文と少しずつステップアップを目指そう

ちなみにPythonのステージは17まであり、気合を入れてやれば数日で全クリすることができる

難点といえばステージ12あたりから説明動画のリンクが明らかに間違っているために、勉強していない内容が問題として出題されることがあるぐらいだ

が、「説明ねーじゃん!」と憤りながらも問題文から推測したり、横でググってみたりするといった試行錯誤を繰り返すことでとりあえずクリアはできる




このブログの著者は2017年2月18日現在この記事を書いているが、コードガールこれくしょんを始めたのが2月8日、ステージ17を終わらせたのが2月12日という完全初心者



一緒にPythonを勉強して頂ける方、稚拙な私のPythonプログラムを直して頂ける方がいらっしゃいましたら今後もよろしくお願いいたします (こういうときだけ丁寧語)


初投稿

Pythonプログラミングを始めました。
勉強方法とかを書いていきたいと思います。