Kodomo

Пользователь

Занятие 4. Условия и циклы. Первый фрактал своими руками.

Что мы уже знаем

Функции конвертации (приведения) к вещественным и целым числам:

   1 >>> int(5/4)
   2 1
   3 >>> float(7)
   4 7.0

Список (list). Его можно выразить в тексте программы через разделённые запятыми значения (элементы), заключённые в квадратные скобки. Элементы списка могут быть разных типов.

   1 >>> a = ['эй', 'привет', 100, 1234]
   2 >>> 
   3 ['эй', 'привет', 100, 1234]

Операции над строками:

   1 >>> str(122) + 'asdasd'
   2 '122asdasd'

логический тип данных:

   1 >>> bool(212)    # bool(значение) возвращает либо True (когда значение не 0)
   2 True             # либо False (когда оно 0)
   3 >>> 1<2<3==1 
   4 False
   5 >>> ((1<2)<3)==1 # уловите разницу!)
   6 True
   7 >>> 2<1 and 3<4
   8 False            # совместно с and и or
   9 >>> 2>3 or 3<4
  10 True

Операторы Vs выражения

известные нам:

   1 >>> print ('Hi people') # - print ( )
   2 Hi people
   3 >>> import math # импорт имя.модуля
   4 >>> def имя(аргументы): 
   5         блок операторы # определяет функцию
   6         return  выражение # return - это тоже известный нам оператор
   7 
   8 >>> name = выражение   # оператор присваивания
   9 >>> if выражение:
  10        блок операторы  # оператор if. интуитивно понятно что он делает:
  11 >>> if 5<10:
  12         print('5<10 it`s true')
  13 
  14         
  15 5<10 it`s true
  16 >>> 123   # оператор выражения
  17 123
  18 def hello():
  19     print ('hello')
  20 
  21 >>> hello()
  22 hello

Выражения:

   1 >>> 1   #  выражение числовой константы
   2 >>> 'hello' #  выражение строковой константы
   3 >>> [1] #  выражение создания списка 
   4 >>> 2*2 # математические операции
   5 4
   6 >>> 2+4 # "+" для чисел
   7 6
   8 >>> [1,2,3] + [3,4,5] # а это сложение списков (конкатенация)
   9 [1,2,3,3,4,5]
  10 >>> a = 2 # оператор присваивания!!!
  11 >>> a     # выражение получения значения переменной
  12 2
  13 >>> abs(-2) # выражения вызова функции
  14 2
  15 >>> [].apppend(1) # выражение вызова метода на объекте ( именно в этом случае объект меняется, а результат не выдается)
  16 >>> 1j.imag  #  выражение получения атрибута объекта ( в этом случае мнимой части )
  17 1
  18 >>> ['a','b','c'][0] #  выражения получения элемента списка по индексу (индексация)
  19 'a'

Циклы:

Цикл сводится к последовательности действий : переменной цикла присваевается значение из очередного элемента списка, и выполняется тело цикла. это 1 итерация; она выполняется для каждого элемента списка.

   1 >>> for i in [2,3,4,5]:          # оператор for объявляет цикл с переменной i
   2         print('i*(i+1) =', i*(i+1))  # это тело цикла
   3                                      # Цикл – команда питону исполнить набор каких-либо действий определённое количество раз. 
   4                                      # Каждое такое исполнение называется итерацией цикла.
   5         
   6 i*(i+1) = 6
   7 i*(i+1) = 12
   8 i*(i+1) = 20
   9 i*(i+1) = 30   

Функция range

Наиболее частая задача цикла – выполнить тело n раз или пройтись по числам от 1 до n. Для этого нужна функция range(n) . range(n) - функция, выдающая список из чисел от 0 до n-1 . range можно вызывать 3-мя способами:

   1 >>> range(10)                        # функция range(значение) создает список, содержащий арифметическую прогрессию:
   2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]       
   3 >>> range(10,20)
   4 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] # c 10-го по 20
   5 >>> range(10,1,-1)                   # период здесь равен -1
   6 [10, 9, 8, 7, 6, 5, 4, 3, 2]         

Обратите внимание: и слайсы, и range: левый край включается, правый не включается.

Индексы и слайсы

   1 >>> a=range(1,10)
   2 >>> a[2]                             # так мы "вытаскиваем" элемент с индексом 2( индексирование)
   3 3
   4 >>> a[-1]                            # последний элемент списка
   5 >>> a.insert(2,55)                   # вставить 55 перед второй позицией (получается что элемент 55 сам становится вторым)
   6 [1, 2, 55, 3, 4, 5, 6, 7, 8, 9]     
   7 >>> a[3:6]                           # еще списки можно "разрезать"
   8 [3, 4, 5]
   9 >>> a[1:5:2]                         # как и для range можно указать шаг (или период). Здесь нумерация начинается с 0
  10 [2, 3]
  11 >>> a[10:3:-2]                       # как и для range  шаг может быть отрицательный
  12 [9, 7, 5]                            # обратите внимание!, нумерация здесь начинается с конца и -1 это последний элемент списка, -2  
  13                                      # -- предпоследний и т.д.
  14 
  15 >>> a[:2]=[]                         # заменить все от начала до 2го элемента на "ничего"
  16 >>> a
  17 [55, 3, 4, 5, 6, 7, 8, 9]

Пример про сложности со ссылками

Пример, показывающий различие между объектом и его именем, а также о пользе слайса длиной во весь список:

   1 >>> a=[[1]]
   2 >>> b=a[0]
   3 >>> b
   4 [1]
   5 >>> a.append(b)                  # добавляет сам объект b; то есть когда мы изменяем объект b изменяется и элемент b из списка а
   6 >>> a
   7 [[1], [1]]
   8 >>> a.append(b[:])               # добавляет (!) копию списка b, то есть только его содержание, поэтому последующее изменение b  
   9 >>> a                            # никак не отражается на элементе в а, соответствующему содержанию b
  10 [[1], [1], [1]]
  11 >>> b.append('почему?)')
  12 >>> a
  13 [[1, 'почему?)'], [1, 'почему?)'], [1]]
  14 >>> a
  15 [[1, 'почему?)'], [1, 'почему?)'], [1]]

   1                            #   вот некое графическое представление того, что происходит
   2                            #   a ----> [|.|]
   3                            #             `-> [.]   это b
   4                            #                  '->[1]
   5                            #   append(b)   a---> [|.|,|.|]   ( т.к. a[0] = b )
   6                            #                   b <-'   '-> b ( то есть [1])
   7                            #   append(b[:]) --->     [|1|,|1|,|.|] [1](из b)
   8                            #                           b   b   ^----' 
   9                            #   видно что когда b меняется, меняются и 0 и 1 элементы а, тогда как 2й элемент остается 1.

