본문 바로가기

python tutorial -4 제어 흐름 도구

https://docs.python.org/ko/3/tutorial/controlflow.html#default-argument-values


python tutorial 4 기타 제어 흐름 도구 その制御フローツール


if - elif - else

for-in

range(-10,-100-30) / range(len(a)) / print(range(10))

break / continue / else / psss 

def 함수이름(매개변수):

도큐멘테이션 문자열 (docString)

매개변수 - 기본인자 / 키워드인자 / 가변인자

언패킹 (*리스트, 튜플 / **딕셔녀리)

람다식

어노테이션

PEP8






4.1. if if


>>> x = int(input("Please enter an integer: "))
Please enter an integer: 42
>>> if x < 0:
...     x = 0
...     print('Negative changed to zero')
... elif x == 0:
...     print('Zero')
... elif x == 1:
...     print('Single')
... else:
...     print('More')
...
More

 


elif

'else if' 줄임. 과도한 들여쓰기를 피하는 데 유용

if - elif 시퀀스는 switch - case 문을 대신



キーワード 'elifは 'else if' くしたもので過剰なインデントをけるのに役立ちます

一連の if ... elif ... elif ... 言語における switch や case 代用となります

 


 


4.2. for

 

파스칼- 항상 숫자의 산술적인 진행을 통해 반복

C - 사용자가 반복단계와 중지 조건을 정의


Python の for 

読者が 言語や Pascal 言語使いなれているかもしれない for とはいます

