【リアイム】


タップ(クリック)で消す



よみこみ中…








閉じる
もくじ

リアイム

アウトプット&知識の共有

人気のプログラミング言語 【 python 】 特徴と出来ることまとめ


f:id:a1t2s2u2:20220101225530p:plain



f:id:a1t2s2u2:20220101182548j:plain

これはヘビのパイソン(ニシキヘビ)なので、誤解のないようにお願いします。今回ご紹介するのはプログラミングのpythonです。

pythonとは

f:id:a1t2s2u2:20220101171026j:plain

pythonプログラミング言語の一つで、人気ランキング上位に入っています。

どんな特徴なのか、どうして人気なのかをみてみましょう。


特徴

f:id:a1t2s2u2:20220101171127j:plain

シンプルで簡潔なコードによって理解することがとても簡単です。なぜかというと、インデント(空白を追加する)ことが必須であるため、全ての人が似たようなコードを書くことになるためです。


ですが、処理速度が遅くて困ることもあります…


これからあげる特徴は人気の理由でもあります。

コードの具体例

f:id:a1t2s2u2:20220101172755j:plain

例えば、単純にfor文を用いた配列操作でもJavaScriptpythonでは大きな違いがあります。今回は[1, 2, 3]という数字配列をそれぞれに倍してみますね。

var array = [1, 2, 3];
for(var i=0;i<array.length;++i) {
    array[i] *= 2
}
console.log(array);

【 計算結果 】
f:id:a1t2s2u2:20220101171547p:plain

ちなみに他の表記もできますが、今回は基本で記述しています。



この処理をpythonで行うと、

array = [1, 2, 3]
for i in range(len(array)):
    array[i] *= 2
print(array)

わかりますか…?

for分用の中括弧{}がなく、文の最後のセミコロン;が必要ありません。しかし、インデントと言ってfor文の中に決められた分だけ空白を入れる必要があります。


つまり、jsの{}がpythonのインデントと同じような役割だと言えますね。jsでインデントは必要ありませんが、やらないと見にづらいので必須だと思います。



シンプルで理解しやすい

f:id:a1t2s2u2:20220101174419j:plain

pythonの特徴からもわかりますが、簡潔に理解しやすいコードを書くことができるため、複雑なプロジェクトなどに用いると効果大ですよね。それこそが人工知能pythonが用いられる理由です。

人工知能は高度な数理的アルゴリズム実装が必要であり、アルゴリズムだけで混乱してしまいそうなくらい複雑なのです。人工知能の仕組みについてはこちらの記事をご覧ください。

実際に僕が考えたアルゴリズムを実装した記事もあるので、より深い中身を覗くことができます。

riaimu.hateblo.jp
riaimu.hateblo.jp
riaimu.hateblo.jp


プログラミング初心者はpythonから始めると良いでしょう。

とてもシンプルであるため、プログラミングの本質自体を理解することが容易になります。本質さえわかれば他の言語なんて全然勉強しなくても、少し調べると書けるようになるので、まずは1言語から習得してみましょう。


ライブラリの豊富さ

f:id:a1t2s2u2:20220101174507j:plain

数多くのライブラリが用意されているため、計算処理を簡単にしたり、canvasを使ってアプリケーションを開発することもできます


特にnumpyというライブラリでは配列計算を楽に行うことができます。行列式ができたり、形状が不明であっても足し算することができたりします。



僕もこの仕組みは便利だと思い、自作してみました。自分でclassの仕組みを考えて実装できたので是非興味のある方は見てください。

riaimu.hateblo.jp

使われているサービス

  • YouTube
    多くの方が使う世界最大の動画サービスですが、pythonがバックエンド(サーバーで動作)で利用されています。
  • Blender
    3Dモデルを作成することのできる人気ソフトですが、キャラクターを動かす際などにpythonが利用されているようです。

他にも多くのサービスにpythonは用いられており、仕事もたくさんあります。やっぱりシンプルさとライブラリの豊富さが評価されているのだと思います。


pythonで出来ること

f:id:a1t2s2u2:20220101224347j:plain

では、具体的にどんなことができるのかみてみましょう。ライブラリの具体的なコードに関しては理解しないでも大丈夫です。

