Pythonの独特な書き方まとめ

# はじめに
Python基礎を理解した人が、ここに記載のPython独特な書き方を把握すれば大体のプログラムを読めるようにすることを目的として、Pythonの独特な書き方をまとめました。
なお記載している内容は**私の主観**で、以下の条件を満たすものだけとしています。

* 初学者向けの教材に記載がない
* Pythonプログラムの中でよく使われることがある独特な書き方

とりあえず思いついたもののみ記載しておりますので、随時更新していきます。

# 対象読者
Pythonの基礎を理解している人を対象としております。
そのため細かな説明は一切記載しておりません。

# 記載内容の説明
以下のように、「通常の書き方」→「Pyhotn独特の書き方」の順番で記載しています。
初学者向けの教材に記載している内容で記載できる方法を、「通常の書き方」と表現しています。

```python:通常の書き方
プログラム

# 実行結果 -> XXX
```

```python:Python独特の書き方
プログラム

# 実行結果 -> XXX
```


# 内包表記
## リスト内包表記（その1）
```python:通常の書き方
numbers = []
for i in range(5):
    numbers.append(i)
    
print(numbers)

# 実行結果 -> [0, 1, 2, 3, 4]
```

```python:Python独特の書き方
numbers = [i for i in range(5)]
print(numbers)

# 実行結果 -> [0, 1, 2, 3, 4]
```

## リスト内包表記（その2）
```python:通常の書き方
numbers = []
for i in range(5):
    numbers.append("Hello")
    
print(numbers)

# 実行結果 -> ['Hello', 'Hello', 'Hello', 'Hello', 'Hello']
```

```python:Python独特の書き方
numbers = ['Hello' for i in range(5)]
print(numbers)

# 実行結果 -> ['Hello', 'Hello', 'Hello', 'Hello', 'Hello']
```

## リスト内包表記（その3）
```python:通常の書き方
numbers = []
for i in range(5):
    if i % 2 == 0:
        numbers.append(i)
    
print(numbers)

# 実行結果 -> [0, 2, 4]
```

```python:Python独特の書き方
numbers = [i for i in range(5) if i % 2 ==0]
print(numbers)

# 実行結果 -> [0, 2, 4]
```

## ディクショナリ内包表記
```python:通常の書き方
square = {}
for i in range(5):
    square[i] = i * i
    
print(square)

# 実行結果 -> {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
```

```python:Python独特の書き方
square = {i : i * i for i in range(5)}
print(square)

# 実行結果 -> {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
```

# 関数の引数
## アスタリスクが1つの引数
```python:通常の書き方
def test(args1, args2, args3):
    print(args1)
    print(args2)
    print(args3)
    
test('1st', '2nd', '3rd')

# 実行結果 -> 
1st
2nd
3rd
```

```python:Python独特の書き方
# *をつけると可変長引数となる
# *argsで引数を全て受け取る（アスタリスクから始まれば、名前は*args以外でも良い）
def test(*args):
    for arg in args:
        print(arg)
    
test('1st', '2nd', '3rd')

# 実行結果 -> 
1st
2nd
3rd
```
```python:Python独特の書き方
# *argsで引数の残りを全て受け取る
def test(args1, *args):
    for arg in args:
        print(arg)
    
test('1st', '2nd', '3rd')

# 実行結果 ->
2nd
3rd
```

## アスタリスクが2つの引数
```python:通常の書き方
def test(k1, k2, k3):
    print(k1)
    print(k2)
    print(k3)
    
test(k1='Key1', k2='Key2', k3='Key3')

# 実行結果 -> 
Key1
Key2
Key3
```

```python:Python独特の書き方
# **をつけると可変長引数となる
# **kwargsでキーワード付き引数を辞書型で全て受け取る（アスタリスクから始まれば、名前は**kwargs以外でも良い）
def test(**kwargs):
    for key in kwargs.values():
        print(key)

test(k1='Key1', k2='Key2', k3='Key3')

# 実行結果 -> 
Key1
Key2
Key3
```

```python:Python独特の書き方
# **kwargsでキーワード付き引数の残りを全て受け取る
def test(k1, **kwargs):
    for key in kwargs.values():
        print(key)

test(k1='Key1', k2='Key2', k3='Key3')

# 実行結果 -> 
Key2
Key3
```

## アスタリスクが1つの引数と2つの引数の混在
```python:通常の書き方
def test(args1, args2, args3, k1, k2, k3):
    print(args1)
    print(args2)
    print(args3)
    print(k1)
    print(k2)
    print(k3)

test('1st', '2nd', '3rd', k1='Key1', k2='Key2', k3='Key3')

# 実行結果 -> 
1st
2nd
3rd
Key1
Key2
Key3
```

```python:Python独特の書き方
def test(*args, **kwargs):
    for arg in args:
        print(arg)
    for key in kwargs.values():
        print(key)

test('1st', '2nd', '3rd', k1='Key1', k2='Key2', k3='Key3')

# 実行結果 -> 
1st
2nd
3rd
Key1
Key2
Key3
```

```python:Python独特の書き方
def test(args1, *args, k1, **kwargs):
    for arg in args:
        print(arg)
    for key in kwargs.values():
        print(key)

test('1st', '2nd', '3rd', k1='Key1', k2='Key2', k3='Key3')

# 実行結果 -> 
2nd
3rd
Key2
Key3
```

# lambda（ラムダ式、無名関数）
```python:通常の書き方
def goukei(a, b):
    print(a + b)
    
goukei(5, 10)

# 実行結果 -> 15
```

```python:Python独特の書き方
# 書き方は「lambda 引数 : 処理内容」
goukei = lambda a, b : print(a + b)
goukei(5, 10)

# 実行結果 -> 15
```

# プロパティ（getter、setter）
```python:通常の書き方
class Test:
    def __init__(self):
        self.name = "yamada"

    def getName(self):
        return self.name
 
    def setName(self, name):
        self.name = name
 
    def delName(self):
        del self.name


obj = Test()
print(obj.getName())

obj.setName('tanaka')
print(obj.getName())

obj.delName()

# 実行結果 -> 
yamada
tanaka
```

```python:通常の書き方
class Test:
    def __init__(self):
        self.name = "yamada"

    def getName(self):
        return self.name
 
    def setName(self, name):
        self.name = name
 
    def delName(self):
        del self.name
        
    name = property(getName, setName, delName)    # 追記


obj = Test()
print(obj.name)

obj.x = 'tanaka'
print(obj.name)

obj.delName()

# 実行結果 -> 
yamada
tanaka
```

```python:Python独特の書き方
class Test:
    def __init__(self):
        self._name = "yamada"
 
    @property
    def name(self):
        return self._name
 
    @name.setter
    def name(self, name):
        self._name = name

    @name.deleter
    def name(self):
        del self._name
         
 
obj = Test()
print(obj.name)

obj.name = 'tanaka'
print(obj.name)

del obj.name

# 実行結果 -> 
yamada
tanaka
```

# 計算
```python:通常の書き方
n = 1
if n < 0:
    print(5 + 5)
else:
    print(5 - 5)

# 実行結果 -> 0
```

```python:Python独特の書き方
n = 1
5 + (5, -5)[n < 0]

# 実行結果 -> 10
```

```python:Python独特の書き方
n = -1
5 + (5, -5)[n < 0]

# 実行結果 -> 0
```