(Pascal のように算術型数列にわたる反復ったり

(C のように繰返しステップと停止条件両方ともユーザが定義できるようにするのとは


파이썬 - 시퀀스(리스트나 문자열)의 항목들을 차례대로 변수에 대입하며 반복

Python の for 任意のシーケンス型 (リストまたは文字列にわたって反復います

反復順番はシーケンス要素れる順番です


※ 이터레이트 iterate : 반복 反復

 

구조 

for 변수 in 리스트(또는 튜플, 문자열):
    수행할 문장1
    수행할 문장2
    ...
>>> # Measure some strings:
... words = ['cat', 'window', 'defenestrate']
>>> for w in words:
...     print(w, len(w))
...
cat 3
window 6
defenestrate 12

 

 

시퀀스를 반복 시, 사본이 만들어지지는 않음

시퀀스를 수정할 필요가 있다면 사본을 만들기 - 조건에 슬라이스 문 편리words[:]

 

ループ内部でイテレートしているシーケンスを修正する必要があれば (えば選択されたアイテムを複製するために)

最初にコピーをることをおめします

シーケンスにするイテレーションは暗黙にコピーをりませんスライス記法はこれを便利にします

>>> for w in words[:]:  # Loop over a slice copy of the entire list.
...     if len(w) > 6:
...         words.insert(0, w)
...
>>> words
['defenestrate', 'cat', 'window', 'defenestrate']

 

위 예에서

for w in words[:]: 대신 for w in words: 으로 입력하면

If문에서 ‘defenestrate‘word[0]에 계속 삽입하여 무한 루프가 됨.

 

for w in words:

このdefenestrate 何度挿入することで無限リストを作成しようとします

 

 

 


4.3. range( ) 함수 range() 関数

 

range(n)

n만큼 수열생성 범위 생성 

반복문 조건 만들 때 편리

range(5) : 0~4

 

数列にわたって反復必要がある場合関数 range() 便利です

この関数算術型数列生成します:

 

>>> for i in range(5):
...     print(i)
...
0
1
2
3
4

 

끝값은 만들어지는 수열에 포함 x

    range(10) 10개. 길이 10시퀀스 인덱스


指定した終端値生成されるシーケンスにはりません

range(10) は 10 生成さ 10 のシーケンスにおける各項目のインデクスとなります


range(시작, 끝, 스텝) 

스텝 : 증가분 (음수가능)


range から開始したり増加量指定することもできます:

(でも; 増加量'ステップ(step)' ばれることもあります)

 

range(5, 10)

5, 6, 7, 8, 9

 

range(0, 10, 3)

0, 3, 6, 9

 

range(-10, -100, -30)

-10, -40, -70

 


for i range(len(n))

range() len() のようにわせられます:

 

>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
...     print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb

 

enumerate()가 편리

しかしくの場合は enumerate() 関数使便利です



range() - print()해보기.

range 直接出力するとなことになります:

 

>>> print(range(10))
range(0, 10)

 

 

range() : 리스트가 아님 -> 공간 절약

 

range() すオブジェクトはいろいろなでリストであるかのようにいますが本当はリストではありません

これはイテレートしたんだ数列連続した要素すオブジェクトです

しかし実際にリストをるわけではないのでスペースの節約になります

 

 

이터러블 (イテラブル iterable)

멤버들을 한 번에 하나씩 돌려 줄 수 있는 객체 - ex) list, str, tuple

소진될 때까지 항목을 구하는 함수와 구조의 조건으로 적합

for문 : for item in iterable

list() : 이터러블로 리스트생성

 

このようなオブジェクトは イテラブル (iterable) ばれます

これらは関数やコンストラクタのターゲットとしてあるだけの項目逐次与えるのにしています

for がそのような イテレータ であることはすでにてきました

関数 list() もまたつのですこれはイテラブルからリストを生成します:

  

>>> list(range(5))
[0, 1, 2, 3, 4]



 


4.4. break continue, 그리고 else

 

break

가장 가까운 루프로부터 빠져나감

break 文 : C 言語じく内側for または while ループを中断します

 

 

else 

루프 종료 시 실행

- for : 리스트 소진

- while : 조건 거짓

루프가 break 문으로 종료할 때는 실행 x

 

ループelse つことができます

(for) 反復処理対象のリストを使ってループが終了したとき

(while) 条件になったときに実行されますが

break でループが終了したときは実行されませんこの動作

 

 


소수를 찾는 루프

素数す ループ

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print(n, 'equals', x, '*', n//x)
...             break
...     else:
...         # loop fell through without finding a factor
...         print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

 

(else if문이 아니라 for 루프에 속합니다.)

(else if ではなく for ループにしています)

 

 

try - else와 비슷

try - else : 예외가 발생하지 않을 때 실행

루프 - else : break 가 발생하지 않을 때 실행

 

 

ループの else if else よりも try else ています。 

try else 例外発生しなかった実行されループの else break されなかった場合実行されます

try 例外についての詳細例外処理する を参照してください

 

 

 

continue 

반복문을 이어서 함. 

continue를 만나면 반복문 처음으로 돌아가 수행.

continue 文 C 言語からりてきたものでループののイテレーションを実行します:

 

 

>>> for num in range(2, 10):
...     if num % 2 == 0:
...         print("Found an even number", num)
...         continue
...     print("Found a number", num)
Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9

 

 


4.5. pass

 

pass

아무것도 하지 않음

문법적으로 문장이 필요하지만, 할 일이 없을 때 사용

 

もしません

くことが構文上要求されているがプログラム上何動作もする必要がない使われます:

 

>>> while True:
...     pass  # Busy-wait for keyboard interrupt (Ctrl+C)
...

 


    - 최소 클래스 생성 시

    最小のクラスをるときによく使われる方法です:

 

>>> class MyEmptyClass:
...     pass
...

 

 

    - 새로운 코드를 작성 시

함수나 조건부 바디를 채움

            더 추상적으로(유연하게) 생각 할 수 있게 도와줌

 

pass のもう 1 つの使

しいコードをいているときの関数条件文仮置きの本体としてです

こうすることでより抽象的なレベルでけられます

pass 何事無視されます

 

>>> def initlog(*args):
...     pass   # Remember to implement this!
...

 

 

 


4.6. 함수 정의  関数定義する

 

피보나치 수열 (임의 한도까지 피보나치 수열 구하기)

フィボナッチ数列 (Fibonacci series) : 任意上限値まですような関数作成できます:

 

>>> def fib(n):    # write Fibonacci series up to n
...     """Print a Fibonacci series up to n."""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

 

 

함수 만드는 방법

def 함수 이름(매개변수):

    body

 

함수정의 키워드 def

반드시 들여쓰기 후 body 작성


def 関数定義 (definition) くキーワードです

def には関数名仮引数丸括弧んだリストをけなければなりません

関数実体構成する実行文からインデントされていなければなりません

 



독스트링(docstring)

함수 바디의 첫 문장함수의 도큐멘테이션 문자열

호출 시, 자동생성되는 문자열 -> 설명서

권장, 좋은 관습

사용자들이 대화형으로 코드를 열람할 수 있도록 하는 도구

 

関数本体記述する最初文字列リテラルにすることもできます

この文字列関数のドキュメンテーション文字列 (documentation string) docstring

ドキュメンテーション文字列使ったツールにはオンライン文書印刷文書自動的生成したり

ユーザが対話的にコードから直接閲覧できるようにするものがあります

自分くコードにドキュメンテーション文字列れるのはよい習慣ですをつけてください

 


함수의 지역변수는 지역 심볼 테이블에 저장/참조

함수 실행 시함수 지역 변수를 위해 새로운 심볼 테이블을 생성 - 지역 심볼 테이블

* 변수 참조 순서 : 지역 심볼 테이블 -> 전역 심볼 테이블 -> 내장 테이블

      * 전역변수는 함수에서 직접 대입 x (global 문으로 명시하지 않는 이상 / 참조는 가능)

 

 

関数実行 (execution) するとき

関数ローカル変数のために使われるたなシンボルテーブル (symbol table) 用意されます

関数内変数への代入うとそのすべてこのローカルなシンボルテーブルに記憶されます

 

一方変数参照うと

まずローカルなシンボルテーブル検索され

にさらに外側関数のローカルなシンボルテーブルを検索

そのグローバルなシンボルテーブル調

最後みの名前テーブル調べます

 

って関数ではグローバルな変数参照することはできますが直接値代入することはできません

(global 名前げておかない)

 

 

그래서

인자들은 값에 의한 호출로 전달 (call by value) - 값은 항상 객체의 값이 아니라 객체의 참조

사실, 객체 참조에 의한 호출이 더 좋은 표현 (call by object reference)

가변 객체가 전달되면, 호출자는 피호출자가 만든 변경을 볼 수 있기 때문 ( ex) 리스트에 항목 추가)


 

関数実際引数 (実引数) 関数されるときに関数のローカルなシンボルテーブルまれます

そうすることで引数値渡(call by value) 関数されることになります 

(ここでの (value) とはにオブジェクトへの 参照(reference) をいいオブジェクトのそのものではありません)

実際にはオブジェクトへの参照渡(call by object reference) けばよいのかもしれません

変更可能なオブジェクトがされると関数された関数がオブジェクトにったどんな変更 にもくわすことになるからです

(: リストに挿入された要素)

 


 함수가 다른 함수를 호출할 때도그를 위한 새 지역 심볼 테이블을 생성 

関数がほかの関数すときにはたなしのためにローカルなシンボルテーブルがたに作成 

 


함수 이름 바꾸는 방법 ( 변수에 함수 명 대입!)

변수에 함수명을 대입하면서 함수이름을 바꿀 수 있음!

물론 함수 역할 가능! 


함수를 정의하면현재 심볼 테이블에 함수 이름을 생성

함수 이름은 인터프리터가 사용자 정의 함수로 인식하는 형식

이 값은 다른 이름으로 대입 가능하며 함수로도 사용가능.

이것이 이름을 바꾸는 일반적인 방법

 

関数定義うと関数名現在のシンボルテーブルれられます

関数名インタプリタからはユーザ定義関数 (user-defined function) として認識されるちます

この名前代入してにその名前関数として使うこともできます

これは一般的名前変更のメカニズムとしてきます:

 

 

>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89

 

 

None

다른 언어라면, fib 가 값을 돌려주지 않기 때문에 함수가 아니라 프로시저라고 생각할 수 있습니다.

return 문이 없는 함수의 값 : None

None 값 출력 X - print( ) 로 확인 가능


言語出身からはfib さないので関数ではなく手続(procedure) だと異論があるかもしれませんね

技術的えば実際には return たない関数もややつまらないですがしています

このNone ばれます (これはみの名前です)None だけをそうとするとインタプリタは通常出力抑制します

本当出力したいのなら以下のように print() 使うとることができます:

 

>>> fib(0)
>>> print(fib(0))
None

 


 


범위 까지의 피보나치 수열의 값을 '리스트'로 얻는 함수

フィボナッチ数列からなるリストを出力するわりにすような関数くのは簡単です:

  

>>> def fib2(n):  # return Fibonacci series up to n
...     """Return a list containing the Fibonacci series up to n."""
...     result = []
...     a, b = 0, 1
...     while a < n:
...         result.append(a)    # see below
...         a, b = b, a+b
...     return result
...
>>> f100 = fib2(100)    # call it
>>> f100                # write the result
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

 

 

 

return

함수의 반환 값

return 문이없으면 return 값은 None

 

return

関数からします

return 引数となるがない場合None ります

関数終了したときにも None ります

 

 

result.append(a)

- obj.methodname

obj = 객체

methodname = 객체에 '속하는' 함수. 정의된 메서드

- 리스트 객체 : result / 메소드 : append / 인자 : a

 

result.append(a)

リストオブジェクト result の メソッド (method)しています

メソッドとはオブジェクトに 'している' 関数のことで

obj らかのオブジェクト (であってもいません)

methodname をそのオブジェクトで定義されているメソッドとすると

obj.methodname されます

 

 

형 마다 각각 다른 메소드를 정의

다른 형의 메소드는 이름 중복 가능

클래스를 생성하며 형과 메소드 정의

 

なるなるメソッドを定義しています

なるのメソッドで名前のメソッドをつことができあいまいさをじることはありません

(クラス (class) 使うことで自前のオブジェクトとメソッドを定義することもできますクラス 参照)

 

 

append(값)

리스트 마지막항에 값 추가하는 메소드

result = result + [a] 보다 더 효율적

 

append()

リストオブジェクトで定義されています; このメソッドはリストの末尾たな要素追加します

append() result = result + [a] 等価ですがより効率的です

 




4.7. 함수 정의 더 보기 関数定義についてもう

 

함수에 대입하는 인자는 3가지 형식이 있고 조합이 가능하다.

- 기본인자 (위치 인자)

- 키워드 인자

- 임의 인자 (가변인자)


 

可変個引数関数定義することもできます

引数定義方法には 3 つの形式がありそれらをわせることができます

 

 


4.7.1. 기본 인자 값 デフォルトの引数値

 

def add(a, b):  # a, b는 매개변수
    return a+b

print(add(3, 4))  # 3, 4는 인수, 인자


기본 인자

하나 이상


もっとも便利なのは以上引数してデフォルトの指定する形式です

この形式使うと定義されている引数よりない個数引数せる関数作成します:

 

def ask_ok(prompt, retries=4, reminder='Please try again!'):
    while True:
        ok = input(prompt)
        if ok in ('y', 'ye', 'yes'):
            return True
        if ok in ('n', 'no', 'nop', 'nope'):
            return False
        retries = retries - 1
        if retries < 0:
            raise ValueError('invalid user response')
        print(reminder)


‘ask_ok’  인자 : 3개. prompt / reries=4 / reminder='Please try again!' 

여기서 기본인자는 prompt

뒤 reries / reminder 는 키워드 인자. 이미 값이 정해져 있음.


 

꼭 필요한 인자            ask_ok('정말 끝내길 원하세요?')

선택적 인자 하나         ask_ok('파일을 덮어써도좋습니까?', 2)

모든 인자                   ask_ok('파일을 덮어써도 좋습니까?', 2, ', 예나 아니요로만 답하세요!')

 

必須引数のみえる:                ask_ok('Do you really want to quit?')

つのオプション引数える:     ask_ok('OK to overwrite the file?', 2)

ての引数える:                   ask_ok('OK to overwrite the file?', 2, 'Come on, onlyyes or no!')

 

 

in : 시퀀스에 있는 값 검사


このでは in キーワードが導入されています

このキーワードはシーケンスが特定んでいるかどうか調べるのに使われます

 

 

기본값 

: 함수 정의 시점에 정의되고 있는 스코프(범위)정의


デフォルト

関数定義された時点関数定義している スコープ (scope) 評価されるので

 

i = 5

def f(arg=i):
    print(arg)

i = 6
f()

5 를 인쇄한다.

5 出力します

 


중요

기본값은 한 번만 값이 구해짐

이것은 기본값이 리스트, 딕셔너리, 클래스의 인스턴스와 같은 가변 객체일 때 차이를 만듭니다.

예를 들어, 다음 함수는 계속되는 호출로 전달된 인자들을 누적 함.

 

 

重要警告

デフォルト1 だけしか評価されません

デフォルトがリストや辞書のような変更可能なオブジェクトのにはその影響がでます

えば以下関数関数呼しで関数されている引数累積します:

 

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

 

결과 :

[1]

[1, 2]

[1, 2, 3]

 

 

연속 호출 시, 기본값이 축적되지 않기를 원한다면

後続関数呼しでデフォルト共有したくなければわりに以下のように関数くことができます:

 

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

 

 

 


4.7.2. 키워드 인자 キーワード引数

 

키워드 인자 (kwarg)

    형식 : kwarg=value

 

関数kwarg=value という形式の キーワード引数 使ってすこともできます

 

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print("-- This parrot wouldn't", action, end=' ')
    print("if you put", voltage, "volts through it.")
    print("-- Lovely plumage, the", type)
    print("-- It's", state, "!")

 

필수 인자(기본인자) : voltage 

선택 인자 : state, action, type

必須引数 (voltage

オプション引数 (stateactiontype) けます

 

정상 :

parrot(1000)                                                         # 1 positional argument

parrot(voltage=1000)                                             # 1 keyword argument - 필수인자도 키워드인자처럼

parrot(voltage=1000000, action='VOOOOOM')           # 2 keyword arguments

parrot(action='VOOOOOM', voltage=1000000)           # 2 keyword arguments - 순서 상관 x

parrot('a million', 'bereft of life', 'jump')                    # 3 positional arguments

parrot('a thousand', state='pushing up the daisies')     # 1 positional, 1 keyword

 


에러 :

parrot()                                              # 필수인자 는 꼭!

parrot(voltage=5.0, 'dead')                     # 키워드 인자는 뒤에 와야 위치

parrot(110, voltage=220)                       # 하나의 인자에 두 개 값 입력 x

parrot(actor='John Cleese')                    # 잘못된 키워드인자 대입 x

 

 

- 키워드인자는 항상 위치인자 뒤에

- 잘못된 키워드인자 대입 x (ex) actor)

- 순서 상관 x

- 필수인자(위치인자)도 키워드 인자처럼 값을 전달 ok. (ex) parrot(voltage=1000))

- 어떤 인자도 두 개 이상의 값을 받을 수 없음.

 

- 関数しにおいてキーワード引数位置引数でなければなりません

- 渡されるキーワード引数関数けられる引数のいずれかに対応していなければならず

(えばactor はこの parrot 関数引数として適切ではありません)

- 順序重要ではありません

- これはオプションでない引数でも同様です (えばparrot(voltage=1000) 適切です)

- いかなる引数複数回れません

 

 

>>> def function(a):
...     pass
...
>>> function(0, a=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: function() got multiple values for keyword argument 'a'

    - 에러 이유 : funtion의 인자 a 값으로 0 과 a=0 이렇게 2개를 대입하고 있다.

 



매개변수 **name

형식 매개변수들에 대응하지 않는 모든 키워드 인자들을 담음. (매핑 형)

*name형식과 조합 : 형식 매개변수 목록 밖의 위치 인자들을 담은 튜플을 받습니다.

(*name **name 앞에 나와야 합니다.)

 

仮引数最後**name 形式

それまでの仮引数対応したものをくすべてのキーワード引数った辞書ります(マッピング)

*name 形式をとる仮引数のリストをえた位置引数ったタプルを引数わせることができます

(*name **name よりになければなりません)

 

정의

def cheeseshop(kind, *arguments, **keywords):
    print("-- Do you have any", kind, "?")
    print("-- I'm sorry, we're all out of", kind)
    for arg in arguments:
        print(arg)
    print("-" * 40)
    for kw in keywords:
        print(kw, ":", keywords[kw])

 

호출

cheeseshop("Limburger", "It's very runny, sir.",
           "It's really very, VERY runny, sir.",
           shopkeeper="Michael Palin",
           client="John Cleese",
           sketch="Cheese Shop Sketch")

 

결과

 

-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
shopkeeper : Michael Palin
client : John Cleese
sketch : Cheese Shop Sketch

 

 

입력ㄷ한 키워드 인자들의 순서와 출력 순서 일치

なお複数のキーワード引数えた場合それらが出力される順序関数呼しでえられた順序じになります

 

 


4.7.3. 임의인자 리스트 任意引数リスト

 

입력값이 몇개 인지 정해지지 않은 인자 (가변인자. 많이 사용 되지 않음)

*args

튜플로 저장

앞에 0개 이상의 인자들이 올 수 있음.

 

関数任意個数引数せるよう指定する方法

使うことのない選択肢

これらの引数はタプルに格納されます

可変個引数ゼロかそれ以上引数があってもいません

 

def write_multiple_items(file, separator, *args):
    file.write(separator.join(args))

 

 

보통

매개변수 마지막에 위치 : 남은 입력 인자 전부를 모으기 위해

*args 뒤는 모두 '키워드 인자‘가 위치

 

通常 

可変引数関数される入力引数りをるために仮引数リストの最後かれます

*args 引数にある仮引数'キーワード専用' 引数位置引数ではなくキーワード引数としてのみ使えます

 

 

>>> def concat(*args, sep="/"):
...     return sep.join(args)
...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'

 




4.7.4. 인자 목록 언 패킹 引数リストのアンパック

 

언 패킹


* 연산자 : 리스트, 튜플 언패킹함.

ex) range() 함수 : start, stop 인자 필요  list(range(*args))


引数がすでにリストやタプルになっていて個別位置引数要求する関数呼しにすためにアンパックする必要がある場合には状況こります

えば関数 range() 引数 start stop える必要があります

個別引数えることができない場合関数呼しを * 演算子使ってリストやタプルから引数をアンパックします:

  

>>> list(range(3, 6))            # normal call with separate arguments
[3, 4, 5]

>>> args = [3, 6] >>> list(range(*args)) # call with arguments unpacked from a list [3, 4, 5]

 



** 연산자 : 딕셔너리 언패킹

じやりかたで** オペレータを使って辞書でもキーワード引数すことができます:

 

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print("-- This parrot wouldn't", action, end=' ')
...     print("if you put", voltage, "volts through it.", end=' ')
...     print("E's", state, "!")
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !





4.7.5. 람다식 ラムダ

 

lambda

이름 없는 작은 함수 생성

lambda a, b: a+b. (두 인자의 합을 돌려주는 함수)

함수 객체가 있어야 하는 곳이면 어디나 람다 함수가 사용가능

문법적으로 하나의 표현 식으로 제한

의미적으로는, 일반적인 함수 정의의 편의 문법일 뿐

중첩된 함수 정의처럼, 람다 함수는 둘러싸는 스코프에 있는 변수 참조가능

 

キーワード lambda 使うと

名前のないさな関数生成できます

えば lambda a, b: a+b つの引数関数です

ラムダ関数関数オブジェクトが要求されている場所にならどこでも使うことができます

ラムダ構文上単一制限されています

意味付にはラムダ形式通常関数定義構文的糖衣をかぶせたものにぎません

子構造になった関数定義同様ラムダもそれをむスコープから変数参照することができます:

 



ex) 함수를 돌려 주는 람다식

