PYTHON勉強会2022
第3回 Python勉強会2022
公開日:
2022/04/26
第3回 Python勉強会2022

0. 予習事項

「1. 型とは?」を読んでおいてください。

1. 型とは?

  • bool
    if の中に入れるやつで、True (=1) と False (=0) の二値しか取りません。
  • int
    整数。ちなみに、C++ と異なり何桁でも無限に取れます (多倍長整数と言います)。
  • float
    小数。
  • str
    文字列str は string の略で、文字列の意。
x = True
print(x)  # True
print(type(x))  # bool

print(type(3.0))  # float?
print(type(3))  # int
print(3.0 == 3)  # True

print(type("3"))  # str
print("3" == 3)  # False (型が違います)

print(True + True)  # 2 (True の実態は 1 です)

2. 配列 (list)

プログラミングで最も使われるデータ構造は list です。 なお、list に付属の関数は表の通りです。 さらに詳しくは、[解決!Python]リスト(配列)の使い方まとめ を参照してください。

メソッド名 説明 使い方 (リストの変数名が li のとき)
append(x) 末尾に x を追加 li.append(6)
pop(i=-1) i 番目の要素を削除 li.pop()とか li.pop(2)
count(x) 出現数を数える li.count(1)
sort() ソートする li.sort()
reverse() 逆順にする li.reverse()
# いちいち変数を作るのは面倒
# num0 = 3
# num1 = 1
# num2 = 4
# num3 = 1
# num4 = 5

# 配列 (list) にしましょう。配列とは、数個の変数を 1 つとしてもつもののことです。
nums = [3, 1, 4, 1, 5]

print(nums)  # [3, 1, 4, 1, 5]
# 配列の前に * (アスタリスク) を付けると配列の中身を展開してくれます
print(*nums)  # 3 1 4 1 5
print(nums[0])  # 3
planets = ["Mercury", "Venus", "Earth", "Malacandra", "Jupiter", "Saturn", "Uranus", "Neptune"]
print(planets.pop())  # Pluto
print(planets)
planets.index("Jupiter")  # 4 (index を返す)

2-1. (発展) ソート関数 li.sort()sorted(li) の違い

使い方 破壊的か? 出自
li.sort() 破壊的 型 list のメソッド
sorted(li) 破壊的でない 組み込み関数

ちなみに、どのプログラミング言語でも、デフォルトのソートは昇順ソート (のはず) です。

  • 昇順ソート: [3, 1, 4, 1, 5] → [1, 1, 3, 4, 5] のように小さい順に並べる意。
  • 降順ソート: [3, 1, 4, 1, 5] → [5, 4, 3, 1, 1] のように大きい順に並べる意。
nums = [3, 1, 4, 1, 5]
nums.sort()  # nums にソート結果を代入
print(nums)  # [1, 1, 3, 4, 5]
nums = [3, 1, 4, 1, 5]
nums2 = sorted(nums)  # nums は不変
print(nums2)  # [1, 1, 3, 4, 5]

3. 組み込み関数 range

繰り返し実行機能である for 文を学習する前に、まずは組み込み関数 range を紹介します。 1 つ目の要素が 1 ではなく 0 (0-indexed という。) であることに注意。

使い方 対応する配列 対応する半開区間 具体例
range(stop) [0, 1, ..., stop - 1] [0,stop)[0, stop) range(5) は、配列 [0, 1, 2, 3, 4] に対応。
range(start, stop) [start, start + 1, ..., stop - 1] [start,stop)[start, stop) range(2, 5) は、配列 [2, 3, 4] に対応。
range(start, stop, step) [start, start + step, ...] [start,stop)[start, stop) の step 個飛び range(0, 5, 2) は、配列 [0, 2, 4] に対応。
# list でラップしないと生の range が出力されます
print(range(5))  # range(0, 5)

# 以下では list でラップします
print(list(range(5)))  # [0, 1, 2, 3, 4]
print(list(range(1, 5)))  # [1, 2, 3, 4]
print(list(range(0, 4)))  # [0, 1, 2, 3]
print(list(range(1, 4)))  # [1, 2, 3]
print(list(range(0, 5, 2)))  # [0, 2, 4]

4. 一定回数を繰り返す (for, while)

  1. for i in range(n)

i は index の頭文字です。

# 先述の通り range(5) は [0, 1, 2, 3, 4] の意です
for i in range(5):
    print(i)
    # 0
    # 1
    # 2
    # 3
    # 4
  1. for x in nums
