Vicky34 blog.

IT・プログラミングメイン

問題集を解いてみた。

1. 概要

pythonのコーディング力を上げたいと思いました。

2. サイト

調べた結果、CodingBadというサイトが良さそうでした。

3. 実践

3-1. Warmup-2 > string_bits


与えられた文字列を返すと、最初の文字列から始まるすべての文字からなる新しい文字列が返されます。 従って、"Hello"は"Hlo"を生成します。

答え

def string_bits(str):
    result = ""
    for i in range(len(str)):
        if i % 2 == 0:
            result = result + str[i]
    return result

解答

def string_bits(str):
    result = ''
    # これにはいくつかの方法があります。
    # これはすべてのcharに対してiの標準ループを使用し、
    # ループ内では奇数インデックス値をスキップします
    for i in range(len(str)):
        if i % 2 == 0:
            result = result + str[i]
    return result 

3-2. Warmup-2 > string_splosion


“Code"のような空ではない空文字列を指定すると、"CCoCodCode"のような文字列が返されます。

答え

def string_splosion(str):
    length = len(str)

    new_string = ''
    for i in range(length):
        new_string += str[:i+1]

    return new_string

解答

def string_splosion(str):
    result = ''
    for i in range(len(str)):
        result = result + str[:i+1]
    return result

3-3. Warmup-2 > last2


与えられた文字列に対して、文字列中の部分文字列の長さ2と文字列の最後の2文字の数を返します。したがって、 “hixxxhi"は1を返します(終わり部分文字列は数えません)。

答え




解答

def last2(str):
    # 短い文字列の場合除外
    if len(str) < 2:
        return 0

    # 最後の2文字は、str[-2:]と書くことができる
    last2 = str[len(str)-2:]
    count = 0

    # iから始まる部分文字列の長さを調べる
    for i in range(len(str)-2):
        sub = str[i:i+2]
        if sub == last2:
            count = count + 1

    return count

3-4. Warmup-2 > array_count9


与えられたintの配列を返すと、配列中の9の数を返します。

答え

def array_count9(nums):
    # from collections import Counter
    # count9 = Counter(nums)
    # return count9[9]
    count = 0
    for num in nums:
        if num == 9:
            count += 1

    return count

解答

def array_count9(nums):
    count = 0
    # 各値を見るための標準ループ
    for num in nums:
        if num == 9:
            count = count + 1

    return count

3-5. Warmup-2 > array_front9


intの配列が与えられた場合、配列の最初の4つの要素の1つが9の場合はTrueを返します。配列の長さは4未満です。

答え

def array_front9(nums):
    for num in nums[:4]:
        if num == 9:
            return True

    return False

解答

def array_froun9(nums):
    # 最初にループの終わりを示します
    end = len(nums)
    if end > 4:
        end = 4

    for i in range(end):
        if nums[i] == 9:
            return True
    return False

3-6. Warmup-2 > array123


intの配列が与えられている場合、配列1,2、3の配列がどこかの配列に現れた場合にTrueを返します。

答え

def array123(nums):
    new_string = ''
    for num in nums:
        new_string += str(num)

    if '123' in new_string:
        return True

    return False

解答

def array123(nums):
    # Note: iterate with length-2, so can use i+1 and i+2 in the loop
    for i in range(len(nums)-2):
        if nums[i]==1 and nums[i+1]==2 and nums[i+2]==3:
            return True
    return False

3-7. Warmup-2 > string_match


2つの文字列aとbが与えられた場合、同じ長さ2の部分文字列を含む位置の数を返します。したがって、 “xx"、 "aa"、 "az"部分文字列は両方の文字列の同じ場所に表示されるので、 "xxcaazz"と "xxbaaz"は3を返します。

答え

def string_match(a, b):
    length = 0
    if len(a) > len(b):
        length = len(a)
    else:
        length = len(b)

    count = 0
    for i in range(length):
        if i < length-1:
            if a[i:i+2] == b[i:i+2]:
                count += 1

    return count

解答

def string_match(a, b):
    # 文字列が短い図
    shorter = min(len(a), len(b))
    count = 0

    # すべての部分文字列の開始点をループします
    # ここで長さ-1を使用するので、ループ内で char str[i+1] を使用できます
    for i in range(shorter - 1):
        a_sub = a[i:i+2]
        b_sub = b[i:i+2]
        if a_sub == b_sub:
            count = count + 1

    return count

感想

それなりにはできたけどまだまだPythonの勉強が必要そうです。

これまでに読んだ本

2015/10 ~ 2017/07

Python


  • 入門Python3

    Javaをやっていたため基礎は問題なかった。後半はネットワークプログラミングなど実践的な内容だった。
    Pythonでできることを薄く広くという感じ。

  • 実践Python3

    デザインパターン難しい、、、

  • Pythonで始めるデータラングリング - データの入手、準備、分析、プレゼンテーション

    先に入門やらないと難しいな

  • Pythonによるデータ分析入門 -NumPy, pandasを使ったデータ処理

    NumPyの基礎、Ipythonの使い方まで終了

  • PythonによるWebスクレイピング

    データを収集したいと思い購入、楽しい

Java


  • パーフェクトJava

    Javaの基礎、後半はネットワークプログラミング等の実践的な内容

  • なぜ、あなたはJavaオブジェクト指向ができないのか

    ジャンケンのプログラムでオブジェクト思考を理解していく書籍。

  • Effective Java

    むず

HTML/CSS


  • 初めてのHTML/CSS

    エンジニアを志して一番初めにやった本、楽しかった

  • CSSデザインの原則

    CSSでいろいろなデザインのコーディング例があってよかった

  • HTML3/CSS3 モダンコーディング

    結構実践的な内容だった

