루프 및 함수

토마스 보젠, 2020년 9월

이 연습은 3장을 보완합니다.

연습

1.

URL 문자열에서 웹사이트 도메인을 가져오는 website() 함수를 만듭니다. 예를 들어, 함수에 "www.google.com"이 전달되면 "google"을 반환해야 합니다.

def website(url):
    pass  # Remove this line and add your answer here.

2.

두 개의 정수(ab)를 받아들이고 a가 나머지 없이 b로 나누어지는 경우 True를 반환하는 divisible(a, b) 함수를 만듭니다. 예를 들어, divisible(10, 3)False를 반환해야 하고 divisible(6, 3)True를 반환해야 합니다.

def divisible(a, b):
    pass  # Remove this line and add your answer here.

3.

목록 이해를 사용하여 다음 숫자 목록의 모든 숫자를 제곱하세요.

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# Your answer here.

4.

다음 이름 목록에 대해 대문자로 시작하는 단지 단어 목록을 생성하는 목록 이해력을 작성하세요(힌트: str.isupper()).

names = ["Steve Irwin", "koala", "kangaroo", "Australia", "Sydney", "desert"]

# Your answer here.

5.

다음 keysvals 목록의 경우 사전 이해를 사용하여 {'key-0': 0, 'key-1': 1 등} 형식의 사전을 만듭니다(힌트: zip()은 이해/루핑에 사용할 객체에 두 목록을 결합하는 데 도움이 됩니다).

keys = [f"key-{k}" for k in range(10)]
vals = range(10)

# Your answer here.

6.

이 질문은 조금 더 어렵습니다. 한 번에 최대 10개의 숫자 목록을 배치하여 0부터 n까지의 숫자를 생성하는 listgen(n)이라는 생성기 함수를 만듭니다. 예를 들어 함수는 다음과 같이 동작해야 합니다.

