Кодировки, исключения и генераторы

Долги за прошлую лекцию:

   1 def fn():
   2   c = b
   3   b = 1
   4 
   5 b=3
   6 fn()

Пример исходного кода

Генератор «красивого» лабиринта.

Идея 1
Только половина ячеек лабиринта случайна, из остальных половина заранее проходима, а половина — нет:

.?.?.?.?.…
?#?#?#?#?…
.?.?.?.?.…
?#?#?#?#?…
Идея 2
Алгоритм.
  • Изначально все «?» непроходимы, а все «.» недостижимы.
  • Выбираем любую «.», делаем её достижимой и добавляем в план разведки.
  • Цикл, пока план разведки не пуст:
    • Выбираем случайную ячейку из плана
    • Если у неё есть неразведанный сосед (через одну ячейку)
      • Добавляем её обратно в план
      • Делаем соседа достижимым и добавляем его в план
      • Делаем стену между этой ячейкой и этим соседом проходимой
Идея 3
Если поместить в план разведки и вход, и выход, получится непроходимый лабиринт

   1 import random
   2 
   3 N = 15
   4 D = (-2,0), (0,2), (2,0), (0,-2)
   5 Map = {(i,j):2-(i%2|j%2) for i in xrange(N) for j in xrange(N)}
   6 Todo = [(N/2&-2,N/2&-2)] if random.randrange(2) else [(0,0),(N-1,N-1)]
   7 for x,y in Todo:
   8     Map[x,y]=0
   9 
  10 while Todo:
  11     x,y = Todo.pop(random.randrange(len(Todo)))
  12     Check = [(dx,dy) for dx,dy in D if 0<=x+dx<N and 0<=y+dy<N and Map[x+dx,y+dy]]
  13     if Check:
  14         dx,dy = random.choice(Check)
  15         Todo.extend([(x,y),(x+dx,y+dy)])
  16         Map[x+dx,y+dy]=Map[x+dx/2,y+dy/2]=0
  17 
  18 for i in xrange(N):
  19     print "".join(".#"[Map[i,j]] for j in xrange(N))

И результат:

...#.#.#.#.....
.###.#.#.#.#.##
...#.#...#.#.#.
##.#.#.###.###.
.........#.#.#.
.###.#####.#.#.
.#.............
####.#.#.###.##
.....#.#...#...
####.#.#.#.###.
.....#.#.#...#.
.#.#.###.###.##
.#.#.#.....#...
.#######.###.#.
.#.........#.#.

Кодировка, строки, u-строки и их преобразование

Пример:

   1 # coding: utf
   2 a="Ку!"
   3 b=bytearray(a)
   4 u=unicode(a,"UTF")            # что будет без "UTF"?
   5 print "|".join(map(hex, b)) 
   6 print "|".join(a)
   7 print "|".join(u)
   8 print a,b,u

Исключения

Генераторы

JT: Отложенные вычисления и… «побочный эффект»

Д/З

LecturesCMC/PythonIntro2014/05_ExceptionsGenerators (последним исправлял пользователь FrBrGeorge 2014-11-03 15:06:03)