関数すところでラムダ使っています

 

>>> def make_incrementor(n):
...     return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43

 


ex) 작은 함수를 인자로 전달

ちょっとした関数引数としてすのに使っています:

 

>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key = lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

 

    .sort(key=기준) : 인자들을 기준에 맞게 정렬함 (영어단어이면 알파벳 순)

 

 



4.7.6. 도큐멘테이션 문자열. ドキュメンテーション文字列

 

첫 줄 객체의 간단한 설명.  목적을 간결하게 요약

이름이나 형 언급 x - 다른 방법으로 제공 (이름이 작업을 설명하면 예외)

대문자로 시작 / 마침표로 끝

 

最初対象物目的簡潔にまとめたものでなくてはなりません

簡潔くために対象物名前明示する必要はありません

名前方法でもられるからです (名前がたまたま関数演算内容記述する動詞である場合例外です)

最初大文字まりピリオドでわっていなければなりません

 

 

여러 줄 :

두 번째 줄은 빈칸으로 - 요약, 설명을 분리.

그 다음 - 호출 규약, 부작용 등 설명

 

ドキュメンテーション文字列中にさらに記述すべきがある場合

二行目空行にしまとめのりの記述部分視覚的分離します

つづくつまたはそれ以上段落対象物規約副作用について記述します

 

 

