関数

# 左下直角の二等辺三角形

print('左下直角二等辺三角形')

n = int(input('短辺:'))

for i in range(1, n + 1):
    for _ in range(i):
        print('*', end='')
    print()

C:>python xxx.py
左下直角二等辺三角形
短辺:3 (画面入力)
*
**
***

# 長方形

print('長方形')
h = int(input('高さ:'))
w = int(input('横幅:'))

for i in range(1, h + 1):
    for _ in range(w):
        print('*', end='')
    print()

C:>python xxx.py
長方形
高さ:5 (画面入力)
横幅:5 (画面入力)
*****
*****
*****
*****
*****

# 左下直角の二等辺三角形と長方形を表示

def put_star(n):
    """n個の'*'を連続して表示"""
    for _ in range(n):
        print('*', end='')

print('左下直角二等辺三角形')
n = int(input('短辺:'))

for i in range(1, n + 1):
    put_star(i)
    print()

print('長方形')
h = int(input('高さ:'))
w = int(input('横幅:'))

for i in range(1, h + 1):
    put_star(w)
    print()

C:>python xxx.py
左下直角二等辺三角形
短辺:3 (画面入力)
*
**
***

長方形
高さ:5 (画面入力)
横幅:5 (画面入力)
*****
*****
*****
*****
*****

# 左下直角の二等辺三角形と長方形を表示
# ※エラー:関数定義を末尾に配置

print('左下二等辺直角三角形')
n = int(input('短辺:'))

for i in range(1, n + 1):
    put_star(i)
    print()

print('長方形')
h = int(input('高さ:'))
w = int(input('横幅:'))

for i in range(1, h + 1):
    put_star(w)
    print()

def put_star(n):
    """n個の'*'を連続して表示"""
    for _ in range(n):
        print('*', end='')

C:>python xxx.py
左下二等辺直角三角形
短辺:5 (画面入力)
Traceback (most recent call last):
File “C:\xxx.py”, line 8, in
put_star(i)
^^^^^^^^
NameError: name ‘put_star’ is not defined

# 3値の最大値を求める

def max3(a, b, c):
    """aとbとcの最大値を求めて返却"""
    max = a
    if b > max: max = b
    if c > max: max = c
    return max

n1 = int(input('整数n1:'))
n2 = int(input('整数n2:'))
n3 = int(input('整数n3:'))

print(f'最大値は{max3(n1, n2, n3)}です。')

x1 = float(input('実数x1:'))
x2 = float(input('実数x2:'))
x3 = float(input('実数x3:'))

print(f'最大値は{max3(x1, x2, x3)}です。')

print(f'n1とn2とx1の最大値は{max3(n1, n2, x1)}です。')

C:>python xxx.py
整数n1:4 (画面入力)
整数n2:3 (画面入力)
整数n3:5 (画面入力)
最大値は5です。
実数x1:1 (画面入力)
実数x2:2 (画面入力)
実数x3:3 (画面入力)
最大値は3.0です。
n1とn2とx1の最大値は4です。

# 2値の最大値を求める

def max2(a, b):
    """aとbの最大値を求めて返却"""
    if a > b:
        return a
    return b

n1 = int(input('整数n1:'))
n2 = int(input('整数n2:'))

print(f'最大値は{max2(n1, n2)}です。')

C:>python xxx.py
整数n1:1 (画面入力)
整数n2:2 (画面入力)
最大値は2です。

# 2値の最大値を求める(別解:条件演算子を利用)

def max2(a, b):
    """aとbの最大値を求めて返却"""
    return a if a > b else b 	# 条件演算子if elseを利用

n1 = int(input('整数n1:'))
n2 = int(input('整数n2:'))

print(f'最大値は{max2(n1, n2)}です。')

C:>python xxx.py
整数n1:3 (画面入力)
整数n2:1 (画面入力)
最大値は3です。

# 2値の最小値と最大値を求める