どんなことができるのかを知ることが大切です!

Webスクレイピング

Beautiful Soup 4というライブラリでは、webサイトの情報を取得することができます。情報収集を自動化するにはこれを使ってみましょう。

※ 注意点として、スクレイピングが禁止されているサイトがいくつかあります。YouTubeTwitterがその例ですね。そう言った場合は取得することができません。



次のプログラムはGoogle検索した場合に表示されるサイトのタイトルを取得するためのものです。キーワードを入力すると検索結果が表示されるようにしています。

import requests
from bs4 import BeautifulSoup

# 入力用の関数
def inputer(content):
    return input(content+"\n>> ")

URL = "https://www.google.com/search?q="+KEY_WORD
# 検索ワード
KEY_WORD = inputer("Type the word you want to search")
# 最大表示数
LIMIT = 10

try:
    results = []
    for i in range(LIMIT):
        print("\r "+str(i)+"/"+str(LIMIT)+"  ( "+str(round(i/LIMIT*100))+"% )",end="")
        res = requests.get(URL+"&start="+str(i*10))
        soup = BeautifulSoup(res.text, 'html.parser')
        results += soup.find_all("h3")
    print("\r "+str(LIMIT)+"/"+str(LIMIT)+"  ( 100% )")
    print("result :",res)
    for r in results:
        print("  ・",r.text.replace('<h3 class="zBAuLc"><div class="BNeawe vvjwJb AP7Wnd">',"").replace('</div></h3>',""))
except:
    print("Cloudn't get the information")

【 実行例 】

f:id:a1t2s2u2:20220101173824p:plain

(キーワード:ブログ リアイム)

サイト別にどのような情報を取得するのかを設定できるため、株価を取得したり、天気の情報を取得できたりします


よくスクレイピングの求人を見かけますが、それだけ需要があり、細かく設定することができるため便利ですね。



人口知能

f:id:a1t2s2u2:20220101175855j:plain

pythonの特徴でもご紹介しましたが、人工知能pythonの相性は良く、数多くのライブラリが開発されており、誰でも(これは言い過ぎた)人工知能を作ることができます



しかし!

実は処理速度が遅いため適さない場合もあるのです。実際に僕もcanvasを用いた数学の検証では遅いためjavascriptで書き直して実行しました。


ちなみにjsvascriptでcanvasを利用する方法はこちら
riaimu.hateblo.jp


canvas

画面を作って画像を表示したり、ボタンを設置したりしてアプリケーションを作るための方法としてcanvasを使うことができます。僕はオリジナルの人工知能のネットワークを視覚化するために使用しました。



人工知能の表示を担当するpythonファイルの中身を特別に公開します。これ単体では意味を成さないので、実行しないで大丈夫です。

また、人工知能とはいっても僕の完全オリジナルなので全く理解する必要はありません!

ただ、canvasでどんなことができるのかを知ってみましょう。


import random
import Object
import View
import datetime

# MEMO
# improve ability to read the code
# Don't forget how to use array of self.neurons
# It's need to get keys.
# 

FIRST_ID = '0000'
digit = 2 # 四捨五入の桁数

# round関数
def r(v):
    return round(v, digit)

# random+round関数
def R(max, length=0): # lengthが1以上なら配列生成
    if length == 0:
        return round(random.random() * max, digit)
    else:
        res = []
        for i in range(length):
            res.append(
                round(random.random() * max, digit)
            )
        return res



class Neuron:

    def __init__(self, id, position, limits):

        self.id = id
        # biasは-max〜maxまでの範囲をとる
        self.bias = r( R(2*limits['bias']) - limits['bias'])
        
        # V ObjectのV
        self.V = Object.V( 0.0 )
        self.Delta = Object.V( 0.0 )
        self.position = position
        self.attribute = "★"
        """ example of connection
            { # example of connection
                'id' : '000' ,
                'weight' : 0.12 ,
            }
        """
        self.connection = []

    def __str__(self):

        print(' id :', self.id, ' position :', self.position, ' attribute :', self.attribute)
        print(' value :', self.V, ' bias :', self.bias)
        print(' connection('+str(len(self.connection))+') :', self.connection)
        return " - - - - - - - - - - - "