``파이썬 g = 목록 생성(100) 다음(g) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 다음(g) [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 다음(g) [20, 21, 22, 23, 24, 25, 26, 27, 28, 29] 등등

g = 목록 생성(5) 다음(g)


::: {#cell-21 .cell execution_count=6}
``` {.python .cell-code}
def listgen(n):
    pass  # Remove this line and add your answer here.
```
:::


### 7.

다음 코드에서 생성된 오류를 포착하고 "I catch you!"를 인쇄하려면 `try`/`prop`를 작성하세요. 발생한 특정 오류를 포착했는지 확인하세요. 이는 일반적으로 모든 오류를 포착하는 것보다 더 나은 방법입니다!

::: {#cell-24 .cell tags='["raises-exception"]' execution_count=7}
``` {.python .cell-code}
5 / 0

# Your answer here.
```

::: {.cell-output .cell-output-error}

::: {.ansi-escaped-output}
```{=html}
<pre><span class="ansi-red-fg">---------------------------------------------------------------------------</span>
<span class="ansi-red-fg">ZeroDivisionError</span>                         Traceback (most recent call last)
<span class="ansi-green-fg">&lt;ipython-input-7-9e2b7a365344&gt;</span> in <span class="ansi-cyan-fg">&lt;module&gt;</span>
<span class="ansi-green-fg">----&gt; 1</span><span class="ansi-red-fg"> </span><span class="ansi-cyan-fg">5</span> <span class="ansi-blue-fg">/</span> <span class="ansi-cyan-fg">0</span>
<span class="ansi-green-fg ansi-bold">      2</span> 
<span class="ansi-green-fg ansi-bold">      3</span> <span class="ansi-red-fg"># Your answer here.</span>

<span class="ansi-red-fg">ZeroDivisionError</span>: division by zero</pre>
```
:::

:::
:::


### 8.

사용자가 입력한 모든 정수를 가져와 그 합계를 반환하는 `lucky_sum()` 함수를 만듭니다. *그러나* 값 중 하나가 13이면 합계에 포함되지 않으며 오른쪽에 있는 값도 포함되지 않습니다.

예를 들어 함수는 다음과 같이 동작해야 합니다.

``파이썬
Lucky_sum(1, 2, 3, 4)
10

Lucky_sum(1, 13, 3, 4)
1

Lucky_sum(13)
0

이 예시는 관련 codingbat 챌린지에서 영감을 받았습니다.

def lucky_sum(*args):
    pass  # Remove this line and add your answer here.



솔루션

1.

URL 문자열에서 웹사이트 도메인을 가져오는 website() 함수를 만듭니다. 예를 들어, 함수에 "www.google.com"이 전달되면 "google"을 반환해야 합니다.

def website(url):
    return url.split(".")[1]


website("www.google.com")
'google'

2.

두 개의 정수(ab)를 받아들이고 a가 나머지 없이 b로 나누어지는 경우 True를 반환하는 divisible(a, b) 함수를 만듭니다. 예를 들어, divisible(10, 3)False를 반환해야 하고 divisible(6, 3)True를 반환해야 합니다.

def divisible(a, b):
    return True if a % b == 0 else False


print(divisible(10, 3))
print(divisible(6, 3))
False
True

3.

목록 이해를 사용하여 다음 숫자 목록의 모든 숫자를 제곱하세요.

l = [1, 2, 3, 4, 5, 6, 7, 8, 9]
[_**2 for _ in l]
[1, 4, 9, 16, 25, 36, 49, 64, 81]

4.

다음 이름 목록에 대해 대문자로 시작하는 단지 단어 목록을 생성하는 목록 이해력을 작성하세요(힌트: str.isupper()).

names = ["Steve Irwin", "koala", "kangaroo", "Australia", "Sydney", "desert"]
[_ for _ in names if _[0].isupper()]
['Steve Irwin', 'Australia', 'Sydney']

5.

다음 keysvals 목록의 경우 사전 이해를 사용하여 {'key-0': 0, 'key-1': 1 등} 형식의 사전을 만듭니다(힌트: zip()은 이해/루핑에 사용할 객체에 두 목록을 결합하는 데 도움이 됩니다).

keys = [f"key-{k}" for k in range(10)]
vals = range(10)
{k: v for k, v in zip(keys, vals)}
{'key-0': 0,
 'key-1': 1,
 'key-2': 2,
 'key-3': 3,
 'key-4': 4,
 'key-5': 5,
 'key-6': 6,
 'key-7': 7,
 'key-8': 8,
 'key-9': 9}

6.

이 질문은 조금 더 어렵습니다. 한 번에 최대 10개의 숫자 목록을 배치하여 0부터 n까지의 숫자를 생성하는 listgen(n)이라는 생성기 함수를 만듭니다. 예를 들어 함수는 다음과 같이 동작해야 합니다.

``파이썬 g = 목록 생성(100) 다음(g) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 다음(g) [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 다음(g) [20, 21, 22, 23, 24, 25, 26, 27, 28, 29] 등등

g = 목록 생성(5) 다음(g)


::: {#cell-47 .cell execution_count=14}
``` {.python .cell-code}
def listgen(n):
    counter = 0
    numbers = list(range(n))
    while counter <= n // 10:
        yield numbers[10 * counter : 10 * (counter + 1)]
        counter += 1
```
:::


### 7.

다음 코드에서 생성된 오류를 포착하고 "I catch you!"를 인쇄하려면 `try`/`prop`를 작성하세요. 발생한 특정 오류를 포착했는지 확인하세요. 이는 일반적으로 모든 오류를 포착하는 것보다 더 나은 방법입니다!

::: {#cell-50 .cell execution_count=15}
``` {.python .cell-code}
try:
    5 / 0
except ZeroDivisionError:
    print("I caught you!")
```

::: {.cell-output .cell-output-stdout}
```
I caught you!
```
:::
:::


### 8.

사용자가 입력한 모든 정수를 가져와 그 합계를 반환하는 `lucky_sum()` 함수를 만듭니다. *그러나* 값 중 하나가 13이면 합계에 포함되지 않으며 오른쪽에 있는 값도 포함되지 않습니다.

예를 들어 함수는 다음과 같이 동작해야 합니다.

``파이썬
Lucky_sum(1, 2, 3, 4)
10

Lucky_sum(1, 13, 3, 4)
1

Lucky_sum(13)
0

이 예시는 관련 codingbat 챌린지에서 영감을 받았습니다.

def lucky_sum(*args):
    if 13 in args:
        return sum(args[: args.index(13)])
    return sum(args)