Python3エンジニア認定基礎試験 勉強してみた3

# 「Python3エンジニア認定 ［基礎試験］」 合格を目指します。

使用教材：
・Pythonチュートリアル第4版 --オライリー・ジャパン--
・徹底攻略Python3エンジニア認定基礎試験 問題集 --impress--

前回の記事：
・[Python3エンジニア認定基礎試験 勉強してみた1](https://qiita.com/SHIRYU_0515/private/80be254354edc001258b)
・[Python3エンジニア認定基礎試験 勉強してみた2](https://qiita.com/SHIRYU_0515/private/84910ca285536e792ffe)

こんにちは！引き続き
徹底攻略Python3エンジニア認定基礎試験 問題集を解きました。
今回は正答率がかなり低いです。一度参考書を流し読みしただけでは限界がありますね。

第5章 **関数** 
**10問中5問正解**
第6章 **その他コレクションの操作**
**10問中1問正解**

## 見直し
**【デフォルト値】**
```ruby:書式：引数にデフォルト値を設定する
default_message_1 = "Hello"

def message(message_1=default_message_1, message_2=""):
    print(f"{message_1} {message_2}")

default_message_1 = "こんにちは"
message_2 = "world"

message(message_2=message_2)
```
```ruby:実行結果
Hello world
```

**【アンパック】**
リストおよびタプルは、
*を先頭に付けることで、要素を位置引数に展開して関数に渡せます。
これをアンパックと呼びます。
また、ディクショナリは**を先頭に付けることで、キーワード引数として指定できます。
```ruby:
def concat(*args, sep="/"):
    """引数sepの文字列で区切って引数argsの文字列を連結する"""
    return sep.join(args)

words = ["spam", "ham", "eggs"]
option = {"sep":"&"}
# 変数words(リスト)と変数options(ディクショナリ)を
# アンパックしてconcat()関数に渡す
print(concat(*words, **options))
```
```ruby:実行結果
spam&ham&eggs
```

*が先頭に付いた仮引数には、指定済みの実引数を除く位置引数のタプルが入ります。
**が先頭に付いた仮引数には、指定済みの実引数を除くキーワード引数のディクショナリが入ります。
```ruby:
def function(name, *args, **kwargs):
    print(name)
    print(args)
    print(kwargs)

function("spam", "ham", kwarg1="eggs", kwarg2="spamhameggs")
```

```ruby:実行結果
spam
('ham')
{'kwarg1': 'eggs', 'kwarg2': 'spamhameggs'}
```
**【lambda式】**
無名関数と呼ばれる種類の関数です。
通常の関数定義とは異なり、単一の式しか持てないという特徴があります。
**「lambda 引数: 式」** という書き方をし、式の結果が返り値になります。
```ruby:
func = lambda a, b: (b + 1, a * 2)
x, y = 1, 2
x, y = func(x, y) # lambda式の引数a, bはそれぞれ1, 2で、返り値は(3, 2)
print(x, y)
```
```ruby:実行結果
3 2
```

**【collections.deque】**
collections.dequeは、キューのように扱えるデータ構造です。
一般的なキューでは、要素は末尾に追加され、
取り出すときは必ず先頭（左端）の要素から取り出されますが、
collections.dequeでは、これらの操作をappend(要素)とpopleft()で行います。
```ruby:例：collections.dequeによるキュー処理
# "apple","banana"という要素を持ったdequeを作成
queue = deque(["apple", "banana"])
# キューの末尾に"lemon"を追加
queue.append("lemon")
# キューの左端の要素("apple")を取り出す
queue.popleft()
# キューの末尾に"mango"を追加
queue.append("mango")
# キューの左端の要素("banana")を取り出す
queue.popleft()
# キューの末尾に"peach"を追加
queue.append("peach")
# キューの左端の要素("lemon")を取り出す
queue.popleft()
# キューを表示
print(queue)
```
```ruby:実行結果
deque(['mango', 'peach'])
```

**【タプル】**
タプルはリストと同じく複数の値を扱うためのデータ型です。
一般的なタプルの定義は、カンマ区切りの要素を括弧「（）」で囲むことです。

```ruby:タプルを定義する
sample_tuple = ("spam", "ham", "eggs")
```
```ruby:（）を省略してタプルを定義する。
sample_tuple = "spam", "ham", "eggs"
```
```ruby:要素が1つのタプルを定義する
sample_tuple = "spam",
```
```ruby:tuple()関数でタプルを定義する
sample_tuple = tuple(["spam", "ham", "eggs"])
```
またリストとタプルには数値と文字列などの異なるデータ型の要素を格納できます。
```ruby:リストに数値と文字列を格納する
sample_list = [1, "2", 3]
```
```ruby:タプルに数値と文字列を格納する
sample_tuple = ("1", 2, "3")
```
**【set】**
setとは集合を扱うデータ型のことで、要素を重複しないように保持する。
また、2つのset同士で、和集合や差集合といった集合演算を行えます。
setはset()関数によって定義できます。set()関数の引数はリスト、タプルといった反復可能体です。
```ruby:setをリストで定義する
s1 = set([1, 2, 3, 4, 5])
```
```ruby:setをタプルで定義する
s2 = set((1, 3, 5))
```
**[ディクショナリ]**
複数の値を扱うためのデータ型の1つです。
**キー**を使って値を参照・更新します。
```ruby:書式：ディクショナリの定義
変数 = {キー: 値1, キー2: 値2, ・・・}
```
文字列、タプル、数値などの不変体をキーとして指定できる。
リストなどの可変体はキーとして指定できない。

**【in演算子】**
「値 in ディクショナリ」のように、ディクショナリに対してin演算子を使うことでキーの存在を確認できます。

**【内包表記】**
ディクショナリを1行だけで作成する方法を、内包表記といいます。
```ruby:書式：内包表記でディクショナリの定義
{キーの式: 値の式 for 変数 in 反復可能体}
```
```ruby:内包表記でディクショナリの定義
d = {x: x**3 for x in (1, 3, 6)}
```
```ruby:内包表記のキーを式にする
d = {x**2: x**3 for x in (1, 3, 6)}
print(d)
```
```ruby:実行結果
[1: 1, 9: 27, 36: 216]
```
```ruby:内包表記でリストを定義
sample_list = [i for i in range(1, 11)]
print(sample_list)
```
```ruby:実行結果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

次の記事
[Python3エンジニア認定基礎試験 勉強してみた4](https://qiita.com/SHIRYU_0515/private/ca084cfcda58987806ca)