파이썬 파서는 문자열 리터럴의 들여쓰기를 이어 줌

설명서를 처리하는 도구로 필요하다면 들여쓰기를 제거해야 함

 

Python のパーザは複数行にわたる Python 文字列リテラルからインデントをらないので

ドキュメントを処理するツールでは必要じてインデントをらなければなりません

 

관례

설명부분의  첫 들여쓰기가 전체 들여쓰기의 기준이 됨 (インデント)

(문자열 따옴표 줄은 들여쓰기를 반영 x)

 

この処理以下規約っています

最初にある 空行でない最初ドキュメント全体のインデントのめます

(最初通常文字列開始するクオートにっているのでインデントが文字列リテラルれないためです)



덜 들여쓰기 된 줄이 나타나면 앞부분의 모든 공백이 제거 됨.


このインデント"等価" 空白文字列のすべての行頭からられます

インデントのないいてはならないのですがもしそういうがあると先頭空白すべてがられます

 

 

공백의 같음은 Tab (8 스페이스후 검사


インデントの空白きさがしいかどうかタブ文字(通常 8 文字のスペースとして) 展開した調べられます

 

>>> def my_function():
...     """Do nothing, but document it.
...
...     No, really, it doesn't do anything.
...     """
...     pass
...
>>> print(my_function.__doc__)
Do nothing, but document it.

    No, really, it doesn't do anything.

 

 



4.7.7. 함수 어노테이션 関数のアノテーション

 

함수 어노테이션

함수 인자의 형에 대한 메타데이터


関数アノテーション は

ユーザ定義関数使用されるについての完全にオプションメタデータ情報です

 

 

 __annotations__ 어트리뷰트에 딕셔너리로 저장

함수에 영향 x

함수이름.__annotations__

 

アノテーション は関数__annotations__ 属性辞書として格納され

関数部分には影響がありません

 

 

매개변수 어노테이션 : 매개변수이름’ + ‘: 표현식

def 함수이름 (매개변수이름 : 표현식):


반환 값 어노테이션 

def 함수이름(매개변수목록) -> 반환값표현식:


パラメータアノテーションは

パラメータにコロンをけることによって定義されそのにアノテーションのとして評価されるかれます

 

アノテーションは

パラメータリストと def ステートメントのわりをすコロンのかれたリテラル -> によって定義されそのきます


位置引数とキーワード引数そしてアノテーションをっています:

 

>>> def f(ham: str, eggs: str = 'eggs') -> str:
...     print("Annotations:", f.__annotations__)
...     print("Arguments:", ham, eggs)
...     return ham + ' and ' + eggs
...
>>> f('spam')
Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>}
Arguments: spam eggs
'spam and eggs'

 