def min_max2(a, b):
    """aとbの最小値と最大値を求めて返却"""
    return (a, b) if a < b else (b, a)

n1 = int(input('整数n1:'))
n2 = int(input('整数n2:'))

minimum, maximum = min_max2(n1, n2)
print(f'最小値は{minimum}で最大値は{maximum}です。')

C:>python xxx.py
整数n1:1 (画面入力)
整数n2:2 (画面入力)
最小値は1で最大値は2です。

# print関数の返却値を表示

print(print('ABC'))

C:>python xxx.py
ABC
None

# print関数の返却値を表示

x = print(print('ABC'))     # 外側のprint関数の返却値をxに代入
print(x)                    # xの値を表示

C:>python xxx.py
ABC
None
None

# 暗算トレーニング(3桁の整数を三つ加える)

import random

def confirm_retry():
    """もう一度行うかどうかを確認する"""
    while True:
        n = int(input('もう一度?<Yes…1/No…0>:'))
        if n == 0 or n == 1:
            return n

print('暗算トレーニング開始!!')

while True:
    x = random.randint(100, 999)
    y = random.randint(100, 999)
    z = random.randint(100, 999)

    while True:
        print(f'{x} + {y} + {z} = ', end='')
        if (k := int(input())) == x + y + z:
            break
        print('違います!!')

    if not confirm_retry():
        break

C:>python xxx.py
暗算トレーニング開始!!
896 + 680 + 826 = 1500 (画面入力)
違います!!
896 + 680 + 826 = 2402 (画面入力)
もう一度?:0

# 非負の整数の階乗値を求める

def factorial(n):
    """非負の整数nの階乗を再帰的に求める"""
    if n > 0:
        return n * factorial(n - 1)
    else:
        return 1

n = int(input('何の階乗:'))
print(f'{n}の階乗は{factorial(n)}です。')

C:>python xxx.py
何の階乗:2 (画面入力)
2の階乗は2です。

# 1からnまでの和を求めるプログラム

def sum_1ton(n):
    """1からnまでの整数の和を求める"""
    s = 0
    while n > 0:
        s += n
        n -= 1
    return s

x = int(input('xの値:'))
total = sum_1ton(x)
print(f'1から{x}までの和は{total}です。')

C:>python xxx.py
xの値:5 (画面入力)
1から5までの和は15です。

# 受け取った時点での仮引数が実引数そのものであることを確認

def func(n):
    """仮引数の値と識別番号を表示"""
    print(f'n:{n} {id(n)}')
    n = 0
    print(f'n:{n} {id(n)}')

x = 5
print(f'x:{x} {id(x)}')
func(x)
print(f'x:{x} {id(x)}')

C:>python xxx.py
x:5 140707667371048
n:5 140707667371048
n:0 140707667370888
x:5 140707667371048

# リストの任意の要素の値を更新する

def change(lst, idx, val):
    """lst[idx]の値をvalに更新"""
    lst[idx] = val

x = [11, 22, 33, 44, 55]
print(f'x = {x}')

index = int(input('インデックス:'))
value = int(input('新しい値  :'))

change(x, index, value)
print(f'x = {x}')

C:>python xxx.py
x = [11, 22, 33, 44, 55]
インデックス:2
新しい値  :100
x = [11, 22, 100, 44, 55]

# リストの要素の並びを反転する

