Язык Python в школьном курсе информатики

Содержание

Слайд 2

Популярность https://www.tiobe.com/tiobe-index/ май 2017: Java C C++ Python C# Visual Basic.NET

Популярность

https://www.tiobe.com/tiobe-index/

май 2017:

Java
C
C++
Python
C#
Visual Basic.NET
JavaScript
Ассемблер

в восьмёрке с 2008 года!

Слайд 3

Использование Компании и сайты Google Яндекс CERN NASA Instagram … Скрипты

Использование

Компании и сайты
Google
Яндекс
CERN
NASA
Instagram

Скрипты в программах:
GIMP
Blender
Cinema 4D
Maya
Inkscape
Scribus

Linux, Windows, FreeBSD, Mac OS X,


Android, iOS…

Скрипты в играх:
Eve Online,
Civilization IV
Battlefield 2
Vampire

Слайд 4

Для обучения Университеты и колледжи: США – 33 University of California

Для обучения

Университеты и колледжи:
США – 33
University of California
University of Florida
University of

Iowa
Massachusetts Institute of Technology (MIT)
Канада – 8
University of Toronto
University of Alberta
Франция – 6
Великобритания – 5
University of Oxford
Австралия – 3
Испания – 3

https://wiki.python.org/moin/SchoolsUsingPython

Вытесняет С и Java!

Москва:
СУНЦ МГУ
школа № 179 (МИОО)
школа № 2007
гимназия №1543 
гимназия «Вторая школа»
школа № 57

Слайд 5

Учебник К.Ю. Полякова и Е.А. Еремина

Учебник К.Ю. Полякова и Е.А. Еремина

Слайд 6

Олимпиады Всероссийская олимпиада школьников Всероссийская командная олимпиада школьников Московская командная олимпиада

Олимпиады

Всероссийская олимпиада школьников
Всероссийская командная олимпиада школьников
Московская командная олимпиада школьников
Московская олимпиада школьников


Командная олимпиада школьников Санкт-Петербурга
Интернет-олимпиады ИТМО
Russian Code Cup

Сайты с автоматической проверкой решений:

informatics.mccme.ru
codeforces.com
acm.timus.ru
acmp.ru

Слайд 7

Почему Python?

Почему Python?

Слайд 8

Динамическая типизация A = 100 # целое A = 4.5 #

Динамическая типизация

A = 100 # целое
A = 4.5 # вещественное
A

= "Привет!" # строка
A = [1, 2, 3, 4, 5] # список (массив)
A = (1, "Вася", 3) # кортеж
A = {"Вася": 1, "Петя": 23} # словарь
Слайд 9

Динамическая типизация def solve ( a, b ): # a*x =

Динамическая типизация

def solve ( a, b ): # a*x = b

if a == 0:
if b == 0: return True
else: return None
else:
return b / a

логическое значение

пустое значение

число

Слайд 10

Структура = отступы Условный оператор: if x > 0: a =

Структура = отступы

Условный оператор:

if x > 0:
a = x
if

x > 1:
b = x
c = a + x
else:
b = x - 1
c = x*x
d = b + c

Цикл:

s = 0
for x in range(100):
a = x
c = 0
while a > 0:
c += a % 8
a = a // 8
s = s + c

Слайд 11

Компактность while b 0 do begin c := a mod b;

Компактность

while b <> 0 do begin
c := a mod b;

a := b;
b := c
end;
writeln ( a );

Алгоритм Евклида:

while b:
a, b = b, a % b
print ( a )

a, b = b, a

c := a
a := b
b := c

Обмен значений двух переменных:

a ← b0
b ← a0 mod b0

Слайд 12

Списки (массивы) Заполнение A = [0]*N for i:=0 to N-1 do

Списки (массивы)

Заполнение

A = [0]*N

for i:=0 to N-1 do
A[i] := 0;

for

i:=0 to N-1 do
A[i] := i*i;

A = [i*i
for i in range(N)]

Максимум

M := A[0];
for i:=1 to N-1 do
if A[i] > M then
M := A[i];

M = max(A)

Слайд 13

Списки (массивы) Выборка элементов по условию count := 0; for i:=0

Списки (массивы)

Выборка элементов по условию

count := 0;
for i:=0 to N-1 do

if A[i] > 0 then begin
count := count + 1;
B[count] := A[i]
end;

B = [x for x in A if x > 0]

Сортировка