class Network:

    def __init__(self, number, shape, limits):

        START = datetime.datetime.now()
        self.limits, self.shape = limits, shape
        CENTER_POSITION = Object.V([0.0]*len(shape))

        # generate neurons
        self.neurons = {}
        for i in range(number):
            # decide id
            id = FIRST_ID
            while id in self.neurons.keys():
                id = str( random.randint(0, 100000) )

            # decide position
            position = Object.V([])
            for depth in self.shape:
                position.append( R(depth) )
            CENTER_POSITION = position + CENTER_POSITION

            # add neuron
            self.neurons[id] = Neuron(id, position, limits)

        # make connections between neurons
        for id_1 in self.neurons.keys():
            N1 = self.neurons[id_1]
            for id_2 in self.neurons.keys():
                if not id_1 == id_2:
                    N2 = self.neurons[id_2]
                    # judge
                    if random.random() <= (1 - N1.position.distance_from( N2.position ) / self.limits['connect']):
                        N1.connection.append(
                            { # new connection
                                'id' : id_2,
                                'weight' : R(self.limits['weight']),
                            }
                        )

        print('\n - Network has been generated')
        print(' - Generating time :', datetime.datetime.now() - START)
        print(' - Average of positions :', CENTER_POSITION / number)
        print(' - First neuron information :\n', self.neurons[FIRST_ID], '\n')


    """
        Show details about network
    """
    def Detail(self, neurons=True):

        sum_connection = 0
        for key in self.neurons.keys():
            if neurons: # whether show neuron
                print(self.neurons[key])
            sum_connection += len( self.neurons[key].connection )

        print('\n The number of neurons :', len(self.neurons.keys()))
        print(' sum connection :', sum_connection)
        print(' average connection :', r(sum_connection / len(self.neurons.keys())))


    def Calculation(self):
        # I have to add the rule for attributes
        for key in self.neurons.keys():
            for connection in self.neurons[key].connection:                
                self.neurons[connection['id']].Delta =  Object.V(r(self.neurons[connection['id']].Delta + (self.neurons[key].V + self.neurons[key].bias) * connection['weight'] ))

        # 相対的な値にするため、Deltaに格納してからその変位をVとする
        for key in self.neurons.keys():
            # 値を割って大きくなりすぎるのを防ぐ
            self.neurons[key].V = Object.V(
                r( (self.neurons[key].Delta - self.neurons[key].V)/2 )
            )
            self.neurons[key].Delta = Object.V(0)

net = Network(
    number = 300,
    shape = [100, 100],
    limits = {
        'connect' : 15 ,
        'bias' : 5.0 ,
        'weight' : 0.4 , 
    }
)
net.Detail(
    neurons = True,
)



View.plot(net)

#
# Am is always does calculation in order to have a fluency
#
while True:
    net.Calculation()
    if input("fin? :") == "fin":
        break
    
    net.Detail()


そのcanvas部分を表示します。

f:id:a1t2s2u2:20220101181715p:plain

まるはニューロンを表しており、色のついた線はニューロンの接続を意味します。接続には距離が近いほど接続する確率が上がるといったアルゴリズムにしています。


ちなみにニューロン数を多くしすぎるとこうなります。

f:id:a1t2s2u2:20220101224855p:plain



その他

f:id:a1t2s2u2:20211212113711j:plain

なかには僕もやったことのないこともあります。

それくらいたくさんのことができるということですね。


ファイルをいくつかに分けて処理を書くことができる点も僕はいいと思っていて、人工知能なら1つのファイルに全てのプログラムを書いてしまうと、とてつもない行数になってしまいます。


ゼロの状態からオリジナルの人工知能プログラムを書いてみたことがあります。

Twitterでそのプログラムの全体像を投稿したことがあるので、興味があればみてください!



記事を読んでいただきありがとうございます。
少しでもpythonについて理解が深まれば良いと思い、この記事を書きましたが、どうだったでしょうか?


【 おすすめ記事 】

riaimu.hateblo.jp
riaimu.hateblo.jp
riaimu.hateblo.jp






記事の内容に間違いがあった場合は、Twitterもしくはお問い合わせフォームからお伝えください。