def reverse_list(lst):
    """lstの要素の並びを反転"""
    n = len(lst)                # 要素数を取得
    for i in range(n // 2):
        lst[i], lst[n - i - 1] = lst[n - i - 1], lst[i]

x = [22, 57, 11, 32, 91, 68, 77]
print(f'x = {x}')

reverse_list(x)
print(f'x = {x}')

C:9>python xxx.py
x = [22, 57, 11, 32, 91, 68, 77]
x = [77, 68, 91, 32, 11, 57, 22]

# 敬称を付けて挨拶する関数(デフォルト値をもつ仮引数)

def hello(name, honorific = 'さん'):
    """敬称を付けて挨拶する"""
    print(f'こんにちは、{name}{honorific}。')

hello('田中')
hello('関根', '君')
hello('西田', '先生')

C:>python xxx.py
こんにちは、田中さん。
こんにちは、関根君。
こんにちは、西田先生。

# 左下直角の二等辺三角形と長方形を表示(その1:位置引数)

def puts(n, s):
    """n個のsを連続して表示"""
    for _ in range(n):
        print(s, end='')

print('左下直角二等辺三角形')
n = int(input('短辺:'))

for i in range(1, n + 1):
    puts(i, '*')
    print()

print('長方形')
h = int(input('高さ:'))
w = int(input('横幅:'))

for i in range(1, h + 1):
    puts(w, '+')
    print()

C:>python xxx.py
左下直角二等辺三角形
短辺:3 (画面入力)
*
**
***


長方形
高さ:5 (画面入力)
横幅:3 (画面入力)
+++
+++
+++
+++
+++

# 左下直角の二等辺三角形と長方形を表示(その2:キーワード引数)

# n個のsを連続して表示
def puts(n, s):
    for i in range(n):
        print(s, end='')

print('左上直角二等辺三角形')
n = int(input('短辺:'))

for i in range(1, n + 1):
    puts(n = i, s = '*')
    print()

print('長方形')
h = int(input('高さ:'))
w = int(input('横幅:'))

for i in range(1, h + 1):
    puts(s = '+', n = w)
    print()

C:>python xxx.py
左上直角二等辺三角形
短辺:5 (画面入力)
*
**
***
****
*****
長方形
高さ:3 (画面入力)
横幅:5 (画面入力)
+++++
+++++
+++++

# 2個以上の任意の個数の値の最大値を求める

def max2more(a, b, *num):
    """2個以上の任意の個数の値の最大値を求める"""
    max = a if a > b else b
    for n in num:
        if n > max:
            max = n
    return max

print(f'max2more(1, 2)          = {max2more(1, 2)}')
print(f'max2more(1, 2, 3)       = {max2more(1, 2, 3)}')
print(f'max2more(1, 2, 3, 4, 5) = {max2more(1, 2, 3, 4, 5)}')
print(f'max2more(1)             = {max2more(1)}')               # エラー

C:>python xxx.py
max2more(1, 2) = 2
max2more(1, 2, 3) = 3
max2more(1, 2, 3, 4, 5) = 5
Traceback (most recent call last):
File “C:\xxx.py”, line 14, in
print(f’max2more(1) = {max2more(1)}’) # エラー
~~~~^^^
TypeError: max2more() missing 1 required positional argument: ‘b’

# 可変個引数の情報を表示する

def print_args(*args):
    """可変個の引数を受け取るargsの情報を表示"""
    print(f'type(args) = {type(args)}')
    print(f'len(args)  = {len(args)}')
    print(f'args       = {args}')

print_args()
print()
print_args(1, 2, 3)

C:>python xxx.py
type(args) =
len(args) = 0
args = ()

type(args) =
len(args) = 3
args = (1, 2, 3)

# 引数の和を表示しながら求める

def print_sum(a, *no):
    """引数の和を返却(式も表示)"""
    sum = a
    print(a, end='')
    n = len(no)
    if n > 0:
        print(' + ', end='')
        for i in range(n - 1):
            sum += no[i]
            print(f'{no[i]} + ', end='')
        sum += no[n - 1]
        print(no[n - 1], end='')
    print(f' = {sum}')
    return sum

print_sum(5)

print_sum(9, 3)

print_sum(3, 6, 8, 2, 7)

C:>python xxx.py
5 = 5
9 + 3 = 12
3 + 6 + 8 + 2 + 7 = 26

# リストにまとめられている3値の最大値を求める

def max3(a, b, c):
    """aとbとcの最大値を求めて返却"""
    max = a
    if b > max: max = b
    if c > max: max = c
    return max

lst1 = [1, 3, 5]
m = max3(*lst1)
print(f'{lst1}の最大値は{m}です。')

C:>python xxx.py
[1, 3, 5]の最大値は5です。

# タプルにまとめられている3値の最大値を求める

def max3(a, b, c):
    """aとbとcの最大値を求めて返却"""
    max = a
    if b > max: max = b
    if c > max: max = c
    return max

tpl1 = (1, 3, 5)
m = max3(*tpl1)
print(f'{tpl1}の最大値は{m}です。')

C:>python xxx.py
(1, 3, 5)の最大値は5です。

# 引数の和を表示しながら求める(実引数のアンパック)

def print_sum(a, *no):
    """引数の和を返却(式も表示)"""
    sum = a
    print(a, end='')
    n = len(no)
    if n > 0:
        print(' + ', end='')
        for i in range(n - 1):
            sum += no[i]
            print(f'{no[i]} + ', end='')
        sum += no[n - 1]
        print(no[n - 1], end='')
    print(f' = {sum}')
    return sum

lst1 = [1, 3, 5, 7]
print_sum(*lst1)

C:>python xxx.py
1 + 3 + 5 + 7 = 16

# 辞書化されたキーワード引数の情報を表示する

def print_kwargs(s, **kwargs):
    """辞書化されたキーワード引数を受け取るkwargsの情報を表示"""
    print(s)
    print(f'type(kwargs) = {type(kwargs)}')
    print(f'len(kwargs)  = {len(kwargs)}')
    print(f'kwargs       = {kwargs}')

print_kwargs('1番', spring='春', summer='夏')
print()
print_kwargs('2番', spring='春')

C:>python xxx.py
1番
type(kwargs) =
len(kwargs) = 2
kwargs = {‘spring’: ‘春’, ‘summer’: ‘夏’}

2番
type(kwargs) =
len(kwargs) = 1
kwargs = {‘spring’: ‘春’}

# 辞書に格納されている人物の情報を表示

def put_person(**person):
    """辞書person内の情報を表示"""
    if 'name' in person: print(f'名前 = {person["name"]}', end='  ')
    if 'visa' in person: print(f'国籍 = {person["visa"]}', end='  ')
    if 'age'  in person: print(f'年齢 = {person["age"]}',  end='  ')
    print()  # 改行

put_person(name='中田', visa='日本', age=27)
put_person(name='趙', visa='中国')

C:>python xxx.py
名前 = 中田 国籍 = 日本 年齢 = 27
名前 = 趙 国籍 = 中国

# 辞書に格納されている人物の情報を表示

def put_person(name=None, visa=None, age=None):
    """キーワード引数に受け取った人物の情報を表示"""
    if name != None: print(f'名前 = {name}', end='  ')
    if visa != None: print(f'国籍 = {visa}', end='  ')
    if age  != None: print(f'年齢 = {age}',  end='  ')
    print()  # 改行

put_person(name='中田', visa='日本', age=27)
put_person(name='趙', visa='中国')

C:>python xxx.py
名前 = 中田 国籍 = 日本 年齢 = 27
名前 = 趙 国籍 = 中国

# 辞書型実引数の**によるアンパックの例

def puts(n, s):
    """n個のsを連続して表示"""
    for _ in range(n):
        print(s, end='')

d1 = {'n': 3, 's': '*'}     # 3個の'*'
d2 = {'s': '+', 'n' :7}     # '+'を7個

puts(**d1)
print()
puts(**d2)

C:>python xxx.py


***
+++++++

# キーワード引数の強制

def puts(*, n, s):
    """n個のsを連続して表示"""
    for _ in range(n):
        print(s, end='')

puts(n = 3, s = '*')
print()
puts(s = '+', n = 7)
print()
puts(3, '*')    # エラー

C:>python xxx.py


***
+++++++
Traceback (most recent call last):
File “C:\chap09\list0926.py”, line 12, in
puts(3, ‘*’) # エラー
~~~~^^^^^^^^
TypeError: puts() takes 0 positional arguments but 2 were given

# ユーザ定義関数putsと組込み関数maxのドキュメントを表示

def puts(n, s):
    """n個のsを連続して表示"""
    for _ in range(n):
        print(s, end='')

help(puts)
help(max)

C:>python xxx.py
Help on function puts in module main:

puts(n, s)
n個のsを連続して表示

Help on built-in function max in module builtins:

max(…)
max(iterable, *[, default=obj, key=func]) -> value
max(arg1, arg2, *args, *[, key=func]) -> value

With a single iterable argument, return its biggest item. The
default keyword-only argument specifies an object to return if
the provided iterable is empty.
With two or more positional arguments, return the largest argument.

# アノテーション付きの関数puts

def puts(n: int, s: str) -> None:
    """n個のsを連続して表示"""
    for _ in range(n):
        print(s, end='')

puts(5, '*')
print()
print(puts.__annotations__)
print()
puts('*', 5)        # エラー

C:>python xxx.py


{‘n’: , ‘s’: , ‘return’: None}

Traceback (most recent call last):
File “C:\xxx.py”, line 12, in
puts(‘*’, 5) # エラー
~~^^^^^^^^ File “C:\xxx.py”, line 5, in puts for _ in range(n): ~~~^^^
TypeError: ‘str’ object cannot be interpreted as an integer

"""アノテーションと文書化文字列付きの関数puts"""


def puts(n: int, s: str) -> None:
    """n個のsを連続して表示

    仮引数:
        n -- 表示する文字列の個数
        s -- 表示する文字列
    返却値:
        無し

    """
    for _ in range(n):
        print(s, end='')


print(puts.__doc__)    # 文書化文字列を表示

C:>python xxx.py
n個のsを連続して表示

仮引数:
n — 表示する文字列の個数
s — 表示する文字列
返却値:
無し

"""ある年の日数を求める"""

def is_leapyear(year: int) -> bool:
    """西暦year年は閏年か"""
    return y % 4 == 0 and y % 100 != 0 or y % 400 == 0

print('ある年の日数を求めます。')
y = int(input('何年:'))
print(f'その年は{365 + is_leapyear(y)}日です。')

C:>python xxx.py
ある年の日数を求めます。
何年:2002 (画面入力)
その年は365日です。

"""辞書から特定の値をもつキーのリストを生成"""

def keys_of(dic: dict, val: 'value') -> list:
    """辞書dic内の値がvalである要素のキーのリストを返却"""
    return [k for k, v in dic.items() if v == val]

txt = input('文字列:')
count = {ch: txt.count(ch) for ch in txt}
print('分布=', count)

num = int(input('何個の文字:'))
print(f'{num}個の文字={keys_of(count, num)}')

C:>python xxx.py
文字列:abc (画面入力)
分布= {‘a’: 1, ‘b’: 1, ‘c’: 1}
何個の文字:1 (画面入力)
1個の文字=[‘a’, ‘b’, ‘c’]

"""平均値を求める"""

def ave(*args) -> float:
    """可変個引数の平均を求める"""
    return sum(args) / len(args)

print(f'ave(1, 2, 3) = {ave(1, 2, 3)}')
print(f'ave(5, 7.77, 5) = {ave(5, 7.77, 5)}')
print(f'ave(3.5, 4.7, 8.2) = {ave(3.5, 4.7, 8.2)}')

C:>python xxx.py
ave(1, 2, 3) = 2.0
ave(5, 7.77, 5) = 5.923333333333333
ave(3.5, 4.7, 8.2) = 5.466666666666666

"""リスト形式の文字列に変換する"""

def list_str(*args) -> str:
    """可変個引数をリスト形式の文字列に
       変換して返却する"""
    return str(list(args))

print(f'list_str(1, 2, 3) = {list_str(1, 2, 3)}')
print(f'list_str(5, 7.77, 5) = {list_str(5, 7.77, 5)}')
print(f'list_str(3.5, 4.7, 8.2) = {list_str(3.5, 4.7, 8.2)}')

C:>python xxx.py
list_str(1, 2, 3) = [1, 2, 3]
list_str(5, 7.77, 5) = [5, 7.77, 5]
list_str(3.5, 4.7, 8.2) = [3.5, 4.7, 8.2]

"""乗算表を表示"""

upper = int(input('1から何まで:'))

def multiplication_table(n: int) -> bool:
    """1~nまでの乗算表を表示"""
    if    1 <= n <=  3: w = 2
    elif  4 <= n <=  9: w = 3
    elif 10 <= n <= 31: w = 4
    else              : return False

    print('-' * n * w)
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            print(f'{i * j:{w}d}', end='')
        print()
    print('-' * n * w)
    return True

multiplication_table(upper)

C:>python xxx.py
1から何まで:5 (画面入力)
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25

"""乗算表を表示(その2)"""

upper = int(input('1から何まで:'))

def multiplication_table() -> bool:
  """1~nまでの乗算表を表示"""
  if    1 <= upper <=  3: w = 2
  elif  4 <= upper <=  9: w = 3
  elif 10 <= upper <= 31: w = 4
  else                  : return False

  print('-' * upper * w)
  for i in range(1, upper + 1):
     for j in range(1, upper + 1):
        print(f'{i * j:{w}d}', end='')
     print()
  print('-' * upper * w)
  return True

multiplication_table()

C:>python xxx.py
1から何まで:9 (画面入力)
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

"""乗算表を表示(内部関数)"""

upper = int(input('1から何まで:'))

def multiplication_table(n: int) -> bool:
    """1~nまでの乗算表を表示"""

    def put_bar(n: int) -> None:
        """n個の'-'を連続表示して改行"""
        print('-' * n)

    if    1 <= n <=  3: w = 2
    elif  4 <= n <=  9: w = 3
    elif 10 <= n <= 31: w = 4
    else              : return False

    put_bar(n * w)
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            print(f'{i * j:{w}d}', end='')
        print()
    put_bar(n * w)
    return True

multiplication_table(upper)

C:>python xxx.py

1から何まで:5 (画面入力)
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25

"""乗算表を表示(内部関数:引数を削除)"""

upper = int(input('1から何まで:'))

def multiplication_table(n: int) -> bool:
    """1~nまでの乗算表を表示"""

    def put_bar() -> None:
        """n * w個の'-'を連続表示して改行"""
        print('-' * n * w)

    if    1 <= n <=  3: w = 2
    elif  4 <= n <=  9: w = 3
    elif 10 <= n <= 31: w = 4
    else              : return False

    f = '{{:{}d}}'.format(w)
    put_bar()
    for i in range(1, n + 1):
        for j in range(1, n + 1):
            print(f.format(i * j), end='')
        print()
    put_bar()
    return True

multiplication_table(upper)

C:>python xxx.py
1から何まで:11 (画面入力)
1 2 3 4 5 6 7 8 9 10 11
2 4 6 8 10 12 14 16 18 20 22
3 6 9 12 15 18 21 24 27 30 33
4 8 12 16 20 24 28 32 36 40 44
5 10 15 20 25 30 35 40 45 50 55
6 12 18 24 30 36 42 48 54 60 66
7 14 21 28 35 42 49 56 63 70 77
8 16 24 32 40 48 56 64 72 80 88
9 18 27 36 45 54 63 72 81 90 99
10 20 30 40 50 60 70 80 90 100 110
11 22 33 44 55 66 77 88 99 110 121

"""変数内外の変数の値の確認"""

g1 = 1
g2 = 2

def outer():
    def inner():
        f2 = 6
        print(f'[2] inner() g1, g2 = {g1}, {g2}')
        print(f'    inner() f1, f2 = {f1}, {f2}')

    f1 = 3
    f2 = 4
    g2 = 5
    inner()
    print(f'[3] outer() g1, g2 = {g1}, {g2}')
    print(f'    outer() f1, f2 = {f1}, {f2}')

print(f'[1] global  g1, g2 = {g1}, {g2}')
outer()
print(f'[4] global  g1, g2 = {g1}, {g2}')

C:>python xxx.py
[1] global g1, g2 = 1, 2
[2] inner() g1, g2 = 1, 5
inner() f1, f2 = 3, 6
[3] outer() g1, g2 = 1, 5
outer() f1, f2 = 3, 4
[4] global g1, g2 = 1, 2

# global文なし

n = 1

def func():
    # 同名の変数を作成
    n = 2    # nは局所変数
    print(f'n = {n}')

print(f'n = {n}')
func()
print(f'n = {n}')

C:>python xxx.py
n = 1
n = 2
n = 1

# global文あり

n = 1

def func():
    global n
    n = 2    # nは広域変数
    print(f'n = {n}')

print(f'n = {n}')
func()
print(f'n = {n}')

C:>python xxx.py
n = 1
n = 2
n = 2

# nonlocal文なし

def outer():
    n = 1
    def inner():
        # 同名の変数を作成
        n = 2
        print(f'n = {n}')

    print(f'n = {n}')
    inner()
    print(f'n = {n}')

outer()

C:>python xxx.py
n = 1
n = 2
n = 1

# nonlocal文あり

def outer():
    n = 1
    def inner():
        nonlocal n
        n = 2
        print(f'n = {n}')

    print(f'n = {n}')
    inner()
    print(f'n = {n}')

outer()

C:>python xxx.py
n = 1
n = 2
n = 2

"""関数がオブジェクトであることを確認"""

def min2(a, b):
    """aとbの最小値を求めて返却する関数"""
    return a if a < b else b

a = int(input('整数a:'))
b = int(input('整数b:'))

func = min2
print(f'最小値は{func(a, b)}です。')

del min2
print(f'最小値は{func(a, b)}です。')

del func
print(f'最小値は{func(a, b)}です。')                            # エラー

C:>python xxx.py
整数a:1
整数b:2
最小値は1です。
最小値は1です。
Traceback (most recent call last):
File “C:\xxx.py”, line 17, in
print(f’最小値は{func(a, b)}です。’) # エラー
^^^^
NameError: name ‘func’ is not defined

"""関数の型と識別番号を表示"""

def min2(a, b):
    """aとbの最小値を求めて返却する関数"""
    return a if a < b else b

func = min2

print(f'type(min2), id(min2) = {type(min2)} {id(min2)}')
print(f'type(func), id(func) = {type(func)} {id(func)}')

C:>python xxx.py
type(min2), id(min2) = 2356229110528
type(func), id(func) = 2356229110528

"""一つの名前で二つの関数を呼び出す"""

def mul2(x, y):
    return x * y

def add2(x, y):
    return x + y

a = int(input('整数a:'))
b = int(input('整数b:'))

func = mul2
print(f'aとbの積は{func(a, b)}です。')

func = add2
print(f'aとbの和は{func(a, b)}です。')

C:>python xxx.py
整数a:1
整数b:2
aとbの積は2です。
aとbの和は3です。

"""九九の掛け算表・足し算表を表示"""

def kuku(func):
    """九九の表を表示"""
    for i in range(1, 10):
        for j in range(1, 10):
            print(f'{func(i, j):3d}', end='')
        print()

def mul2(x, y):
    return x * y

def add2(x, y):
    return x + y

n = int(input('掛け算[0]/足し算[1]:'))

if n == 0:
    print('九九の掛け算表')
    kuku(mul2)
elif n == 1:
    print('九九の足し算表')
    kuku(add2)

C:>python xxx.py
掛け算[0]/足し算[1]:0
九九の掛け算表
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

"""2値の和を求めるラムダ式(その1)"""

a = int(input('整数a:'))
b = int(input('整数b:'))

add2 = lambda x, y: x + y
print(f'aとbの和は{add2(a, b)}です。')

C:>python xxx.py
整数a:12
整数b:15
aとbの和は27です。

"""2値の和を求めるラムダ式(その2)"""

a = int(input('整数a:'))
b = int(input('整数b:'))
print(f'aとbの和は{(lambda x, y: x + y)(a, b)}です。')

C:>python xxx.py
整数a:5
整数b:8
aとbの和は13です。

"""九九の掛け算表・足し算表を表示"""

def kuku(func):
    """九九の表を表示"""
    for i in range(1, 10):
        for j in range(1, 10):
            print(f'{func(i, j):3d}', end='')
        print()

n = int(input('掛け算[0]/足し算[1]:'))

if n == 0:
    print('九九の掛け算表')
    kuku(lambda x, y: x * y)
elif n == 1:
    print('九九の足し算表')
    kuku(lambda x, y: x + y)

C:>python xxx.py
掛け算[0]/足し算[1]:0
九九の掛け算表
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81

# リストの全要素を2倍にする(関数)

def double(n):
    return 2 * n

x = [1, 2, 3, 4]
y = map(double, x)

print(list(y))

C:>python xxx.py
[2, 4, 6, 8]

# リストの全要素を2倍にする(ラムダ式)

x = [1, 2, 3, 4]
y = map(lambda n: 2 * n, x)

print(list(y))

C:>python xxx.py
[2, 4, 6, 8]

# 80点以上の点数のみを抽出

import random

number = int(input('学生の人数:'))

tensu = [None] * number

for i in range(number):
    tensu[i] = random.randint(0, 100)

print(f'全員の点数={tensu}')
print(f'合格者の点数={list(filter(lambda n: n >= 80, tensu))}')

C:>python xxx.py
学生の人数:5
全員の点数=[54, 79, 48, 33, 6]
合格者の点数=[]

def list_apnd(a, lst=[]):
    """呼び出されるたびにリストを連結して表示"""
    lst += a
    print(lst)

list_apnd([1])    # []    に[1]を追加。   lstのデフォルト値は[1]になる。
list_apnd([2])    # [1]   に[2]を追加。   lstのデフォルト値は[1, 2]になる。
list_apnd([3, 4]) # [1, 2]に[3, 4]を追加。lstのデフォルト値は[1, 2, 3, 4]になる。

C:>python xxx.py
[1]
[1, 2]
[1, 2, 3, 4]

# mapの利用例(その1:全要素を文字列に変換する)

x = [1, 2, 3, 4]

print(list(map(str, x)))

C:>python xxx.py
[‘1’, ‘2’, ‘3’, ‘4’]

# mapの利用例(その2:全要素の単位をセンチメートルからインチに変換する)

x = [1, 2, 3, 4]

print(list(map(lambda n: 2.54 * n , x)))

C:>python xxx.py
[2.54, 5.08, 7.62, 10.16]

"""maxが関数から変数に変身"""

a, b, c = 3, 7, 5
max = max(a, b, c)                         # 1回目:OK (max = 7)
print(f'aとbとcの最大値は{max}です。')

max = max(a, b, c)                         # 2回目:エラー(max = 7(a, b, c))

C:>python xxx.py
aとbとcの最大値は7です。
Traceback (most recent call last):
File “C:\xxx.py”, line 7, in
max = max(a, b, c) # 2回目:エラー(max = 7(a, b, c))
TypeError: ‘int’ object is not callable

# リストを表示

lst1 = [1, 3, 5, 7]

print(lst1)
print(*lst1)

C:>python xxx.py
[1, 3, 5, 7]
1 3 5 7

# リストを表示(sepを指定)

lst1 = [1, 3, 5, 7]

print(*lst1, sep='  ')	# 要素の区切りをスペース2個にする
print(*lst1, sep='\n')	# 要素を表示するたびに改行(各行に1個の要素)

C:>python xxx.py
1 3 5 7
1
3
5
7

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

関連記事

コメント

この記事へのコメントはありません。