記事を書くきっかけ
これまではフロントエンドをやっていましたが、バックエンドもできたらかっこいいなと思ってサーバーやデータベースにも手を出し始めました。
pythonは機械学習やAIのイメージがあったのですが、どうやらバックエンドもできるらしいということで、習得したらお得じゃね?ということでpythonを学び始めました。
今回は以下の動画教材を用いて勉強しました。
プログラミング初心者でも安心、Python/Django入門講座
始める前に
pythonの学習をするにあたってまず、公式からpythonをダウンロードしました。
https://www.python.org/downloads/
基礎知識
今回はpythonのinteractiveshellを使って基礎の基礎をやっています。ターミナルに以下のコマンドを打ち込むことで利用できます。終わる時はexit()
で終わります。
$ python3.10 //3.10はpythonのバージョン
ここからは雑ですが、補足があればコマンドにコメントを加える形で説明していきます。
>>> 1+1 # 足し算
2
>>> -100+10
-90
>>> 1-1 # 引き算
0
>>> 10-0.1
9.9
>>> 1*10 # 掛け算
10
>>> 10**2 # n乗
100
>>> 10**0
1
>>> 20/4 # 割り算
5.0
>>> 10//3 # 商だけ
3
>>> 10%3 # 余りだけ
1
>>> divmod(10,3) # (10/3)(商, 余り)を返す
(3, 1)
>>> a=1
>>> type(a)
<class 'int'>
>>> a=0.1
>>> type(a)
<class 'float'>
文字列
```で囲うことで複数行の文字列を書けます。
>>> text='''\
... Hello
... Hi
... '''
>>> print(text)
Hello
Hi
>>> b='hello'
>>> b*10 # 文字列10個羅列できる
'hellohellohellohellohellohellohellohellohellohello'
>>> b+=' everyone'
>>> b
'hello everyone'
>>> b*0
''
>>> len(b) # 文字列の長さ
14
>>> fmt='私の名前は{}です'
>>> name='太郎'
>>> fmt.format(name)
'私の名前は太郎です'
>>> fmt.format('次郎')
'私の名前は次郎です'
>>> fmt='私の名前は{} {}です'
>>> fmt.format('佐藤','太郎')
'私の名前は佐藤 太郎です'
>>> fmt='{0}{1}{0}'
>>> fmt.format('山田','田中')
'山田田中山田'
>>> fmt='{last}{first}'
>>> fmt.format(last='Sato',first='Taro')
'SatoTaro'
>>> last='佐藤'
>>> first='太郎'
>>> f'{last}{first}'
'佐藤太郎'
>>> language='Python,Ruby,PHP,Perl'
>>> language.split(',') # 文字列を,で分割してリスト化
['Python', 'Ruby', 'PHP', 'Perl']
>>> list=language.split(',')
>>> separator=','
>>> separator.join(list) # ,つけてリストの要素を結合
'Python,Ruby,PHP,Perl'
>>> ','.join(list)
'Python,Ruby,PHP,Perl'
>>> ' '.join(list)
'Python Ruby PHP Perl'
>>>
>>> poem='今日はとても良い天気でした'
>>> poem.replace('今日','昨日')
'昨日はとても良い天気でした'
>>> text='hello,hello,hello'
>>> text.count('hello')
3
>>> name='佐藤太郎'
>>> name.startswith('佐藤')
True
>>> name.startswith('田中')
False
>>> name.endswith('太郎')
True
>>> name.endswith('次郎')
False
>>>
>>> '太郎' in name
True
>>> '次郎' in name
False
>>> text='Hello world'
>>> text.find('Hello') # 一致箇所のindex番号返す
0
>>> text.find('w')
6
>>> text.find('aaa') # 一致しない時は-1を返す
-1
>>> text.index('Hello')
0
>>> text.index('aaa') # 一致しない時はエラーを返す
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
>>> text=' HelloWorld '
>>> text.strip()
'HelloWorld'
>>> text.rstrip() # 右のスペース消す
' HelloWorld'
>>> text.lstrip() # 左のスペース消す
'HelloWorld '
>>> text='あいうえお'
>>> text[0]
'あ'
>>> text[1]
'い'
>>> text[4]
'お'
>>> text[-1]
'お'
>>> text[1:4] # [start:end] start以上end未満
'いうえ'
>>> text[1:]
'いうえお'
>>> text[:4] # indexは4までだが、endは含まれないので注意
'あいうえ'
>>> text[:5]
'あいうえお'
>>> text[-3:] # 最後から数えて3つ目からstart
'うえお'
>>> text[::2] # [start:end:step] 今回は2つ置き
'あうお'
>>> text2=text[1:4]
>>> text2[::2]
'いえ'
>>> text[::-1] # step-1で逆順に取り出せる
'おえういあ'
>>>
リスト
Javascriptで言うところの配列。
>>> mylist=[1,True,False,'Hello']
>>> type(mylist)
# <class 'list'>
>>> mylist=[]
>>> mylist.append('taro') # 追加
>>> mylist
['taro']
>>> mylist[0]='hanako' # リストは書き換え可能
>>> mylist
['hanako']
>>> mylist=[1,2,3,4,5]
>>> mylist[:2]=[-1,-2]
>>> mylist
[-1, -2, 3, 4, 5]
>>> numbers=[1,2,3,4,5]
>>> len(numbers) # 長さ
5
>>> sum(numbers) # 合計
15
>>> max(numbers) # 最大
5
>>> min(numbers) # 最小
1
>>> numbers=[1,2,3,4,5]
>>> numbers.insert(1,1.5) # index1番目に1.5挿入
>>> numbers
[1, 1.5, 2, 3, 4, 5]
>>> num1=[1,2,3]
>>> num2=[4,5,6]
>>> num1.extend(num2) # リストの結合
>>> num1 # num1が更新される
[1, 2, 3, 4, 5, 6]
>>> num1=[1,2,3]
>>> num2=[4,5,6]
>>> num3=num1+num2 # num1を更新したくない場合は、num3を用意して格納
>>> num3
[1, 2, 3, 4, 5, 6]
>>> numbers=[1,2,3,4,5]
>>> numbers.pop(0) # 削除 削除した要素を返してくれる
1
>>> numbers
[2, 3, 4, 5]
>>> numbers.pop() # ()で最後の要素削除
5
>>> numbers
[2, 3, 4]
>>> deleted=numbers.pop()
>>> deleted
4
>>> mylist=['a','i','u']
>>> mylist.remove('i')
>>> mylist
['a', 'u']
>>> num=[1,2,3,4]
>>> num.index(3) # 3はindex何番目?
2
>>> 1 in num
True
>>> 100 in num
False
>>> num=[1,1,1,1,2,3,4,4,5,5,5,6]
>>> num.count(1)
4
>>> num.count(8)
0
>>> parts=['今日は','とても','良い天気']
>>> poem='\n'.join(parts)
>>> print(poem)
今日は
とても
良い天気
>>>
>>> num=[5,3,7,4,8,1,3]
>>> num.sort() # 昇順の場合
>>> num
[1, 3, 3, 4, 5, 7, 8]
>>> num.sort(reverse=True) # 降順の場合 (reverse=True)指定
>>> num
[8, 7, 5, 4, 3, 3, 1]
>>> num=[5,3,7,4,8,1,3]
>>> num2=sorted(num) # numを変更したくない場合
>>> num2
[1, 3, 3, 4, 5, 7, 8]
>>> list1=[1,2,3]
>>> lists=[list1,list1,list1]
>>> lists
[[1, 2, 3], [1, 2, 3], [1, 2, 3]]
>>> list1.append(4) # list1変更するとlistsの中身も全て変更される
>>> lists
[[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
>>> lists[0].append(5) # lists[0]を指定したとしてもlistsの中身全て変更される
>>> lists
[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
>>> lists=[list1.copy(),list1.copy(),list1.copy()] # copy()することでそれぞれ独立したlistになる
>>> lists[0].append(6)
>>> lists
[[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]
>>> lists=[list1[:],list1[:]] # list1を[start:end](すべての範囲)でsliceするパターン
>>> lists
[[1, 2, 3, 4], [1, 2, 3, 4]]
タプル
>>> mytuple=()
>>> mytuple=tuple() # タプル型指定する場合
>>> type(mytuple)
# <class 'tuple'>
>>> mytuple=(1,True,False,'Hello')
>>> mytuple=1,True,False,'Hello' # 要素の羅列でもタプル型になる
>>> mytuple
(1, True, False, 'Hello')
>>> onetuple='Python', # タプルの要素が1つの時は最後に,をつける
>>> type(onetuple)
# <class 'tuple'>
>>> onetuple='Python' # つけ忘れると文字列になるので注意
>>> type(onetuple)
# <class 'str'>
>>> mytuple='Python','PHP','Ruby','Perl'
>>> mytuple[0]
'Python'
>>> mytuple[1:]
('PHP', 'Ruby', 'Perl')
>>> mytuple[0]='C' # タプルは要素の変更不可
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
list -> let
tuple -> const
みたいな感覚。
辞書
Javascriptで言うところのオブジェクト。
>>> score={'math':80,'science':50}
>>> type(score)
# <class 'dict'>
>>> score={}
>>> score=dict()
>>> score['math']=80 # score['key名']=value
>>> score
{'math': 80}
>>> score['math']
80
>>> score={}
>>> science=score.get('science','no data') # key=scienceのvalueを格納。無ければno data格納
>>> science
'no data'
>>> score['science']=80
>>> science=score.get('science','no data')
>>> science
80
>>> math=score.get('math')
>>> print(math) # 無いものはNone
None
>>> member={'guitar':'Sato','base':'Kato'}
>>> new={'drum':'Ito','vocal':'Eto'}
>>> member.update(new)
>>> member
{'guitar': 'Sato', 'base': 'Kato', 'drum': 'Ito', 'vocal': 'Eto'}
>>> new={'guitar':'Kudo'}
>>> member.update(new) # すでにキーがある場合、valueが更新される
>>> member
{'guitar': 'Kudo', 'base': 'Kato', 'drum': 'Ito', 'vocal': 'Eto'}
>>> deleted=member.pop('base') # 削除するkeyのvalueを格納
>>> deleted
'Kato'
>>> member
{'guitar': 'Kudo', 'drum': 'Ito', 'vocal': 'Eto'}
>>> 'drum' in member # key名ある場合はTrue
True
>>> 'Kudo' in member # valueを指定するとFalseになる
False
>>> len(member)
3
>>> guitar=member.setdefault('guitar','Endo')
>>> guitar # key名ある場合はそのvalue持ってくる
'Kudo'
>>> base=member.setdefault('base','Endo')
>>> base # キー名無い場合は第二引数をvalueとする
'Endo'
>>> member
{'guitar': 'Kudo', 'drum': 'Ito', 'vocal': 'Eto', 'base': 'Endo'}
>>> member.keys() # memberにある要素のkey名持ってくる
dict_keys(['guitar', 'drum', 'vocal', 'base'])
>>> member.values() # memberにある要素のvalue持ってくる
dict_values(['Kudo', 'Ito', 'Eto', 'Endo'])
>>> member.items() # memberにある要素のkey名とvalue持ってくる
dict_items([('guitar', 'Kudo'), ('drum', 'Ito'), ('vocal', 'Eto'), ('base', 'Endo')])
セット
>>> myset={1,2,3}
>>> type(myset)
# <class 'set'>
>>> myset=set() # 空のset作る場合は必ずset()
>>> mylist=[1,2,3]
>>> myset=set(mylist)
>>> myset
{1, 2, 3}
>>> mylist=[1,1,1,1,2,2,2,3,3,4,5,6]
>>> myset=set(mylist) # 同じ値は1つにされる
>>> myset
{1, 2, 3, 4, 5, 6}
>>> myset={1,2,3}
>>> myset.add(4)
>>> myset
{1, 2, 3, 4}
>>> myset.remove(1)
>>> myset
{2, 3, 4}
>>> 2 in myset
True
>>> len(myset)
3
集合
>>> mutable={'list','dict','set'}
>>> imutable={'str','number','tuple'}
>>> seq={'list','tuple','str'}
>>> mutable&seq # 積集合(mutable/seqどちらにも属する)
{'list'}
>>> mutable.intersection(seq) # 積集合(intersection) パターン2
{'list'}
>>> mutable | seq # 和集合(mutable/seqどちらか一方に属する(どちらにも属するものも含む))
{'str', 'list', 'tuple', 'dict', 'set'}
>>> mutable.union(seq) # 和集合(union) パターン2
{'str', 'list', 'tuple', 'dict', 'set'}
>>> mutable ^ seq # 排他的論理和集合(mutable/seqどちらか一方にのみ属する(どちらにも属するものは含まない))
{'str', 'dict', 'tuple', 'set'}
>>> mutable.symmetric_difference(seq) # 排他的論理和集合(symmetric_difference) パターン2
{'str', 'dict', 'tuple', 'set'}
>>> imutable - seq # 差集合(imutableだがseqに属さない)
{'number'}
>>> imutable.difference(seq) # 差集合(difference) パターン2
{'number'}
まとめ
Javascriptと似てるような似てないような...という感じでした。笑
その2では.pyファイルでコードを書いたif文や、ファイルの読み書きなどについてまとめようと思います。