進捗したい日記

プログラミングを覚えたい人のメモや感想です

書式を変えてみる(Python)

前回に引き続きformatを使ってみる

オプションを設定!
{引数のインデックス:オプション}
{:オプション}
位置を調節
'{:<10}'.format('左詰め')
#'左詰め       '
'{:>10}'.format('右詰め')
#'       右詰め'
'{:^10}'.format('真ん中')
#'   真ん中    '
特定の文字(※1文字)で調節
'{:☆^15}'.format('Hello')#オプションの前で指定
#'☆☆☆☆☆Hello☆☆☆☆☆'
数値に符号をつける
#'+':正負の符号をつける
#'-':負の値に符号をつける
#' ':正の数のとき空白、負の数のとき符号をつける
'{:+}'.format(1)
#'+1'
'{:+}'.format(-1)
#'-1'
'{:-}'.format(-1)
#'-1'
'{: }'.format(1)
#' 1'
'{: }'.format(-1)
#'-1'
10進数にをn進数に変換
'{:b}'.format(12)#b:2進数
#1100
'{:o}'.format(12)#o:8進数
#'14'
'{:d}'.format(12)#d:10進数
#'12'
'{:x}'.format(12)#x:16進数
#'c'
'{:X}'.format(12)#X:16進数(アルファベット大文字)
#'C'
'{:#x}'.format(18)
#'0x12'
','で数を区切る
'{:,}'.format(1000000)
#'1,000,000'
小数
'{:f}'.format(0.12)
#'0.120000'
小数点以下の桁数を指定
'{:.2f}'.format(0.12345)
#'0.12'
'{:.5f}'.format(0.12345)
#'0.12345'

.。( C言語のprintfと似てる )

パーセントに変換する
'{:.0%}'.format(0.25)
#'25%'
'{:.1%}'.format(0.2546)
#'25.5%' .。(四捨五入される)

文章中に文字列や数を挿入(Python)

今回はformatを使ってみる

こういう感じ
name = 'ねこ'
print('あなたは{}ですか?'.format(name))
#あなたはねこですか?
複数の引数を用いる
print('今日は{0}か{1}か{2}が食べたい'.format('カレー','うどん','野菜炒め'))
print('今日は{m1}か{m2}か{m3}が食べたい'.format(m1='カレー',m2='うどん',m3='野菜炒め'))
#今日はカレーかうどんか野菜炒めが食べたい
順番通りだと省略できる
print('今日は{}か{}か{}が食べたい'.format('カレー','うどん','野菜炒め'))
#今日はカレーかうどんか野菜炒めが食べたい
リスト
lst = ['じゃがいも', 'かぼちゃ', 'トマト', 'にんじん', 'たまねぎ']
print('夕食の材料は{0[0]}と{0[3]}と{0[4]}です'.format(lst))
#夕食の材料はじゃがいもとにんじんとたまねぎです
辞書
dic = {'name': 'ねこ', 'color': 'white', 'age': '3'}
print('名前は{0[name]}、色は{0[color]}、歳は{0[age]}歳'.format(dic))
#名前はねこ、色はwhite、歳は3歳

次回は書式

関数を作る(Python)

今回は関数を作ることについて。理解していないことの多さを痛感。

関数の定義
def 関数名():
    処理
return
def name(na):
    return na

def hello():
    print(name('ねこ') + "さん、こんにちは!!")

#ねこさん、こんにちは!!

printで'+'をつけることを忘れそうになる

複数return

','で区切ることで複数の要素をreturnできる
○タプル
下のようにreturnすると、型はタプル

def test():
    return 'zero', 0

print(type(test()))
<class 'tuple'>

○リスト
'[]'で囲むことで型がリストになる

def test():
    return ['zero', 0]

print(type(test()))
#<class 'list'>
デフォルト引数
def 関数名(引数=デフォルト値,引数=デフォルト値):
    関数のブロック
#引数を指定せず関数を実行すると、デフォルト引数が入る
def name(na = '名無し'):
    return na

print(name() + "さん!")
#名無しさん!

print(name('ねこ') + "さん!")
#ねこさん!
デフォルト引数の注意点

デフォルト値は最初に一度だけしか評価されないので、
リストや辞書といった変更可能なオブジェクトを使う際、注意が必要

def list_beta(lst = []):
    lst.append('Hello')
    print(lst)
list_beta()
list_beta()
list_beta()
list_beta(['Good','Morning'])

#['Hello']
#['Hello', 'Hello']
#['Hello', 'Hello', 'Hello']
#['Good', 'Morning', 'Hello']

デフォルト引数は不変のものを設定する方が良い

def list_beta(lst = None):
    if lst is None:
        lst = []
    lst.append('Hello')
    print(lst)
    
list_beta()
list_beta()
list_beta(['Good','Morning'])

#['Hello']
#['Hello']
#['Good', 'Morning', 'Hello']

リスト(Python)

こんばんは、内容の順番がバラバラだなと思っています。
今回はリストについてです。
これからは内容だけでなく言語もバラバラになる予感がしています。
お気づきかもしれませんが、日によって常体敬体すらバラバラです。
今日は敬体の日です。

リストの定義
a = ["あ","い","う","え","お"]
#a = [要素1, 要素2, 要素3,......]
指定
a[0] #1番目の要素('あ')
a[-1] #最後の要素('お')
要素の書き換え
b = ["ka","き","く","け","こ"]
b[0] = "か"
#['か', 'き', 'く', 'け', 'こ']
要素の消去
#a = ['あ', 'い', 'う', 'え', 'お']
del a[-1]
#['あ', 'い', 'う', 'え']
スライスも使える
#a = ['あ', 'い', 'う', 'え']
del a[:3]
#['え']
要素を末尾に追加
#a = ['え']
a.append("お")
#['え', 'お']
要素を指定する場所に追加
#a = ['え', 'お']
a.insert(0,"あ")
#['あ', 'え', 'お']
スライスを使って追加
#a = ['あ', 'え', 'お']
a[1:1] = ["い","う","お"]
#['あ', 'い', 'う', 'お', 'え', 'お']
スライスを使って置換
#a = ['あ', 'い', 'う', 'お', 'え', 'お']
a[2:4] = ["う"] 
#['あ', 'い', 'う', 'え', 'お']
リストの足し算
a + b
#['あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ']
リストの結合
a.extend(b) #aのリストの最後にbのリストを結合
#a = ['あ', 'い', 'う', 'え', 'お', 'か', 'き', 'く', 'け', 'こ']

スライス(Python)

今回はスライスについて。
スライスを使うと、リストやタプルの要素、文字列の範囲を指定して、
必要な部分だけを取り出すことができる。

[start:stop]
num = {1,2,3,4,5,6,7,8,9}
print(num[2:5]) #num[2]からnum[4]まで
#[3, 4, 5]

また、

print(num[-1])
#9

であり、スライスでも負の値で場所を指定できる。

print(num[1:-1]) #num[1]からnum[-2]まで
#[2, 3, 4, 5, 6, 7, 8]
[start:stop:step]

増加量の指定も可能

print(num[1:5:2]) #num[1]からnum[4]まで2ずつ
#[2, 4]


増加量には負の値も指定できる

print(num[5:1:-1]) #num[5]からnum[2]まで1ずつ減少
#[6, 5, 4, 3]
省略

また、全ての範囲で実行したい場合、一つ目のコロンの両端の値を省略できる

print(num[::2])
#[1, 3, 5, 7, 9]

増加量も省略すると、num[0]からnum[-1]まで全ての範囲が表示される

print(num[::]) # ==print(num[:])==print(num)
#[1, 2, 3, 4, 5, 6, 7, 8, 9]

最初の位置を省略

print(num[:0:-1]) #num[-1]からnum[1]まで1ずつ減少
#[9, 8, 7, 6, 5, 4, 3, 2]

最後の位置を省略

print(num[-1::-1]) #num[-1]からnum[0]まで1ずつ減少
#[9, 8, 7, 6, 5, 4, 3, 2, 1]

つまり、最初と最後の位置を省略すると

print(num[::-1]) #num[-1]からnum[0]まで1ずつ減少
#[9, 8, 7, 6, 5, 4, 3, 2, 1]

つまり、[::-1]をつかうと逆順に並べ替えることができる
(いまいち活用法が思い浮かびませんが)

使ってみる

例えば、a,b,cと入力してc,b,aと出力したいとき、
スライスを使わずにやってみようとしたらこんなことに

char = input()
moji = list(char)
length = len(moji)
while 0 <= length-1:
    print(moji[length-1], end = '')
    length -= 1

長い!!そして美しくないと怒られそう

スライスを使うととてもコンパクトになる

char = input()
rahc= char[::-1] 
print(rahc)

for文その2(Python)

その2です。


fileを行単位で表示する

for file in open("memo.txt"):
    print(file)
#ファイルの中身が表示される

各要素のキーを表示させたい

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for k in dic:
    print(k)
#keya
#keyb
#keyc

keys()でもいける

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for k in dic.keys():
    print(k)
#keya
#keyb
#keyc

値を表示させたい
values()

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for v in dic.values():
    print(v)
#1
#2
#3

キーと値両方を表示させたい
items()

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for k, v in dic.items():
    print(k, v)
#keya 1
#keyb 2
#keyc 3

番号と値を表示させたい
enumerate()

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for num, value in enumerate(dic):
    print(num,dic[value])
#0 1
#1 2
#2 3

enumerate(dic,1)のように第二引数を指定すると、途中からカウントを始められる。

dic = {"keya": 1, "keyb": 2, "keyc": 3}
for num, value in enumerate(dic,1):
    print(num, dic[value])
#1 1
#2 2
#3 3


二つ以上のイテラブルオブジェクトをまとめて表示させたい
zip()

a = ["あ","か","さ","た","な"]
b = ["い","き","し","ち","に"]
c = ["う","く","す","つ","ぬ"]
d = ["え","け","せ","て","ね"]
e = ["お","こ","そ","と","の"]
for a,b,c,d,e in zip(a,b,c,d,e):
    print(a,b,c,d,e)
#あ い う え お
#か き く け こ
#さ し す せ そ
#た ち つ て と
#な に ぬ ね の

素数が異なる場合、多い要素は切り捨てられる。

for文その1(Python)

今日は、Pythonでのfor文についてです。
○基本の形

for 変数 in イテラブルオブジェクト:
    処理

イテラブルオブジェクトには辞書やリストやタプルがありますが、
イテレーションの仕組みについては理解力が追い付かなかったので後々理解したい。


繰り返す回数が決まっているときはrange()を使う

for 変数 in range(最初の数値,最後の数値,増加量):
#rangeでは、
#最初の数値と増加量は省略できる。
#最初の数値から最後の数値-1まで入ったリストが生成される。

こんな感じに3を5回0に足したりできる。(良い使い道がすぐにでてこない)

sum = 0
for i in range(5):
    sum += 3
    print(sum, end = ' ')#3 6 9 12 15 

Pythonではfor文の後に続けてelseが使える。

for i in range(5):
    print(i*i)
else:
    print("おわり")

ただし、次のように途中でループを抜けてしまうとelseは実行されない。

for i in range(5):
    print(i*i)
    if i == 3:
        break
else:
    print("おわり")

その2に続かせたい