for i:=0 to N-1 do
for j:=N-2 downto i do
if A[j] > A[j+1] then begin
c:=A[j]; A[j]:=A[j+1];
A[j+1]:=c
end;

A.sort()

B = [x
for x in A
if x > 0]

for x in A

Слайд 14

Списки (массивы) Реверс массива for i:=1 to N div 2 do

Списки (массивы)

Реверс массива

for i:=1 to N div 2 do begin
c

:= A[i];
A[i] := A[N-i+1];
A[N-i+1] := c
end;

A = A[::-1]

Слайд 15

Списки (массивы) Удалить повторяющиеся элементы массива count := 0; for i:=1

Списки (массивы)

Удалить повторяющиеся элементы массива

count := 0;
for i:=1 to N do

begin
j := 1;
while (j <= count) and (A[i] <> B[j]) do
j := j + 1;
if j > count then begin
count := count + 1;
B[count] := A[i]
end
end;

B = list( set(A) )

Слайд 16

Длинная арифметика Задача: вычислить 100! = 1 ⋅ 2 ⋅ 3

Длинная арифметика

Задача: вычислить 100! = 1 ⋅ 2 ⋅ 3 ⋅

… ⋅ 100

const N = 33;
d = 1000000;
var A: array[0..N] of longint;
i, k, s, r: integer;
begin
A[0]:= 1;
for k:= 2 to 100 do begin
r:= 0;
for i:= 0 to N do begin
s:= A[i]*k + r;
A[i]:= s mod d;
r := s div d
end
end
{ вывод длинного числа из
массива A }
end.

import math
print ( math.factorial(100) )

A = 1
for i in range(2,101):
A = A*i
print ( A )

или так:

Слайд 17

Словари (ассоциативные массивы) D = {} # пустой словарь D["cat"] =

Словари (ассоциативные массивы)

D = {} # пустой словарь

D["cat"] = 15 #

добавление в словарь
D["dog"] = "собака"

for key in D: # cat
print(key) # dog

for value in D.values(): # 15
print(value) # собака

for key, value in D.items(): # cat -> 15
print(key, "->", value) # dog -> собака

Неизменяемая величина!

D[(1,2)] = [1, 2, 34]

Слайд 18

Алфавитно-частотный словарь Задача: построить алфавитно-частотный словарь uses WordList; var F: text;

Алфавитно-частотный словарь

Задача: построить алфавитно-частотный словарь

uses WordList;
var F: text; s: string;
L:

TWordList; p: integer;
begin
Assign(F, 'input.txt'); Reset(F);
SetLength(L.data, 0);
L.size := 0;
while not eof(F) do begin
readln(F, s);
p := Find ( L, s );
if p >= 0 then
L.data[p].count := L.data[p].count + 1
else begin
p := FindPlace ( L, s );
InsertWord ( L, p, s );
end
end;
Close(F);
...
end.

Модуль ≈ 50 строк!

D = {}
for line in open("input_list.txt"):
word = line.strip()
if word:
D[word] = D.get(word, 0) + 1

Слайд 19

var N, NN: integer; … write ( "Введите число " );

var N, NN: integer;

write ( "Введите число " );
read ( N

);
NN := N*2;
write ( NN );

Ввод с клавиатуры

N = input ( "Введите число " )
NN = N * 2
print ( NN )

тип неизвестен!

1212

Введите число 12

N = int(input("Введите число "))
NN = N * 2
print ( NN )

24

Введите число 12

Слайд 20