Дополнение к циклам: операторы break, continue

Оператор break прерывает выполнение самого ближайшего вложенного цикла for или while.

Оператор continue продолжает выполнение цикла со следующей итерации.

Операторы циклов могут иметь ветвь else. Она исполняется, когда цикл выполнил перебор до конца (в случае for) или когда условие становится ложным (в случае while), но не в тех случаях, когда цикл прерывается по break.Пример:

   1 >>> for n in range(2, 10):
   2 ...     for x in range(2, n):
   3 ...         if n % x == 0:
   4 ...             print(n, 'равно', x, '*', n//x)  # n//x - остаток от деления n на х
   5 ...             break
   6 ...     else:
   7 ...         # циклу не удалось найти множитель
   8 ...         print(n, '- простое число')
   9 ...
  10 2 - простое число
  11 3 - простое число
  12 4 равно 2 * 2
  13 5 - простое число
  14 6 равно 2 * 3
  15 7 - простое число
  16 8 равно 2 * 4
  17 9 равно 3 * 3
  18 
  19 >>> for i in [1,2,3]:   # continue:
  20         print(1)
  21         continue
  22         print('sss')
  23 
  24         
  25 1
  26 1
  27 1

Оператор pass

Оператор pass не делает ничего. Он может использоваться когда синтаксически требуется присутствие оператора, но от программы не требуется действий. Например:

   1 >>> while True:
   2 ...       pass # Ожидание прерывания c клавиатуры (Ctrl+C) в режиме занятости
   3 ...

Собственно, фрактал

как его задать можно посмотреть выше)