4.8. 코딩 스타일 コーディングスタイル

 

스타일 가이드 : PEP 8

Python にはほとんどのプロジェクトがっているスタイルガイドとして PEP 8 があります

それは非常しいコーディングスタイルを推奨しています

ての Python 開発者はある時点でそれをむべきです

ここに重要しておきます:



들려 쓰기 : 4-스페이스 / 탭 사용x

4 스페이스

작은 들여쓰기 (더 많은 중첩 도를 허락한다) 와 큰 들여쓰기 (읽기 쉽다) 사이 좋은 절충

탭은 혼란을 야기


インデントには空白 つを使タブは使わないこと

空白 4 つは

        (くネストできる) さいインデントと () きいインデントのちょうど中間たります

        タブは混乱させるので使わずにおくのがいです

 



79자 이내 줄 넘김

작은 화면 사용자 편의

큰 화면 여러 코드 파일들을 나란히 볼 수 있게 함


ソースコードの79 文字えないようにすこと

こうすることでさいディスプレイを使っているユーザもくなり

きなディスプレイではソースコードファイルをべることもできるようになります



함수, 클래스, 함수 내의 큰 코드 블록 사이에 빈 줄로 분리

가능하다면, 주석은 별도의 줄로 넣으세요.


関数やクラスや関数内きめのコードブロックの区切りに空行使うこと

可能ならコメントは独立くこと

 


독스트링 사용

docstring 使うこと

 


연산자 주변, 콤마 뒤 스페이스 / 괄호 바로 안 스페이스 : a = f(1, 2) + g(3, 4).

演算子前後とコンマのには空白括弧類のすぐ内側には空白れないこと: a = f(1, 2) + g(3, 4)

 



클래스와 함수들에 일관성 있는 이름


クラスや関数一貫性のある名前けること

慣習では CamelCase をクラス使lower_case_with_underscores 関数名やメソッド使います


 

첫 번째 메서드 인자의 이름으로는 항상 self 를 사용

self をメソッドの1 引数名前 (クラスやメソッドについては クラス初見 ) として使うこと



특별한 인코딩x 파이썬 기본이 최선

 あなたのコードを世界中使ってもらうつもりなら風変りなエンコーディングは使わないこと

どんな場合でもPython のデフォルト UTF-8 またはプレーン ASCII 上手くいきます

同様ほんのしでも言語がコードをんだりメンテナンスする可能性があるのであればASCII 文字識別子使うべきではありません