Kết hợp, đếm và lặp hiệu quả

Viết mã Python hiệu quả

Logan Thomas

Scientific Software Technical Trainer, Enthought

Tổng quan Pokémon

  • Huấn luyện viên (thu thập Pokémon)

alt=”Ash Ketchum; một nhân vật (gọi là huấn luyện viên) trong trò chơi Pokémon của Nintendo”

Viết mã Python hiệu quả

Tổng quan Pokémon

  • Pokémon (nhân vật sinh vật hư cấu)

alt=”Squirtle, Pikachu, Bulbasaur và Charmander; một vài Pokémon trong trò chơi của Nintendo”

Viết mã Python hiệu quả

Tổng quan Pokémon

  • Pokédex (lưu Pokémon đã bắt)

alt=”Pokédex, công cụ để huấn luyện viên lưu Pokémon đã bắt”

Viết mã Python hiệu quả

Mô tả Pokémon

alt=”Pokémon tên Squirtle với siêu dữ liệu đi kèm”

Viết mã Python hiệu quả

Mô tả Pokémon

alt=”Pokémon tên Squirtle với siêu dữ liệu đi kèm, nổi bật trường Name và Generation”

Viết mã Python hiệu quả

Mô tả Pokémon

alt=”Pokémon tên Squirtle với siêu dữ liệu đi kèm, nổi bật trường Type và Legendary”

Viết mã Python hiệu quả

Mô tả Pokémon

alt=”Pokémon tên Squirtle với siêu dữ liệu đi kèm, nổi bật các trường Health Points, Attack, Defense, Special Attack, Special Defense, Speed và Total”

Viết mã Python hiệu quả

Kết hợp đối tượng

names = ['Bulbasaur', 'Charmander', 'Squirtle']
hps = [45, 39, 44]
combined = []

for i,pokemon in enumerate(names):
    combined.append((pokemon, hps[i]))

print(combined)
[('Bulbasaur', 45), ('Charmander', 39), ('Squirtle', 44)]
Viết mã Python hiệu quả

Kết hợp bằng zip

names = ['Bulbasaur', 'Charmander', 'Squirtle']
hps = [45, 39, 44]
combined_zip = zip(names, hps)

print(type(combined_zip))
<class 'zip'>
combined_zip_list = [*combined_zip]

print(combined_zip_list)
[('Bulbasaur', 45), ('Charmander', 39), ('Squirtle', 44)]
Viết mã Python hiệu quả

Mô-đun collections

  • Thuộc Thư viện Chuẩn Python (mô-đun tích hợp)
  • Kiểu cấu trúc dữ liệu chứa chuyên biệt
    • Thay thế cho dict, list, set, tuple dùng chung
  • Đáng chú ý:
    • namedtuple: tuple có trường đặt tên
    • deque: giống list, thêm/xóa cuối nhanh
    • Counter: dict đếm đối tượng băm được
    • OrderedDict: dict giữ thứ tự mục
    • defaultdict: dict gọi hàm tạo cho giá trị thiếu
Viết mã Python hiệu quả

Mô-đun collections

  • Thuộc Thư viện Chuẩn Python (mô-đun tích hợp)
  • Kiểu cấu trúc dữ liệu chứa chuyên biệt
    • Thay thế cho dict, list, set, tuple dùng chung
  • Đáng chú ý:
    • namedtuple: tuple có trường đặt tên
    • deque: giống list, thêm/xóa cuối nhanh
    • Counter: dict đếm đối tượng băm được
    • OrderedDict: dict giữ thứ tự mục
    • defaultdict: dict gọi hàm tạo cho giá trị thiếu
Viết mã Python hiệu quả

Đếm bằng vòng lặp

# Kiểu của từng Pokémon (tổng 720)
poke_types = ['Grass', 'Dark', 'Fire', 'Fire', ...]

type_counts = {}
for poke_type in poke_types: if poke_type not in type_counts: type_counts[poke_type] = 1 else: type_counts[poke_type] += 1
print(type_counts)
{'Rock': 41, 'Dragon': 25, 'Ghost': 20, 'Ice': 23, 'Poison': 28, 'Grass': 64,
 'Flying': 2, 'Electric': 40, 'Fairy': 17, 'Steel': 21, 'Psychic': 46, 'Bug': 65,
 'Dark': 28, 'Fighting': 25, 'Ground': 30, 'Fire': 48,'Normal': 92, 'Water': 105}
Viết mã Python hiệu quả

collections.Counter()

# Kiểu của từng Pokémon (tổng 720)
poke_types = ['Grass', 'Dark', 'Fire', 'Fire', ...]

from collections import Counter
type_counts = Counter(poke_types)
print(type_counts)
Counter({'Water': 105, 'Normal': 92, 'Bug': 65, 'Grass': 64, 'Fire': 48,
         'Psychic': 46, 'Rock': 41, 'Electric': 40, 'Ground': 30,
         'Poison': 28, 'Dark': 28, 'Dragon': 25, 'Fighting': 25, 'Ice': 23,
         'Steel': 21, 'Ghost': 20, 'Fairy': 17, 'Flying': 2})
Viết mã Python hiệu quả

Mô-đun itertools

  • Thuộc Thư viện Chuẩn Python (mô-đun tích hợp)
  • Công cụ hàm cho việc tạo và dùng iterator
  • Đáng chú ý:
    • Iterator vô hạn: count, cycle, repeat
    • Iterator hữu hạn: accumulate, chain, zip_longest, ...
    • Bộ sinh kết hợp: product, permutations, combinations
Viết mã Python hiệu quả

Mô-đun itertools

  • Thuộc Thư viện Chuẩn Python (mô-đun tích hợp)
  • Công cụ hàm cho việc tạo và dùng iterator
  • Đáng chú ý:
    • Iterator vô hạn: count, cycle, repeat
    • Iterator hữu hạn: accumulate, chain, zip_longest, ...
    • Bộ sinh kết hợp: product, permutations, combinations
Viết mã Python hiệu quả

Kết hợp bằng vòng lặp

poke_types = ['Bug', 'Fire', 'Ghost', 'Grass', 'Water']

combos = [] for x in poke_types: for y in poke_types: if x == y: continue if ((x,y) not in combos) & ((y,x) not in combos): combos.append((x,y))
print(combos)
[('Bug', 'Fire'), ('Bug', 'Ghost'), ('Bug', 'Grass'), ('Bug', 'Water'),
 ('Fire', 'Ghost'), ('Fire', 'Grass'), ('Fire', 'Water'),
 ('Ghost', 'Grass'), ('Ghost', 'Water'), ('Grass', 'Water')]
Viết mã Python hiệu quả

itertools.combinations()

poke_types = ['Bug', 'Fire', 'Ghost', 'Grass', 'Water']

from itertools import combinations
combos_obj = combinations(poke_types, 2)
print(type(combos_obj))
<class 'itertools.combinations'>
combos = [*combos_obj]
print(combos)
[('Bug', 'Fire'), ('Bug', 'Ghost'), ('Bug', 'Grass'), ('Bug', 'Water'),
 ('Fire', 'Ghost'), ('Fire', 'Grass'), ('Fire', 'Water'),
 ('Ghost', 'Grass'), ('Ghost', 'Water'), ('Grass', 'Water')]
Viết mã Python hiệu quả

Ayo berlatih!

Viết mã Python hiệu quả

Preparing Video For Download...