var a, b, c: integer; … write ( "Введите три числа

var a, b, c: integer;

write ( "Введите три числа " );
read

( a, b, c );

Ввод с клавиатуры

s = input ( "Введите три числа " ) # "1 2 3"
a, b, c = map ( int, s.split() )

q = s.split() # список ["1", "2", "3"]
a = int(q[0]) # 1
b = int(q[1]) # 2
c = int(q[2]) # 3

Слайд 21

const MAX = 1000; var i, N: integer; A: array[0..MAX-1] of

const MAX = 1000;
var i, N: integer;
A: array[0..MAX-1] of integer;

readln

( N );
for i:=0 to N-1 do
read ( A[i] );

Ввод массива с клавиатуры

N = int(input())
A = list( map(int, input().split()) )

N не нужно!

Слайд 22

Поиск трёх максимумов N = int(input()) max1 = max2 = max3

Поиск трёх максимумов

N = int(input())
max1 = max2 = max3 = -10001
for

i in range(N):
x = int(input())
if x > max1:
max1,max2,max3 = x,max1,max2
elif x > max2:
max2,max3 = x,max2
elif x > max3:
max3 = x
print(max1, max2, max3)
Слайд 23

C2 (демо-2014) Задача: найти и вывести максимальное значение среди трёхзначных элементов

C2 (демо-2014)

Задача: найти и вывести максимальное значение среди трёхзначных элементов массива,

не делящихся на 9.

max := 0;
for i := 0 to N-1 do
if (100<=a[i]) and (a[i]<=998) and
(a[i] mod 9<>0) and (a[i]>max) then
max := a[i];
if max > 0 then
writeln(max)
else writeln("Не найдено");

a = [x for x in a
if 100 <= x and x <= 999
and x % 9 != 0]
if len(a) > 0:
print(max(a))
else:
print("Не найдено")

for x in a

Слайд 24

C4 Задача: В первой строке вводится количество учащихся N, далее идут

C4

Задача: В первой строке вводится количество учащихся N, далее идут N

строк в формате:
<Фамилия> <Инициалы> <номер школы>
Номер школы < 100.
Из какой школы было меньше всего участников (таких школ может быть несколько)?
Слайд 25

C4 (решение) const LIM = 99; var C:array[1..LIM] of integer; i,

C4 (решение)

const LIM = 99;
var C:array[1..LIM] of integer;
i, p, N,

k, r, Min: integer;
s:string;
begin
for k:=1 to 99 do C[k]:=0;
readln(N);
for i:=1 to N do begin
readln(s);
p := Pos(' ', s);
Delete(s, 1, p+5);
Val(s, k, r);
C[k] := C[k] + 1
end;
Min := N;
for k:=1 to LIM do
if (C[k] <> 0) and (C[k] Min := C[k];
for k:=1 to LIM do
if C[k] = Min then
writeln(k);
end.

N = int(input())
schCount = {}
for i in range(N):
x, x, school = input().split()
schCount[school] = \
schCount.get(school, 0) + 1
minCount = min(schCount.values())
schMin = [x[0] for x in schCount.items()
if x[1] == minCount]
for x in sorted(schMin):
print(x)

словарь
«номер-счётчик»

Слайд 26

C4-2014 Задача: В первой строке вводится длина N последовательности, далее идут

C4-2014

Задача: В первой строке вводится длина N последовательности, далее идут N

положительных чисел, по одному в строке, а затем – контрольная сумма R – наибольшее произведение двух различных элементов последовательности, которое делится на 21. Проверить правильность контрольной суммы.
Слайд 27

C4-2014 (решение) N = int(input()) M3 = M7 = M21 =

C4-2014 (решение)

N = int(input())
M3 = M7 = M21 = M =

0
for i in range(N):
x = int(input())
if x % 21 != 0:
if x % 3 == 0: M3 = max(M3, x)
if x % 7 == 0: M7 = max(M7, x)
if x % 21 == 0 and x > M21:
M = max(M21, M)
M21 = x
else: M = max(M, x)
R0 = int(input())
R = max(M3*M7, M21*M)
if R == R0: print("Контроль пройден")
else: print("Контроль не пройден")
Слайд 28

ЕГЭ-27 (2016) Вводится N пар чисел (x,y) (-10000 ≤ x, y

ЕГЭ-27 (2016)

Вводится N пар чисел (x,y) (-10000 ≤ x, y ≤

10000). Выбрать по одному числу из пары, так, чтобы сумма этих чисел была максимальной и не делилась на k. Если такую сумму найти невозможно, требуется вывести «0».

В цикле:
ищем максимальную сумму
одновременно ищем пару с наименьшей разностью, где разность не делится на k
После цикла:
если сумма не делится на k, выводим сумму
если сумма делится на k, пытаемся скорректировать, вычитая минимальную разность
если такой разности нет – выводим 0

Слайд 29

ЕГЭ-27 (2016) N = int(input()) k = 7 deltaMin = 20001

ЕГЭ-27 (2016)

N = int(input())
k = 7
deltaMin = 20001
sum = 0
for i

in range(N):
a, b = map(int, input().split())
sum += max(a, b)
delta = abs(a-b)
if delta % k != 0 and delta < deltaMin :
deltaMin = delta
if sum % k != 0:
print(sum)
elif: deltaMin != 20001:
print(sum-deltaMin)
else: print(0)
Слайд 30

ЕГЭ-27 (2018) Вводится N чисел. Сколько можно составить пар, произведение которых

ЕГЭ-27 (2018)

Вводится N чисел. Сколько можно составить пар, произведение которых делится

на 26?

В цикле из N шагов:
вводим число
считаем
n26 – количество делящихся на 26
n13 – количество делящихся на 13, но не на 2
n2 – количество делящихся на 2, но не на 13

После цикла:
k = n26*(n26-1)//2 + n26*(N-n26) + n13*n2

Слайд 31

ЕГЭ-27 (2016) n2 = n13 = n26 = 0 N =

ЕГЭ-27 (2016)

n2 = n13 = n26 = 0
N = int(input())
for i

in range(0, N) :
x = int(input())
if x % 26 == 0: n26 += 1
elif x % 13 == 0: n13 += 1
elif x % 2 == 0: n2 += 1
print(n26*(n26-1)//2 + n26*(N-n26) + n13*n2)
Слайд 32

Функциональное программирование Функция – объект, который можно передавать в другие функции

Функциональное программирование

Функция – объект, который можно передавать в другие функции как

аргумент и возвращать как результат других функций.

Языки LISP, Scheme, Haskell, Scala, Erlang, F#, …

Слайд 33

Функциональное программирование Генератор списков for i:=0 to N do A[i] :=

Функциональное программирование

Генератор списков

for i:=0 to N do
A[i] := i*i;

A =

[i*i
for i in range(N)]

Самая длинная строка в файле

s = max ( open("test.txt"), key=len )

count := 0;
for i:=0 to N do
if f(i) = 0 then begin
A[count] := i*i;
count := count + 1;
end;

A = [i*i
for i in range(N)
if f(i) == 0 ]

ключ сортировки

Слайд 34

Отбор элементов по условию count := 0; for i:=0 to N-1

Отбор элементов по условию

count := 0;
for i:=0 to N-1 do
if

A[i]*A[i]*A[i] > 100 then begin
count := count + 1;
B[count] := A[i]
end;

B = [x
for x in A
if x**3 > 100]

!

!

!

!

Задача: Отобрать в массив B все элементы массива A, кубы которых больше 100.

Слайд 35

Обработка всех элементов списка (map) for i:=0 to N-1 do B[i]

Обработка всех элементов списка (map)

for i:=0 to N-1 do
B[i] :=

sin(A[i]);

B = list( map(math.sin, A) )

A

B

функция передаётся как параметр функции

Слайд 36

Обработка всех элементов списка (map) Функции без имени (λ-функции) function x5(x:

Обработка всех элементов списка (map)

Функции без имени (λ-функции)

function x5(x: integer): integer;
begin

x5 := x*x*x*x*x;
end;
...
for i:=0 to N-1 do
B[i] := x5(A[i])

def x5 ( x ):
return x**5
B = list( map(x5, A) )

B = list( map( lambda x: x**5 , A) )

lambda x: x**5

sqr = lambda x: x**2
prod = lambda p, x: p * x

lambda x: x**2

lambda p, x: p * x

Переменные-функции

Слайд 37

Map – Reduce for i:=0 to N-1 do B[i] := f(A[i]);

Map – Reduce

for i:=0 to N-1 do
B[i] := f(A[i]);

result :=

B[0];
for i:=1 to N-1 do
result := G(result, B[i]);

Map

A

B

Reduce

Задача: Определить, сколько страниц со словом «Python» есть на всех серверах компании.

каждый сервер отдельно!

Слайд 38

B = list( map( , A) ) p = reduce( ,

B = list( map( , A) )
p = reduce( , B

)

Map – Reduce

B = list( map( f, A ) )
p = reduce( G, B )

lambda p, x: p+x

from functools import reduce

функция обработки

функция накопления

Пример:

lambda x: x*x

Слайд 39

Функциональное программирование Замена цикла рекурсией function sumDigits(x: integer): integer; var s:

Функциональное программирование

Замена цикла рекурсией

function sumDigits(x: integer): integer;
var s: integer;
begin
s :=

0;
while x <> 0 do begin
s := s + x mod 10;
x := x div 10
end;
sumDigits := s
end;

!

!

def sumDigits ( x ):
return sum( map(int, str(n)) )

def sumDigits ( x ):
if x > 0:
return ( x % 10 +
sumDigits(x//10) )
else:
return 0

Слайд 40

Функциональное программирование Замена цикла рекурсией def isPalindrome ( s ): for

Функциональное программирование

Замена цикла рекурсией

def isPalindrome ( s ):
for i in

range(len(s) // 2):
if s[i] != s[-1-i]:
return False
return True

def isPalindrome ( s ):
if len(s) > 1:
return s[0] == s[-1] and \
isPalindrome(s[1:-1])
else:
return True

!

!

Слайд 41

Функциональное программирование Замена цикла рекурсией def balance ( s ): opened

Функциональное программирование

Замена цикла рекурсией

def balance ( s ):
opened = 0

for c in s:
if c == '(':
opened += 1
elif c == ')':
if opened < 1:
return False
opened -= 1
return opened == 0

def balance ( s, open = 0 ):
if len(s) == 0:
return open == 0
elif s[0] == '(':
return balance(s[1:], open+1)
elif s[0] == ')':
return open > 0 and \
balance(s[1:], open-1)
else:
return balance(s[1:], open)

(if(z)x(/))

():-)

()())(()

Слайд 42

Функциональное программирование Функция, возвращающая функцию def createFunc ( valid ): def

Функциональное программирование

Функция, возвращающая функцию

def createFunc ( valid ):
def f (

s ):
return s == valid
return f

запомнили!

check = createFunc ( "pass" )
print ( check("pass") ) # True
print ( check("bla-bla-bla") ) # False

получили функцию

Слайд 43

Черепашья графика from turtle import * def tree ( levels, length

Черепашья графика

from turtle import *
def tree ( levels, length ):

if levels > 0:
forward ( length )
left ( 45 )
tree ( levels-1, length*0.6)
right ( 90 )
tree ( levels-1, length*0.6)
left ( 45 )
backward ( length )
setheading ( 90 )
tree ( 5, 100 )

from turtle_rus import *
def дерево ( уровни, длина ):
if уровни > 0:
вперед ( длина )
влево ( 45 )
дерево ( уровни-1, длина*0.6)
вправо ( 90 )
дерево ( уровни-1, длина*0.6)
влево ( 45 )
назад ( длина )
новый_курс ( 90 )
дерево ( 5, 100 )

Слайд 44

Графика (модуль graph) http://kpolyakov.spb.ru/school/probook/python.htm from graph import * penColor(255, 0, 255)

Графика (модуль graph)

http://kpolyakov.spb.ru/school/probook/python.htm

from graph import *
penColor(255, 0, 255)
penSize(5)
brushColor("blue")
rectangle(100, 100, 300,

200)
brushColor("yellow")
polygon([(100,100),(200,50),(300,100),(100,100)])
penColor("white")
brushColor("green")
circle(200, 150, 50)
run()
Слайд 45

Графика (модуль graph) from graph import * def treug ( x,

Графика (модуль graph)

from graph import *
def treug ( x, y, c

):
brushColor(c)
polygon( [(x,y), (x,y-60),
(x+100,y), (x,y)] )
penColor ( "black" )
treug ( 100, 100, "blue" )
treug ( 200, 100, "red" )
treug ( 200, 160, "green" )
run()
Слайд 46

Графика (модуль graph) from graph import * def row ( y

Графика (модуль graph)

from graph import *
def row ( y ):
x

= 40
for i in range(5):
circle(x, y, 20)
x += 60
y = 40
for k in range(3):
row(y)
y += 60
run()
Слайд 47

Графика (модуль graph) from graph import * def f(x): return x**3

Графика (модуль graph)

from graph import *
def f(x):
return x**3
viewCoords(-1, 1, -1,

1) # пределы по X и Y
line(-1, 0, 1, 0) # ось X
line(0, -1, 0, 1) # ось Y
x = -1
moveTo ( x, f(x) )
while x <= 1:
y = lineTo ( x, f(x) )
x += 0.1
run()
Слайд 48

Графика (модуль graph) from graph import * from random import randint

Графика (модуль graph)

from graph import *
from random import randint
def newPoint():
x

= randint(0, 150)
y = randint(0, 150)
penColor(randColor())
point(x, y)
def keyPressed(event):
if event.keycode == VK_ESCAPE:
close()
onTimer(newPoint, 10)
onKey(keyPressed)
run()

установка обработчиков событий

Слайд 49

Анимация (модуль graph) Неуправляемое движение def update(): x += dx; y

Анимация (модуль graph)

Неуправляемое движение

def update():
x += dx; y += dy

moveObjectTo(x, y)
onTimer(update, 10)

2) Ожидание нажатия клавиши-стрелки и движение

def keyPressed(event):
if event.keycode == VK_LEFT:
moveObjectTo(x-5, y)
...
onKey(keyPressed)

Слайд 50

Анимация (модуль graph) 3) Изменение направления движения при нажатии на клавишу

Анимация (модуль graph)

3) Изменение направления движения при нажатии на клавишу

def update():

moveObjectTo(x+dx, y+dy)
def keyPressed(event):
if event.keycode == VK_LEFT:
dx = -5; dy = 0
...
onTimer(update, 10)
onKey(keyPressed)
Слайд 51

Простые игры (модуль graph) Стрельба по тарелкам: «Поймай шарик»:

Простые игры (модуль graph)

Стрельба по тарелкам:

«Поймай шарик»:

Слайд 52

Простые игры (модуль graph) «Змейка»: «Жизнь»:

Простые игры (модуль graph)

«Змейка»:

«Жизнь»:

Слайд 53

Графический интерфейс Стандартный модуль tkinter. from simpletk import * app =

Графический интерфейс

Стандартный модуль tkinter.

from simpletk import *
app = TApplication("Шестнадцатеричная система")
app.size =

(250, 36)
app.position = (200, 200)
f = ("Courier New", 14, "bold")
hexLabel = TLabel(app, text="?", font=f, fg="navy" )
hexLabel.position = (155, 5)
def onNumChange(sender):
hexLabel.text = "{:X}".format(sender.value)
decEdit = TIntEdit(app, width=12, font=f)
decEdit.position = (5, 5)
decEdit.text = "1001"
decEdit.onChange = onNumChange
app.Run()
Слайд 54

Графический интерфейс Альтернативы: wxPython, PyGTK, PyQt.

Графический интерфейс

Альтернативы:
wxPython, PyGTK, PyQt.

Слайд 55

Библиотеки math – математические функции fractions – рациональные дроби decimal –

Библиотеки

math – математические функции
fractions – рациональные дроби
decimal – десятичная арифметика
random –

случайные числа, случайный выбор, случайная перестановка элементов
re – регулярные выражения
itertools – перестановки, сочетания
webbrowser, urllib, http, ftplib, … – работа с сетью
tkinter – графический интерфейс
pyGame – программирование игр http://www.pygame.org/news.html
simplegui – модуль для программирования игр на сайте http://www.codeskulptor.org
Слайд 56

Достоинства низкий порог входа print ( "Привет!" ) применяется в профессиональных

Достоинства

низкий порог входа
print ( "Привет!" )
применяется в профессиональных разработках
понятный синтаксис, отступы
компактные

решения (за счёт встроенных средств)
язык более высокого уровня, чем C и Паскаль (списки, словари, …)
поддержка любых языков (utf-8)
большая библиотека
возможность разработки программ с графическим интерфейсом
различные подходы к программированию (императивный, ООП, функциональный, …)
Слайд 57

Грабли

Грабли

Слайд 58

Грабли A[1:3] [12, 5] A[2:3] [5] A[:3] [7, 12, 5] A[0:3]

Грабли

A[1:3]

[12, 5]

A[2:3]

[5]

A[:3]


[7, 12, 5]

A[0:3]

A[5:]

[34, 40, 23]

A[5:8]

A[3:-2]

[8, 18, 34]

A[3:6]

len(A)-2

Слайд 59

Грабли var s: string; ... for i:=1 to Length(s) do if

Грабли

var s: string;
...
for i:=1 to Length(s) do
if s[i] = 'a'

then s[i] := 'b';

for i in range(len(s)):
if s[i] == "a":
s = s[:i] + "b" + s[i+1:]

s[i] = "b"

с начала до s[i-1]

от s[i+1] до конца

Слайд 60

Грабли «We are all consenting adults here». x1 = 0 if

Грабли

«We are all consenting adults here».

x1 = 0
if a > b:

xl = 1

нет ошибки!

if a > b:
print("OK")
else:
this is spam

нет ошибки, пока не пришли сюда!

Слайд 61

Грабли s = "1" ... s + s + "2" print(

Грабли

s = "1"
...
s + s + "2"
print( s )

1

должно быть
s

= s + "2"
Слайд 62

Грабли print ( trimLeft(" 123 ") ) print ( trimLeft(123) )

Грабли

print ( trimLeft(" 123 ") )
print ( trimLeft(123) )

def trimLeft (

s ):
while len(s) and s[0] == ' ':
s = s[1:]
return s

нет ошибки, пока не пришли сюда!

Слайд 63

Грабли print ( trimLeft(" 123 ") ) def trimLeft ( s

Грабли

print ( trimLeft(" 123 ") )

def trimLeft ( s ):
while

len(s) and s[0] == ' ':
s = s[1:]

None

return s

A = [2, 1, 3, 7, 5, 4]
B = A.sort()
print ( B )

None

Слайд 64

Грабли A = [1, 2, 3] B = A [1, 2,

Грабли

A = [1, 2, 3]
B = A

[1, 2, 3]

A

B

A[0] = 0

A

= [1, 2, 3]
B = A[:]

копия массива A

[1, 2, 3]

A

[1, 2, 3]

B

A[0] = 0

Слайд 65

Грабли Глобальные и локальные переменные state = 0 def changeState(a, b):

Грабли

Глобальные и локальные переменные

state = 0
def changeState(a, b):
if a >

b:
state = 1
changeState ( 2, 1 )
print ( state )

новая локальная переменная!

0

state = 0
def changeState(a, b):
global state
if a > b:
state = 1
changeState ( 2, 1 )
print ( state )

global state

Слайд 66

Грабли Глобальные и локальные переменные x = 0 def f(): print

Грабли

Глобальные и локальные переменные

x = 0
def f():
print ( x )
f()

OK!

x

= 0
def f():
x += 3
print ( x )
f()

использование локальной переменной до определения!

x = 0
def f():
global x
x += 3
print ( x )
f()

global x

Слайд 67

Грабли class dog: def __init__(self, _age): self.age = _age def spam():

Грабли

class dog:
def __init__(self, _age):
self.age = _age
def spam():
tuzik.age =

100
tuzik = dog(5)
spam()
print(tuzik.age)

нет private!

Слайд 68

Недостатки две несовместимых версии: 2.x и 3.x нужен интерпретатор для выполнения

Недостатки

две несовместимых версии: 2.x и 3.x
нужен интерпретатор для выполнения
низкая скорость (в

100 раз ниже, чем на C)
увеличенный расход памяти
нет проверки типов данных
нет доступа к низкоуровневым средствам (размещение данных в памяти, аппаратура)
неклассическая объектная модель (нет private и protected)
нет надёжных RAD-систем для программ с графическим интерфейсом
Слайд 69

Дистанционное образование https://www.coursera.org/course/interactivepython Введение в интерактивное программирование на языке Python, сайт

Дистанционное образование

https://www.coursera.org/course/interactivepython

Введение в интерактивное программирование на языке Python, сайт Coursera

(англ.)

https://www.edx.org/course/mitx/mitx-6-00-1x-introduction-computer-1498

Введение в computer science и программирование на языке Python, сайт edX (англ.)

http://www.codecademy.com/ru/tracks/python

Языке Python на сайте Codecademy (англ.)

http://www.codeskulptor.org/

Онлайн-среда для интерактивного программирования на языке Python

https://stepik.org/course/https://stepik.org/course/Программированиеhttps://stepik.org/course/Программирование-https://stepik.org/course/Программирование-наhttps://stepik.org/course/Программирование-на-Python-67/
https://stepik.org/course/Python-https://stepik.org/course/Python-основы-и-применениеhttps://stepik.org/course/Python-основы-и-применение-512/

Языке Python на сайте Stepik.org (англ.)

Слайд 70

Дистанционное образование http://server.179.ru/~dk/python.html Материалы по программированию на языке Python на сайте

Дистанционное образование

http://server.179.ru/~dk/python.html

Материалы по программированию на языке Python на сайте школы

179 г. Москва

http://informatics.mccme.ru/course/view.php?id=156

Курс Д. Кириенко на сайте «Дистанционная подготовка по информатике»

http://www.codeskulptor.org/
http://pythontutor.com/
http://ideone.com/
http://www.compileonline.com/execute_python_online.php
http://www.skulpt.org/

Онлайн-среды:

http://pythontutor.ru

Интерактивный учебник языка Python (автор курса – Д. Кириенко)