Python3認定エンジニア基礎試験メモ

## 備忘録
##### ●次のコードの出力結果として正しいものはどれか。

```python:PRIME STUDY第3回 問9
fruits = ['apple', 'kiwi', 'plum']
for f in fruits[:]:
    if len(f) < 5:
        fruits.insert(0, f)
        fruits.pop()

print(fruits, end = ' ')
```

:::note info
【正答】
['plum', 'kiwi', 'apple']

【解説】
まずfruits[:]により、リストfruitsの全要素のコピーを取得します。
コピーを使って変数fへ1要素ずつ代入処理するため、'apple' ,'kiwi', 'plum'の順に計3回ループ処理が行われます。

◆for①
　f：'apple'
　fruits：['apple', 'kiwi', 'plum']

◆for②
　f：'kiwi'
　fruits：['kiwi', 'apple', 'kiwi'] 　# fruits.pop()によって末尾の'plum'は取り除かれる。

◆for③
　f：'plum'
　fruits：['plum', 'kiwi', 'apple']　 # fruits.pop()によって末尾の'kiwi'は取り除かれる。
:::

##### ●次のような結果を得たい場合、コードの【A】の行に入る適切なものはどれか。
```python:PRIME STUDY第3回 問10
[ 実行結果 ]
Found an even number: 2
Found an odd number: 3
Found an even number: 4
Found an odd number: 5
Found an even number: 6

[ コード ]
for num in range(2, 7):
    if num % 2 == 1:
        print("Found an odd number:", num)
       【A】
    print("Found an even number:", num)
```

:::note info
【正答】
continue

【解説】
for num in range(2, 7): により、変数numは2～6まで変化し、計5回ループ処理が行われます。
[実行結果]から、numが2で割り切れない場合はif文中の処理を、それ以外はif文を抜けて後続処理へ進めたいため、【A】にcontinueを記載することでループの次のイテレーションを実行させることができます。

:::
:::note alert
continueではなくbreakを記載した場合、numが3のときにfor文が終了となる。
```python:補足
[ 実行結果 ]
Found an even number: 2
Found an odd number: 3

[ コード ]
for num in range(2, 7):
    if num % 2 == 1:
        print("Found an odd number:", num)
        break
    print("Found an even number:", num)
```

:::

##### ● 次の結果を得たい場合に、コード【A】に入るものとして適切なものはどれか。
```python:PRIME STUDY第3回 問16
[ 実行結果 ]
[(2, 'a'), (3, 'b'), (1, 'c')]

[ コード ]
pairs = [(3, 'b'),(1, 'c'),(2, 'a')]
pairs.sort(key =【A】)
print(pairs)
```
:::note info
【正答】
lambda arg:arg[1]

【解説】
リストpairsをソートする際のキーを、ラムダ式で引数として渡しています。
arg:arg[1]は、仮引数:式[インデックス]を表しているため、arg[1]では英字(a,b,c)を、arg[0]とした場合は数字(1,2,3)をキーとした昇順ソートが行われます。
なおargはあくまで仮引数のため、「x:y」や「pair:pair」などでも問題ありません。

:::

##### ●次のコードの実行結果として正しいものはどれか。
```python:PRIME STUDY第3回 問18
a = [1,3,4,6,3,5]
a.insert(3, -1)
a.pop(4)
a.remove(3)
print(a)
```
:::note info
【正答】
[1, 4, -1, 3, 5]

【解説】
・a.insert(3, -1)　
　→ a[3]の位置に-1を挿入する
  > [1,3,4,-1,6,3,5]

・a.pop(4)　　     
　→ a[4]の要素を取り除く
 > [1,3,4,-1,3,5]

・a.remove(3)
　→aから"値の3"を削除する 　  
 > [1,4,-1,3,5]
  ※複数ある場合は先頭の1つだけ削除
:::

##### ●対話モードで入力したときに「True」が返されるものは次のうちどれか。
```python:PRIME STUDY第3回 問24
1. (1, 2, 5, 20, 30) > (2, 3, 4, 5)
2. 'PHP' > 'Perl' > 'Python'
3. 'Matplotlib' > 'NumPy' > 'pandas' > 'scikit-learn'
4. (2,3,('aa','ab')) < (2,3,('abc','a'),5)
5. (-1, -10, -2, -5) > (-1, -2, -5)
```
:::note info
【正答】
4. (2,3,('aa','ab')) < (2,3,('abc','a'),5)
【解説】
イテラブルオブジェクト同士の比較の場合、それぞれの1つ目の要素から順番に取り出して比較されます。
合計や平均で比較するわけではありません。
例えば1.の場合、まず1>2と比較され、答えはFalseのため、後ろの要素の比較は行われません。
正答の4.の場合、('aa')<('abc')の要素で文字コードポイントによる比較が行われ、Trueとなります。
:::


##### ●次のコードを実行したときの処理として、正しいものはどれか。

```python:Exam App
import requests

url = 'https://www.google.com/'

for count in range(3):
    try:
        requests.get(url)
        print('success')
    except Exception:
        print('error')
    else:
        break
else:
    print('final')
```

【選択肢】
１．1回目でurlへのリクエストが成功すると、「success」と「final」が表示される。
２．1回目でurlへのリクエストが成功すると、「success」だけ表示される。
３．urlへのリクエストを3回繰り返してすべて失敗すると、「error」が3回表示され、「final」は表示されない。
４．urlへのリクエストが2回目で成功すると、「success」だけ表示される。


:::note info
【正答】
２．1回目でurlへのリクエストが成功すると、「success」だけ表示される。

【解説】
ループ処理で3回urlへのアクセスを試みます。

try節が成功した場合：else節でbreakされ、for文を抜けます。
try節で失敗した場合：except節へ進み、errorを出力する。

'final'を出力するelse節はfor文にかかっており、ループ処理がすべて失敗した場合にのみ実行されます。
そのため、本門の実行結果は以下の3パターンに分かれます。

＜実行結果＞
　パターン１：成功　→　success
　パターン２：失敗、成功　→　error, success
　パターン３：失敗、失敗、成功　→　error, error, success
　パターン４：失敗、失敗、失敗　→　error, error, error, final

:::