MySQL


  • 基礎からのMySQL

    現場で使いたいね

Git


  • GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

    初めてOSSに触れた

  • 実用Git

    現場でデプロイをGitでやっていたため購入。ソース管理だとこんなにコマンド使わないよね

Other


  • アルゴリズムを始めよう

    アルゴリズムに初めて触れた。難しかった

  • Team Geek

    チームの改善・知識欲のために購入。ちょっとずつ良くなっている気が、、、しなくも無い

よく見るサイト集

* 随時更新(2017/07/17 ~)

情報収集

  • GitHub

    他人のコードを見る

  • Qiita

    困った時にだいたいたどり着く

  • Postd

    マニアックな感じ

勉強

その他

  • codic

    名前付で迷った時

NumPyについて

NumPy

ゼロから作るディープラーニング始めました。

ディープラーニングの実装では、配列や行列の計算が多く登場する。
NumPyの配列クラス(numpy.array)には便利なメソッドが多く用意されていて、ディープラーニングの実装においてもそれらのメソッドを利用します。

NumPyのインポート

import numpy as np

NumPy配列の生成

NumPyの配列を生成するために、np.array()というメソッドを用いる。
np.array()は、Pythonのリストを引数にとり、NumPy用の配列(numpy.ndarray)を作成します。

import numpy as np

# 配列の生成
x = np.array([1.0, 2.0, 3.0])
print(x)       #=> [ 1.  2.  3.]
print(type(x)) #=> <class 'numpy.ndarray'>

NumPyの算術計算

# 要素ごとの足し算
print(x + y) #=> [ 3.  6.  9.]
# 引き算
print(x - y) #=> [-1. -2. -3.]
# 掛け算
print(x * y) #=> [  2.   8.  18.]
# 割り算
print(x / y) #=> [ 0.5  0.5  0.5]

配列のxとyの要素が同じでないとエラーになる。
要素ごとという言葉は、英語でelement-wiseと言う。
NumPy配列はelement_wiseな計算だけではなく、NumPy配列と単一の数値(スカラ値)の組み合わせで算術計算を行うこともできる。
その場合、NumPy配列の各要素とスカラ値の間で計算が行われます。この機能はブロードキャストと言います。

x = np.array(list_a)
print(x // 2.0) #=> [ 0.  1.  1.]

NumPyのN次元配列

NumPyは、1次元の配列(1列に並んだ配列)だけではなく、多次元の配列も作成することができる。
2次元配列(行列)は次のように作成できます。

A = np.array([[1, 2], [3, 4]])
print(A)
#=> [[1 2]
#    [3 4]]

# 形状
print(A.shape) #=> (2, 2)
# 要素のデータ型
print(A.dtype) #=> int64

行列の算術計算

B = np.array([[3, 0], [0, 6]])
print(A + B)
#=> [[ 4  2]
#    [ 3 10]]

print(A * B)
#=> [[ 3  0]
#    [ 0 24]]

また、行列に対してスカラ値(単一の数値)で算術計算を行うことも可能です。これもブロードキャストによる機能です。

print(A)
#=> [[1 2]
#    [3 4]]
print(A * 10)
#=> [[10 20]
#    [30 40]]

ブロードキャスト

10と言うスカラ値が2*2の要素に拡大されて演算が行われる機能を、 ブロードキャスト (broadcast)と言う。

A = np.array([[1, 2], [3, 4]])
B = np.array([10, 20])
print(A * B)
#=> [[10 40]
#    [30 80]]

各要素へのアクセス

要素のインデックスは、0から始まる。

# for文でアクセスすることも可能
for row in X:
    print(row)
#=> [51 55]
#   [14 19]
#   [0 4]

# 配列によって各要素にアクセス
X = X.flatten() # Xを1次元の配列へ変換
print(X) #=> [51 55 14 19  0  4]
# インデックスが0,2,4番目の要素を取得
print(X[np.array([0, 2, 4])]) #=> [51 14  0]

この記法を応用すれば、ある条件を満たす要素だけを取得することができる。

# 15以上の値だけを抽出
print(X > 15)  #=> [ True  True False  True False False]
print(X[X>15]) #=> [51 55 19]

range()メモ

range()

range()の引数について

引数名 内容
start デフォルトは0
end 最大範囲
step デフォルトは1

利用例

# 0 ~ 9
print(list(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 1 ~ 10
print(list(range(1, 11)))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 1~50までの偶数のリスト
even_numbers = [i for i in range(1, 51) if i % 2 == 0]
print(even_numbers)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50]

print(list(range(0, 30, 5)))
[0, 5, 10, 15, 20, 25]

print(list(range(0, -11, -1)))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10]

今のチームを改善してみる

概要

チームの現状がよくないため改善したい。

詳細

  • 各々仕事が進まない
  • 何が優先か分からなくなる
  • 品質が悪い

現在の構成

PM: 1人
開発: 5人 (オフ2)

ここ1年を振り返ってみる

課題

  • チームとしての認識合わせ
  • 報連相
  • テストケースの作成
  • テストの実施
  • タスクの振り分け
  • 優先順位の決定
  • ドキュメントが無い
  • 属人化の排除

どうするか?

自分の知識・考えが浅いためチームについての勉強する。

1.「 Team GeekGoogleギークたちはいかにしてチームを作るのか」を読む

  1. 今のチームに適応してみる

適応できそうなところ

* コードレビュー

まだ読みきれてないな〜 :cry: