「新・明解Pythonで学ぶアルゴリズムとデータ構造」で勉強日記#2

[前回の続きです](https://onl.la/H1J9pWY)
ただ単に続きをつらつら並べただけなのでほぼ模写なのですが。
規約違反だったらコメントで教えてください。

さて、毎回ある学びなのですが、ある程度pythonを触っていると、どういう表記が可で、どこら辺から不可なのかいまいちわからないんですよね。

そういう意味では[「新・明解Pythonで学ぶアルゴリズムとデータ構造」](https://www.amazon.co.jp/%E6%96%B0%E3%83%BB%E6%98%8E%E8%A7%A3Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-%E6%96%B0%E3%83%BB%E6%98%8E%E8%A7%A3%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9F%B4%E7%94%B0%E6%9C%9B%E6%B4%8B/dp/4815603197/ref=sr_1_2?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1BG3JS7CKMZA0&keywords=Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&qid=1644336329&sprefix=python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0%2Caps%2C212&sr=8-2)は「そういう書き方できるのか」という発見をくれるいい本だなと思いました。

仕事にできるほど熟達はしていないし専門知識もうっすらしかない程度で、身近に聞ける人もいないので、自分が初級者のどの段階にいるのかというのもわかりませんが、痒い所に手が届くような手ごたえを感じています。


#2値のソートと2値の変換


```python:list1-9
#aからｂまでの総和を求める

print('aからbまでの総和を求めます')
a = int(input('整数a:'))
b = int(input('整数b:'))

if a > b:
    a, b = b, a #2値の交換
    
sum = 0
for i in range(a, b + 1):
    sum += i
        
print(f'{a}から{b}までの総和は{sum}です。')

```
こういうのって最初に聞いたことあったっけ？てくらい単純かつなるほどな書き方。aとbを入れ替えるのに複雑な式とか考えがちだけど、こういうのでいいんだっていうプチ感動があります。

#繰り返しの過程における条件判定（その1）

```python:list1-10
#aからｂまでの総和を求める

print('aからbまでの総和を求めます')
a = int(input('整数a:'))
b = int(input('整数b:'))

if a > b:
    a, b = b, a #2値の交換
    
sum = 0
for i in range(a, b + 1):
    if i < b:
        print(f'{i} + ',end = '')
    else:
        print(f'{i} = ',end = '')
    sum += i
        
print(sum) 

```
上記は処理が長くなるので好ましくないらしい…。
というのもif文の処理がb回？あるので、10000回とかになったときに大変なんだとか？
ということで、下記↓

```python:list1-11
#aからｂまでの総和を求める

print('aからbまでの総和を求めます')
a = int(input('整数a:'))
b = int(input('整数b:'))

if a > b:
    a, b = b, a #2値の交換
    
sum = 0
for i in range(a, b ):
    print(f'{i} + ',end = '')
    sum += i
#aからb-1までの値の後ろに+をつけて出力

print(f'{b} = ',end = '')
sum += b
#b値の後ろに=をつけて出力

print(sum) 
```
どれくらい処理が変わるのかは実感はありませんが、やることは減ったような気がするのは確かになと。


#繰り返しの過程における条件判定（その2）

```python:list1-12
#記号と文字を交互に表示（その1）

print('記号文字+を-交互に表示します')
n = int(input('全部で何個：'))

for i in range(n):
    if i % 2:
        print('-', end='') #奇数
    else:
        print('+', end='') #偶数
#n=5を入れたとすると0,1,2,3,4をiにいれるので+-+-+という結果が得られる？
print()
```
奇数なら-偶数なら+を表記しますよという例。
if文のあと=とかいらないのか～って思いました。多分プログラミングやっている方からすれば普通なんでしょうけど、私には驚きという…。
ちなみにこれは余りがあればtrueってことでいいんですかね？ソウイウコト全然ワカラナイ…。
あと、オプション引数というのを今調べて知りました。
便利だなーと。
そしてこれまた、判定回数が増えるのでよくないとか…。
改良版が↓

```python:list1-13
#記号と文字を交互に表示（その2）

print('記号文字+を-交互に表示します')
n = int(input('全部で何個：'))

#'_'は変数の値をループ本体で使用しない
for _ in range(n // 2):
    print('+-', end='') 

if n % 2:
    print('+', end='')
#for文とif文が合わせてn割る２の商(for文)と余り(if文)に対応している。
print()
```
次はrangeの()内に数式入れるのかっていう驚き。なんとも初学者感まるだしで…。
あと_の使い方がさらっと説明されていたけど、よくわかりません！（タスケテ）

その２のif文についてもその１では奇数判定してたくせに、その２では偶数じゃんと思ったんですが、そもそもやっていることが違ったんですね汗

その１では、単純なfor文にrange関数を使っているので、inputに入れた数値から-1された数字が渡されるんですね。
その２では、forとifに使っている数式を合わせると商と余りの関係になるんですね。
なんだか算数からやり直したくなる気分。

こういった発想がプログラミングには大事なのかと記事を起こしながら思いました。

（記事書いてなかったら多分流してたな…。）
本日は以上です。ありがとうございました！