nums = [3, 1, 4, 1, 5]
for num in nums:
    print(num)
    # 3
    # 1
    # 4
    # 1
    # 5
  1. (発展) 組み込み関数 enumerate
nums = [3, 1, 4, 1, 5]
for i in range(len(nums)):
    print(f"nums[{i}] = {nums[i]}")
    # nums[0] = 3
    # nums[1] = 1
    # nums[2] = 4
    # nums[3] = 1
    # nums[4] = 5

# 組み込み関数 enumerate を使ってもよい
nums = [3, 1, 4, 1, 5]
for i, num in enumerate(nums):
    print(f"nums[{i}] = {num}")
    # nums[0] = 3
    # nums[1] = 1
    # nums[2] = 4
    # nums[3] = 1
    # nums[4] = 5

4-1. for で配列 (list) を構築する構文

nums = [3, 1, 4, 1, 5]
# 配列 nums 内のそれぞれの要素を 2 乗する
nums2 = [num**2 for num in nums]
print(nums2)  # [9, 1, 16, 1, 25]
planets = ["Mercury", "Venus", "Earth", "Malacandra", "Jupiter", "Saturn", "Uranus", "Neptune"]
# 各 planet の 0 文字目を集めた配列 planets2 を作る
planets2 = [planet[0] for planet in planets]
print(planets2)  # ['M', 'V', 'E', 'M', 'J', 'S', 'U', 'N']
planets = ["Mercury", "Venus", "Earth", "Malacandra", "Jupiter", "Saturn", "Uranus", "Neptune"]
# 各 planet の末尾に感嘆符 (!) を付けた配列 planets3 を作る
planets3 = [
    planet.upper() + '!'
    for planet in planets
    if len(planet) < 6
]
print(planets3)  # ['VENUS!', 'EARTH!', 'MARS!']
# 平方数
square_number = [n ** 2 for n in range(10)]
print(square_number)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

5. 配列 (list) の要素の総和を求める (for)

a = [1, 2, 3, 4]
tot = 0
for i in range(len(a)):
    tot += a[i]
    print("tot =", tot)
    # tot: 1
    # tot: 3
    # tot: 6
    # tot: 10
print(tot)  # 10

別解として、組み込み関数 sum を使う方法もあります。 組み込み関数とは、デフォルトで (つまり import せずに) 使用可能な、標準搭載の関数のことです。

a = [1, 2, 3, 4]
print(sum(a))  # 10

6. while 文

while 文とは、以下のような記法のループ文のことです。

while (条件):
    # (条件) が真なら

まずは while 文に慣れるため、for i in range(n) 型の for 文と同じ機能を while で実装してみます。
大学のプログラミングの授業を理解するだけなら、これで十分のはず。

# for i in range(n) 型の for 文による実装
for i in range(5):
    print(i)
    # 0
    # 1
    # 2
    # 3
    # 4

# while 文による実装
i = 0
while i < 5:
    print(i)
    # 0
    # 1
    # 2
    # 3
    # 4
    i += 1

(発展) 素因数分解をする関数は以下の通りです。

def factorize(n):
    # 2022 -> [(2, 1), (3, 1), (337, 1)]
    res = []
    a = 2
    while a * a <= n:
        if n % a != 0:
            a += 1
            continue
        ex = 0
        while n % a == 0:
            ex += 1
            n //= a
        res.append((a, ex))
        a += 1
    if n > 1:
        res.append((n, 1))
    return res

print(factorize(2022))  # [(2, 1), (3, 1), (337, 1)]
print(factorize(169))  # [(13, 2)]
print(factorize(17))  # [(17, 1)]

課題

コピペ AC 可。

課題の解答

s = input()
ans = 0
for c in s:
    if c == "1":
        ans += 1
print(ans)
n = int(input())
a = list(map(int, input().split()))
ans = 0
while True:
    cnt = 0
    for i in range(n):
        if a[i] % 2 == 0:
            cnt += 1
    if cnt < n:
        break
    for i in range(n):
        a[i] //= 2
    ans += 1
print(ans)
a = int(input())
b = int(input())
c = int(input())
x = int(input())
# 上 4 行と等価
# a, b, c, x = [int(input()) for _ in range(4)]

ans = 0
for i in range(a + 1):
    for j in range(b + 1):
        for k in range(c + 1):
            tot = 500 * i + 100 * j + 50 * k
            if tot == x:
                ans += 1
print(ans)

次回 (第 4 回) へのリンク

{{< post 441 >}}

loading...