PL03, Syntax and semantics
Back to the previous page |page management| Contents |official python docs|python tutorials|Lecture
List of posts to read before reading this article
Contents
- Basis of python programming, Data structure
- Build the structure of the program! Control statement
- How to do the input and output of the program
- Advanced python
- Collections
- Regular expression
- Debugging
Basis of python programming, Data structure
Number
Integer
int
type(10)
int
type(10 * 5)
int
floating point number
float
type(10.0)
float
type(0.1)
float
type(10.0 * 5)
float
type(10 / 5)
float
type(123e2) # 12300.0
float
type(123e-2) # 1.23
float
type(123.456e-3) # 0.123456
float
floating point error
0.1
0.1
# method1
%precision 55
0.1
0.1000000000000000055511151231257827021181583404541015625
back to origin
%precision %r
0.1
0.1
# method2
'%.55f'%0.1
0.1000000000000000055511151231257827021181583404541015625
comparsion of floating point numbers
0.1 + 0.2 == 0.3
False
CAUTION
0.1 + 0.2
0.30000000000000004
0.3
0.3
round(0.1 + 0.2, 5) == round(0.3, 5)
True
Cast
float->int
int(1.0)
1
int(3.14)
3
int(3.9)
3
int(-3.9)
-3
int->float
float(1)
1.0
NaN and inf
float("NaN")
nan
float("Inf")
inf
float("-Inf")
-inf
String
List
Tuple
Dictionary
set
numbers = dict(x=5, y=0)
print('numbers =', numbers)
print(type(numbers))
empty = dict()
print('empty =', empty)
print(type(empty))
numbers = {'y': 0, 'x': 5}
<class 'dict'>
empty = {}
<class 'dict'>
get
a = {1:'korea',2:'USA',3:'china'}
print(a.get(1), a)
print(a[1], a)
print(a.pop(1), a)
OUTPUT
korea {1: 'korea', 2: 'USA', 3: 'china'}
korea {1: 'korea', 2: 'USA', 3: 'china'}
korea {2: 'USA', 3: 'china'}
a = {1:'korea',2:'USA',3:'china'}
print(a.popitem(), a)
print(a.popitem(), a)
print(a.popitem(), a)
OUTPUT
(3, 'china') {1: 'korea', 2: 'USA'}
(2, 'USA') {1: 'korea'}
(1, 'korea') {}
change type to list
a = {1:'korea',2:'USA',3:'china'}
print(list(a))
print(list(a.keys()))
print(list(a.values()))
print(list(a.items()))
OUTPUT
[1, 2, 3]
[1, 2, 3]
['korea', 'USA', 'china']
[(1, 'korea'), (2, 'USA'), (3, 'china')]
iteration
dict = {}
dict['name'] = 'ailever'
dict['age'] = 19
for i, j in dict.items():
print(i, j)
name ailever
age 19
Set
s = {1, 2, 3}
s |= {4}
s
{1, 2, 3, 4}
Equivalent code
s = set([1, 2, 3])
s.add(4)
s
{1, 2, 3, 4}
s = {1, 2, 3}
s |= {4,5,6}
s
{1, 2, 3, 4, 5, 6}
Equivalent code
s = set([1, 2, 3])
s.update([4, 5, 6])
s
{1, 2, 3, 4, 5, 6}
s = {1, 2, 3}
s.remove(2)
s
{1, 3}
Equivalent code
s = set([1, 2, 3])
s.remove(2)
s
{1, 3}
s = {1,2,3}
q = {3,4,5}
print(s & q) # {3}, s.intersection(q)
print(s | q) # {1,2,3,4,5}, s.union(q)
print(s - q) # {1,2}, s.difference(q)
{1,2,3,4,5}
{1,2}
Bool
Variable
Build the structure of the program! Control statement
if
is, ==
is | reference |
== | value |
a = 1
print(a is 1)
print(a == 1)
print(id(a))
print(id(1))
True
True
1531412592
1531412592
a = 257
print(a is 257)
print(a == 257)
print(id(a))
print(id(257))
False
True
2396517385200
2396517385616
comprehension
a = 10
b = {a > 0 : 1,
a == 0 : 0}.get(True, -1)
b
a = 10
if a > 0:
b = 1
elif a == 0:
b = 0
else:
b = -1
b
a = 10
b = 1 if a > 0 else ( 0 if a==0 else -1)
b
while
for
comprehension
for
for i in range(10) : print(i)
try/except
try:
raise ZeroDivisionError()
except ZeroDivisionError:
print('error')
error
How to do the input and output of the program
Function
position arguments
def hello(a,b,c):
print(a)
print(b)
print(c)
x = [1,2,3]
y = (1,2,3)
hello(*x) # hello(*[1,2,3])
hello(*y) # hello(*(1,2,3))
OUTPUT
1
2
3
1
2
3
def hello(*args):
print(args)
x = [1,2,3]
y = (1,2,3)
hello(*x) # hello(*[1,2,3])
hello(*y) # hello(*(1,2,3))
OUTPUT
1
2
3
1
2
3
keyword arguments
def hello(name,age,address):
print('name',name)
print('age',age)
print('address',address)
x = {'name':'ailever', 'age':27, 'address':312321}
hello(*x)
hello(**x)
OUTPUT
name name
age age
address address
name ailever
age 27
address 312321
def hello(**kwargs):
print(kwargs)
x = {'name':'ailever', 'age':27, 'address':312321}
hello(**x)
OUTPUT
name ailever
age 27
address 312321
Input/Ouput
Read/Write
Advanced python
Class(1) : basic
Declare Class
class Person:
pass
p1 = Person()
p2 = Person()
OUTPUT
print(type(p1))
print(type(p2))
<class '__main__.Person'>
<class '__main__.Person'>
Access instance
class Person:
def lee(self, x):
print(x)
m = Person()
m.lee(10) # instance name space = bound
Person.lee(m, 10) # class name sapce = unbound
Class Constructor
class Person:
def __init__(self):
self.name = ""
self.age = 0
p1 = Person()
p1.name = 'bob'
p1.age = 21
p2 = Person()
p2.name = 'cathy'
p2.age = 25
OUTPUT
print(p1)
print(p1.name)
print(p1.age)
print(p2)
print(p2.name)
print(p2.age)
<__main__.Person object at 0x000001C35285EDD8>
bob
21
<__main__.Person object at 0x000001C35285ED30>
cathy
25
Setter, getter method
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person('bob', 21)
p1.name
p1.age
p2 = Person('cathy', 25)
p2.name
p2.age
OUTPUT
print(p1)
print(p1.name)
print(p1.age)
print(p2)
print(p2.name)
print(p2.age)
<__main__.Person object at 0x000001C352867978>
bob
21
<__main__.Person object at 0x000001C352867358>
cathy
25
class Person:
def __init__(self):
self.__age = 0
@property
def age(self): # getter
return self.__age
@age.setter
def age(self, value): # setter
self.__age = value
james = Person()
james.age = 20 # 인스턴스.속성 형식으로 접근하여 값 저장
print(james.age) # 인스턴스.속성 형식으로 값을 가져옴
20
hasattr(object, name)
object - object whose named attribute is to be checked
name - name of the attribute to be searched
returnTrue, if object has the given named attribute
False, if object has no given named attribute
class Person:
age = 23
name = 'Adam'
person = Person()
print('Person has age?:', hasattr(person, 'age'))
print('Person has salary?:', hasattr(person, 'salary'))
Person has age?: True
Person has salary?: False
static method
class CLASS:
@staticmethod
def func(*args, **kwargs):
pass
CLASS.func()
magic method
import math
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return 'x={}, y={}'.format(self.x, self.y)
def __len__(self):
return int(self.x**2 + self.y**2)
def __abs__(self):
return math.sqrt(self.x**2 + self.y**2)
def __getitem__(self, index):
if index == 0:
return self.x
elif index == 1:
return self.y
else:
return -1
def __add__(self, point):
new_x = self.x + point.x
new_y = self.y + point.y
return (new_x, new_y)
def __sub__(self, point):
new_x = self.x - point.x
new_y = self.y - point.y
return (new_x, new_y)
def __mul__(self, point):
if type(point) == int:
return Point(point*self.x, point*self.y)
elif type(point) == Point:
return self.x*point.x + self.y*point.y
def __eq__(self, point):
return self.x == point.x and self.y == point.y
def __ne__(self, point):
return not (self.x == point.x and self.y == point.y)
p1 = Point(1.1,2.2)
p2 = Point(4.4,5.5)
print('__str__ : ',p1, p2)
print('__len__ : ',len(p1),len(p2))
print('__getitem__ :', p1[0],p1[1],p1[2])
print('__add__ : ',p1 + p2)
print('__sub__ : ',p1 - p2)
print('__mul__ : ',p1 * 3)
print('__mul__ : ',p1 * p2)
print('__eq__ : ',p1 == p1, p1 == p2)
print('__ne__ : ',p1 != p1, p1 != p2)
print('__abs__: ', abs(p1))
__init__(self) : p = Point()
__str__(self) : object = CLASS()
__del__(self) : del object
__repr__(self) :
__len__(self) : len(object)
__abs__(self) : abs(object)
__add__(self) : object1 + object2
__sub__(self) : object1 - object2
__mul__(self) : object1 * object2
Class(2) : Inheritance
Class Inheritance and Inclusion
Inheritance
class Person:
def greeting(self):
print('hello')
class Student(Person):
def study(self):
print('study')
james = Student()
james.greeting()
james.study()
hello
study
class Person:
def __init__(self):
print('Person')
self.hello = 'hello'
class Student(Person):
def __init__(self):
print('Student')
super().__init__()
self.school = 'school'
james = Student()
print(james.school)
print(james.hello)
Student
Person
school
hello
Error
class Person:
def __init__(self):
print('Person')
self.hello = 'hello'
class Student(Person):
def __init__(self):
print('Student')
self.school = 'school'
james = Student()
print(james.school)
print(james.hello)
---> 13 print(james.hello)
AttributeError: 'Student' object has no attribute 'hello'
Caution
class Person:
def __init__(self):
print('Person')
self.hello = 'hello'
class Student(Person):
pass
james = Student()
print(james.hello)
Person
hello
Multiple Inheritance
class A:
def greeting(self):
print('hello, A')
class B(A):
def greeting(self):
print('hello, B')
class C(A):
def greeting(self):
print('hello, C')
class D(B,C): # left side has a priority
pass
x = D()
x.greeting()
hello, B
MRO:Method Resolution Order
D.mro()
[__main__.D, __main__.B, __main__.C, __main__.A, object]
Inclusion
class Person:
def greeting(self):
print('hello')
class PersonList():
def __init__(self):
self.person_list = []
def append_person(self, person):
self.person_list.append(person)
recode = PersonList()
james = Person()
recode.append_person(james)
recode.person_list
[<__main__.Person at 0x7f2158a17e48>]
Overiding Class
class Person:
def greeting(self):
print('hello, Person')
class Student(Person):
def greeting(self):
print('hello, Student')
james = Student()
james.greeting()
hello, Student
class Person:
def greeting(self):
print('hello, Person')
class Student(Person):
def greeting(self):
super().greeting()
print('hello, Student')
james = Student()
james.greeting()
hello, Person
hello, Student
Abstract Class
from abc import * # abc : abstract base class
class StudentBase(metaclass=ABCMeta):
@abstractmethod
def study(self):
pass
@abstractmethod
def go_to_school(self):
pass
class Student(StudentBase):
def study(self):
print('study')
def go_to_school(self):
print('go to school')
james = Student()
james.study()
james.go_to_school()
study
go to school
Error
from abc import * # abc : abstract base class
class StudentBase(metaclass=ABCMeta):
@abstractmethod
def study(self):
pass
@abstractmethod
def go_to_school(self):
pass
class Student(StudentBase):
def study(self):
print('study')
james = Student()
---> 16 james = Student()
TypeError: Can't instantiate abstract class Student with abstract methods go_to_school
Meta Class
Method 1
# class = type('name_of_class', (base_class), {property:method})
Hello = type('Hello',(),{})
h = Hello()
h
<__main__.Hello at 0x7f21589b5080>
def replace(self, old, new):
while old in self:
self[self.index(old)] = new
AdvancedList = type('AdvancedList', (list,), {'desc':'improved list', 'replace':replace})
x = AdvancedList([1,2,3,1,2,3,1,2,3])
x.replace(1,100)
print(x)
print(x.desc)
[100, 2, 3, 100, 2, 3, 100, 2, 3]
improved list
Method 2
class MakeCalc(type):
def __new__(metacls, name, bases, namespace):
namespace['desc'] = 'calc class'
namespace['add'] = lambda self, a, b : a + b
return type.__new__(metacls, name, bases, namespace)
Calc = MakeCalc('Calc', (), {})
c = Calc()
print(c.desc)
print(c.add(1,2))
calc class
3
# Singleton
class Singleton(type):
__instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls.__instances:
cls.__instances[cls] = super().__call__(*args, **kwargs)
return cls.__instances[cls]
class Hello(metaclass=Singleton):
pass
a = Hello()
b = Hello()
print(a is b)
True
Object
attribute
class A:
pass
a = A()
None; print(f'* a', vars(a))
setattr(a, 'x', 1); print(f'* setattr : ', vars(a))
hasattr(a, 'x'); print(f'* hasattr : {hasattr(a, "x")}')
getattr(a, 'x'); print(f'* getattr : {getattr(a, "x")}')
delattr(a, 'x'); print(f'* delattr : ', vars(a))
* a {}
* setattr : {'x': 1}
* hasattr : True
* getattr : 1
* delattr : {}
Module
import
parent path
import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))
if __name__ == "__main__":
pass
help(object)
Package
Exception handling
raise
class DoorException(Exception):
pass
class DoorOpenedException(DoorException):
pass
class DoorClosedException(DoorException):
pass
class Door:
def __init__(self):
self.is_opened = True
def state(self):
raise DoorException('being preparing')
def open(self):
if self.is_opened:
raise DoorOpenedException('already opened')
else:
print('open')
self.is_opened = True
def close(self):
if not self.is_opened:
raise DoorClosedException('already closed')
else:
print('close')
self.is_opened = False
door = Door()
door.close()
door.open()
door.state()
close
open
---------------------------------------------------------------------------
DoorException Traceback (most recent call last)
<ipython-input-797-ad6705ac378e> in <module>
33 door.close()
34 door.open()
---> 35 door.state()
<ipython-input-797-ad6705ac378e> in state(self)
14
15 def state(self):
---> 16 raise DoorException('being preparing')
17
18 def open(self):
DoorException: being preparing
try/except/else/finally
try:
x = int(input('enter number : '))
y = 10 / x
except ZeroDivisionError: # if exception is occured
print('cannot divide')
else: # if exception is not occured
print(y)
finally: # always
print('end')
enter number : 2
5.0
end
Python error hierarchy
Built-in function
abs
abs(3)
3
abs(-3)
3
abs(-1.2)
1.2
all
all([1, 2, 3])
True
all([1, 2, 3, 0])
False
any
any([1, 2, 3, 0])
True
any([0, ""])
False
chr
chr(97)
'a'
chr(48)
'0'
dir
dir([1, 2, 3])
['append', 'count', 'extend', 'index', 'insert', 'pop',...]
dir({'1':'a'})
['clear', 'copy', 'get', 'has_key', 'items', 'keys',...]
divmod
divmod(7, 3)
(2, 1)
7 // 3, 7 % 3
(2, 1)
enumerate
for i, name in enumerate(['body', 'foo', 'bar']):
print(i, name)
0 body
1 foo
2 bar
eval
eval('1+2')
3
eval("'hi' + 'a'")
'hia'
eval('divmod(4, 3)')
(1, 1)
filter
hex
hex(234)
'0xea'
hex(3)
'0x3'
id
>>> a = 3
>>> id(3)
135072304
id(a)
135072304
b = a
id(b)
135072304
input
>>> a = input()
hi
>>> a
'hi'
>>> b = input("Enter: ")
Enter: hi
>>> b
'hi'
int
int('3')
3
int(3.4)
3
isinstance
class Person: pass
a = Person()
isinstance(a, Person)
True
b = 3
isinstance(b, Person)
False
len
len("python")
6
len([1,2,3])
3
len((1, 'a'))
2
list
list("python")
['p', 'y', 't', 'h', 'o', 'n']
list((1,2,3))
[1, 2, 3]
map
# two_times.py
def two_times(numberList):
result = [ ]
for number in numberList:
result.append(number*2)
return result
result = two_times([1, 2, 3, 4])
print(result)
[2, 4, 6, 8]
def two_times(x):
return x*2
list(map(two_times, [1, 2, 3, 4]))
[2, 4, 6, 8]
max
max([1, 2, 3])
3
max("python")
'y'
min
min([1, 2, 3])
1
min("python")
'h'
oct
oct(34)
'0o42'
oct(12345)
'0o30071'
open
r, b, a, +
mode | description | method |
---|---|---|
w | write | |
r | read | seek,read,readline,readlines |
a | append | |
b | binary | |
+ | overwrite a part of doc |
f = open("binary_file", "rb")
f.close()
with open("binary_file","rb") as f:
pass
fread = open("read_mode.txt", 'r')
fread2 = open("read_mode.txt")
fappend = open("append_mode.txt", 'a')
ord
ord('a')
97
ord('0')
48
pow
pow(2, 4)
16
pow(3, 3)
27
range
list(range(5))
[0, 1, 2, 3, 4]
list(range(5, 10))
[5, 6, 7, 8, 9]
list(range(1, 10, 2))
[1, 3, 5, 7, 9]
list(range(0, -10, -1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
round
round(4.6)
5
round(4.2)
4
round(5.678, 2)
5.68
sorted
sorted([3, 1, 2])
[1, 2, 3]
sorted(['a', 'c', 'b'])
['a', 'b', 'c']
sorted("zero")
['e', 'o', 'r', 'z']
sorted((3, 2, 1))
[1, 2, 3]
str
str(3)
'3'
str('hi')
'hi'
str('hi'.upper())
'HI'
sum
sum([1,2,3])
6
sum((4,5,6))
15
tuple
tuple("abc")
('a', 'b', 'c')
tuple([1, 2, 3])
(1, 2, 3)
tuple((1, 2, 3))
(1, 2, 3)
type
type("abc")
<class 'str'>
type([ ])
<class 'list'>
type(open("test", 'w'))
<class '_io.TextIOWrapper'>
zip
list(zip([1, 2, 3], [4, 5, 6]))
[(1, 4), (2, 5), (3, 6)]
list(zip([1, 2, 3], [4, 5, 6], [7, 8, 9]))
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
list(zip("abc", "def"))
[('a', 'd'), ('b', 'e'), ('c', 'f')]
External function
sys
import sys
print(sys.argv)
C:/doit/Mymod>python argv_test.py you need python
['argv_test.py', 'you', 'need', 'python']
import sys
print('hello1')
sys.exit()
print('hello2')
C:/doit/Mymod>python argv_test.py you need python
hello1
['argv_test.py', 'you', 'need', 'python']
import sys
print(sys.path)
['', 'C:\\Windows\\SYSTEM32\\python37.zip', 'c:\\Python37\\DLLs',
'c:\\Python37\\lib', 'c:\\Python37', 'c:\\Python37\\lib\\site-packages']
import sys
sys.path.append('C:/doit/mymod')
print(sys.path)
['', 'C:\\Windows\\SYSTEM32\\python37.zip', 'c:\\Python37\\DLLs',
'c:\\Python37\\lib', 'c:\\Python37', 'c:\\Python37\\lib\\site-packages', 'C:/doit/mymod']
argparse
import argparse
parser = argparse.ArgumentParser(description="set your environment")
parser.add_argument('--env1', required=False, help="env 1")
parser.add_argument('--env2', required=False, help="env 2")
args = parser.parse_args()
print(args.env1)
print(args.env2)
import argparse
def option():
parser = argparse.ArgumentParser(description="set your environment")
parser.add_argument('--env1', type=str, required=False, help="env 1")
parser.add_argument('--env2', type=str, required=False, help="env 2")
args = parser.parse_args()
return args
def main(opt):
print(opt.env1)
print(opt.env2)
if __name__ == "__main__":
opt = option()
main(opt)
pickle
Save
import pickle
f = open("test.txt", 'wb')
data = {1: 'python', 2: 'you need'}
pickle.dump(data, f)
f.close()
Load
import pickle
f = open("test.txt", 'rb')
data = pickle.load(f)
print(data)
{2:'you need', 1:'python'}
os
method | description |
---|---|
os.chdir(‘path’) | change directory |
os.getcwd() os.path.dirname(__file__) |
get current working directory |
os.listdir(‘path’) | list of files on directory |
import os
os.environ
environ({'PROGRAMFILES': 'C:\\Program Files', 'APPDATA': … 생략 …})
import os
os.chdir("C:\WINDOWS")
import os
os.getcwd()
'C:\WINDOWS'
another way
import os
current_path = os.path.abspath(os.path.dirname(__file__))
print(__file__)
print(current_path)
1341.py
s:\workspace\2020-02-04
shutil
glob
tempfile
time
ctypes
import ctypes
ctypes.windll.user32.MessageBoxW(0, "It's done!", "Title", 1)
calendar
random
webbrowser
Object copy
immutable
a | b=a | c=copy.copy(a) | d=copy.deepcopy(a) | |
---|---|---|---|---|
origin | 1 | 1 | 1 | 1 |
simple(b=100) | 1 | 100 | 1 | 1 |
shallow(c=100) | 1 | 1 | 100 | 1 |
deep(d=100) | 1 | 1 | 1 | 100 |
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d))
print()
a = 1
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
a value: 1 : original(a) ,
a id: 10914496
b value: 1 : simple(b = a) ,
b id: 10914496
c value: 1 : shallow(c = copy.copy(a)) ,
c id: 10914496
d value: 1 : deep(d = copy.deepcopy(d)) ,
d id: 10914496
simple
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d))
print()
a = 1
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
b = 100
description(a,b,c,d)
a value: 1 : original(a) ,
a id: 10914496
b value: 1 : simple(b = a) ,
b id: 10914496
c value: 1 : shallow(c = copy.copy(a)) ,
c id: 10914496
d value: 1 : deep(d = copy.deepcopy(d)) ,
d id: 10914496
a value: 1 : original(a) ,
a id: 10914496
b value: 100 : simple(b = a) ,
b id: 10917664
c value: 1 : shallow(c = copy.copy(a)) ,
c id: 10914496
d value: 1 : deep(d = copy.deepcopy(d)) ,
d id: 10914496
shallow
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d))
print()
a = 1
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
c = 100
description(a,b,c,d)
a value: 1 : original(a) ,
a id: 10914496
b value: 1 : simple(b = a) ,
b id: 10914496
c value: 1 : shallow(c = copy.copy(a)) ,
c id: 10914496
d value: 1 : deep(d = copy.deepcopy(d)) ,
d id: 10914496
a value: 1 : original(a) ,
a id: 10914496
b value: 1 : simple(b = a) ,
b id: 10914496
c value: 100 : shallow(c = copy.copy(a)) ,
c id: 10917664
d value: 1 : deep(d = copy.deepcopy(d)) ,
d id: 10914496
deep
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d))
print()
a = 1
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
d = 100
description(a,b,c,d)
a value: 1 : original(a) ,
a id: 10914496
b value: 1 : simple(b = a) ,
b id: 10914496
c value: 1 : shallow(c = copy.copy(a)) ,
c id: 10914496
d value: 1 : deep(d = copy.deepcopy(d)) ,
d id: 10914496
a value: 1 : original(a) ,
a id: 10914496
b value: 1 : simple(b = a) ,
b id: 10914496
c value: 1 : shallow(c = copy.copy(a)) ,
c id: 10914496
d value: 100 : deep(d = copy.deepcopy(d)) ,
d id: 10917664
mutable
a | b=a | c=copy.copy(a) | d=copy.deepcopy(a) | |
---|---|---|---|---|
origin | [1] | [1] | [1] | [1] |
simple(b[0]=100) | [100] | [100] | [1] | [1] |
simple(b=[100]) | [1] | [100] | [1] | [1] |
shallow(c[0]=100) | [1] | [1] | [100] | [1] |
shallow(c=[100]) | [1] | [1] | [100] | [1] |
deep(d[0]=100) | [1] | [1] | [1] | [100] |
deep(d=[100]) | [1] | [1] | [1] | [100] |
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]))
print()
a = [1]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
a value: [1] : original(a) ,
a id: 140282058829128 , a[0] id: 10914496
b value: [1] : simple(b = a) ,
b id: 140282058829128 , b[0] id: 10914496
c value: [1] : shallow(c = copy.copy(a)) ,
c id: 140282056137608 , c[0] id: 10914496
d value: [1] : deep(d = copy.deepcopy(d)) ,
d id: 140282055629320 , d[0] id: 10914496
simple
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]))
print()
a = [1]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
b[0] = 100
description(a,b,c,d)
a value: [1] : original(a) ,
a id: 140282055757896 , a[0] id: 10914496
b value: [1] : simple(b = a) ,
b id: 140282055757896 , b[0] id: 10914496
c value: [1] : shallow(c = copy.copy(a)) ,
c id: 140282055759112 , c[0] id: 10914496
d value: [1] : deep(d = copy.deepcopy(d)) ,
d id: 140282055758152 , d[0] id: 10914496
a value: [100] : original(a) ,
a id: 140282055757896 , a[0] id: 10917664
b value: [100] : simple(b = a) ,
b id: 140282055757896 , b[0] id: 10917664
c value: [1] : shallow(c = copy.copy(a)) ,
c id: 140282055759112 , c[0] id: 10914496
d value: [1] : deep(d = copy.deepcopy(d)) ,
d id: 140282055758152 , d[0] id: 10914496
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]))
print()
a = [1]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
b = [100]
description(a,b,c,d)
a value: [1] : original(a) ,
a id: 140282054944712 , a[0] id: 10914496
b value: [1] : simple(b = a) ,
b id: 140282054944712 , b[0] id: 10914496
c value: [1] : shallow(c = copy.copy(a)) ,
c id: 140282055640840 , c[0] id: 10914496
d value: [1] : deep(d = copy.deepcopy(d)) ,
d id: 140282055757896 , d[0] id: 10914496
a value: [1] : original(a) ,
a id: 140282054944712 , a[0] id: 10914496
b value: [100] : simple(b = a) ,
b id: 140282055758152 , b[0] id: 10917664
c value: [1] : shallow(c = copy.copy(a)) ,
c id: 140282055640840 , c[0] id: 10914496
d value: [1] : deep(d = copy.deepcopy(d)) ,
d id: 140282055757896 , d[0] id: 10914496
shallow
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]))
print()
a = [1]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
c[0] = 100
description(a,b,c,d)
a value: [1] : original(a) ,
a id: 140282057630472 , a[0] id: 10914496
b value: [1] : simple(b = a) ,
b id: 140282057630472 , b[0] id: 10914496
c value: [1] : shallow(c = copy.copy(a)) ,
c id: 140282054944712 , c[0] id: 10914496
d value: [1] : deep(d = copy.deepcopy(d)) ,
d id: 140282055758152 , d[0] id: 10914496
a value: [1] : original(a) ,
a id: 140282057630472 , a[0] id: 10914496
b value: [1] : simple(b = a) ,
b id: 140282057630472 , b[0] id: 10914496
c value: [100] : shallow(c = copy.copy(a)) ,
c id: 140282054944712 , c[0] id: 10917664
d value: [1] : deep(d = copy.deepcopy(d)) ,
d id: 140282055758152 , d[0] id: 10914496
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]))
print()
a = [1]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
c = [100]
description(a,b,c,d)
a value: [1] : original(a) ,
a id: 140282054999432 , a[0] id: 10914496
b value: [1] : simple(b = a) ,
b id: 140282054999432 , b[0] id: 10914496
c value: [1] : shallow(c = copy.copy(a)) ,
c id: 140282057631304 , c[0] id: 10914496
d value: [1] : deep(d = copy.deepcopy(d)) ,
d id: 140282057630472 , d[0] id: 10914496
a value: [1] : original(a) ,
a id: 140282054999432 , a[0] id: 10914496
b value: [1] : simple(b = a) ,
b id: 140282054999432 , b[0] id: 10914496
c value: [100] : shallow(c = copy.copy(a)) ,
c id: 140282055758152 , c[0] id: 10917664
d value: [1] : deep(d = copy.deepcopy(d)) ,
d id: 140282057630472 , d[0] id: 10914496
deep
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]))
print()
a = [1]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
d[0] = 100
description(a,b,c,d)
a value: [1] : original(a) ,
a id: 140282055758152 , a[0] id: 10914496
b value: [1] : simple(b = a) ,
b id: 140282055758152 , b[0] id: 10914496
c value: [1] : shallow(c = copy.copy(a)) ,
c id: 140282054946120 , c[0] id: 10914496
d value: [1] : deep(d = copy.deepcopy(d)) ,
d id: 140282057631304 , d[0] id: 10914496
a value: [1] : original(a) ,
a id: 140282055758152 , a[0] id: 10914496
b value: [1] : simple(b = a) ,
b id: 140282055758152 , b[0] id: 10914496
c value: [1] : shallow(c = copy.copy(a)) ,
c id: 140282054946120 , c[0] id: 10914496
d value: [100] : deep(d = copy.deepcopy(d)) ,
d id: 140282057631304 , d[0] id: 10917664
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]))
print()
a = [1]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
d = [100]
description(a,b,c,d)
a value: [1] : original(a) ,
a id: 140282055726216 , a[0] id: 10914496
b value: [1] : simple(b = a) ,
b id: 140282055726216 , b[0] id: 10914496
c value: [1] : shallow(c = copy.copy(a)) ,
c id: 140282055640840 , c[0] id: 10914496
d value: [1] : deep(d = copy.deepcopy(d)) ,
d id: 140282055758152 , d[0] id: 10914496
a value: [1] : original(a) ,
a id: 140282055726216 , a[0] id: 10914496
b value: [1] : simple(b = a) ,
b id: 140282055726216 , b[0] id: 10914496
c value: [1] : shallow(c = copy.copy(a)) ,
c id: 140282055640840 , c[0] id: 10914496
d value: [100] : deep(d = copy.deepcopy(d)) ,
d id: 140282057631304 , d[0] id: 10917664
simple copy
a | b=a | c=copy.copy(a) | d=copy.deepcopy(a) | |
---|---|---|---|---|
origin | [1,[2]] | [1,[2]] | [1,[2]] | [1,[2]] |
simple(b[0]=2) | [2,[2]] | [2,[2]] | [1,[2]] | [1,[2]] |
simple(b[1]=[3]) | [1,[3]] | [1,[3]] | [1,[2]] | [1,[2]] |
simple(b[1][0]=3) | [1,[3]] | [1,[3]] | [1,[3]] | [1,[2]] |
simple(b[1].append(4)) | [1,[2,4]] | [1,[2,4]] | [1,[2,4]] | [1,[2]] |
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]),', a[1] id:',id(a[1]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]),', b[1] id:',id(b[1]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]),', c[1] id:',id(c[1]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]),', d[1] id:',id(d[1]))
print()
a = [1, [2]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
b[0] = 2
description(a,b,c,d)
b[1] = [3]
description(a,b,c,d)
a value: [1, [2]] : original(a) ,
a id: 140282049351496 , a[0] id: 10914496 , a[1] id: 140282049578824
b value: [1, [2]] : simple(b = a) ,
b id: 140282049351496 , b[0] id: 10914496 , b[1] id: 140282049578824
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282049351560 , c[0] id: 10914496 , c[1] id: 140282049578824
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282057881608 , d[0] id: 10914496 , d[1] id: 140282049410312
a value: [2, [2]] : original(a) ,
a id: 140282049351496 , a[0] id: 10914528 , a[1] id: 140282049578824
b value: [2, [2]] : simple(b = a) ,
b id: 140282049351496 , b[0] id: 10914528 , b[1] id: 140282049578824
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282049351560 , c[0] id: 10914496 , c[1] id: 140282049578824
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282057881608 , d[0] id: 10914496 , d[1] id: 140282049410312
a value: [2, [3]] : original(a) ,
a id: 140282049351496 , a[0] id: 10914528 , a[1] id: 140282060263624
b value: [2, [3]] : simple(b = a) ,
b id: 140282049351496 , b[0] id: 10914528 , b[1] id: 140282060263624
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282049351560 , c[0] id: 10914496 , c[1] id: 140282049578824
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282057881608 , d[0] id: 10914496 , d[1] id: 140282049410312
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]),', a[1] id:',id(a[1]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]),', b[1] id:',id(b[1]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]),', c[1] id:',id(c[1]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]),', d[1] id:',id(d[1]))
print()
a = [1, [2]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
b[0] = 2
description(a,b,c,d)
b[1][0] = 3
description(a,b,c,d)
a value: [1, [2]] : original(a) ,
a id: 140282054943752 , a[0] id: 10914496 , a[1] id: 140282054945928
b value: [1, [2]] : simple(b = a) ,
b id: 140282054943752 , b[0] id: 10914496 , b[1] id: 140282054945928
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282054944328 , c[0] id: 10914496 , c[1] id: 140282054945928
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054944072 , d[0] id: 10914496 , d[1] id: 140282054943048
a value: [2, [2]] : original(a) ,
a id: 140282054943752 , a[0] id: 10914528 , a[1] id: 140282054945928
b value: [2, [2]] : simple(b = a) ,
b id: 140282054943752 , b[0] id: 10914528 , b[1] id: 140282054945928
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282054944328 , c[0] id: 10914496 , c[1] id: 140282054945928
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054944072 , d[0] id: 10914496 , d[1] id: 140282054943048
a value: [2, [3]] : original(a) ,
a id: 140282054943752 , a[0] id: 10914528 , a[1] id: 140282054945928
b value: [2, [3]] : simple(b = a) ,
b id: 140282054943752 , b[0] id: 10914528 , b[1] id: 140282054945928
c value: [1, [3]] : shallow(c = copy.copy(a)) ,
c id: 140282054944328 , c[0] id: 10914496 , c[1] id: 140282054945928
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054944072 , d[0] id: 10914496 , d[1] id: 140282054943048
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]),', a[1] id:',id(a[1]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]),', b[1] id:',id(b[1]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]),', c[1] id:',id(c[1]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]),', d[1] id:',id(d[1]))
print()
a = [1, [2]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
b[0] = 2
description(a,b,c,d)
b[1].append(4)
description(a,b,c,d)
a value: [1, [2]] : original(a) ,
a id: 140282049958344 , a[0] id: 10914496 , a[1] id: 140282055016520
b value: [1, [2]] : simple(b = a) ,
b id: 140282049958344 , b[0] id: 10914496 , b[1] id: 140282055016520
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282049923464 , c[0] id: 10914496 , c[1] id: 140282055016520
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282049958024 , d[0] id: 10914496 , d[1] id: 140282049959432
a value: [2, [2]] : original(a) ,
a id: 140282049958344 , a[0] id: 10914528 , a[1] id: 140282055016520
b value: [2, [2]] : simple(b = a) ,
b id: 140282049958344 , b[0] id: 10914528 , b[1] id: 140282055016520
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282049923464 , c[0] id: 10914496 , c[1] id: 140282055016520
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282049958024 , d[0] id: 10914496 , d[1] id: 140282049959432
a value: [2, [2, 4]] : original(a) ,
a id: 140282049958344 , a[0] id: 10914528 , a[1] id: 140282055016520
b value: [2, [2, 4]] : simple(b = a) ,
b id: 140282049958344 , b[0] id: 10914528 , b[1] id: 140282055016520
c value: [1, [2, 4]] : shallow(c = copy.copy(a)) ,
c id: 140282049923464 , c[0] id: 10914496 , c[1] id: 140282055016520
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282049958024 , d[0] id: 10914496 , d[1] id: 140282049959432
Sallow copy
a | b=a | c=copy.copy(a) | d=copy.deepcopy(a) | |
---|---|---|---|---|
origin | [1,[2]] | [1,[2]] | [1,[2]] | [1,[2]] |
shallow(c[0]=2) | [1,[2]] | [1,[2]] | [2,[2]] | [1,[2]] |
shallow(c[1]=[3]) | [1,[2]] | [1,[2]] | [1,[3]] | [1,[2]] |
shallow(c[1][0]=3) | [1,[3]] | [1,[3]] | [1,[3]] | [1,[2]] |
shallow(c[1].append(4)) | [1,[2,4]] | [1,[2,4]] | [1,[2,4]] | [1,[2]] |
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]),', a[1] id:',id(a[1]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]),', b[1] id:',id(b[1]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]),', c[1] id:',id(c[1]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]),', d[1] id:',id(d[1]))
print()
a = [1, [2]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
c[0] = 2
description(a,b,c,d)
c[1] = [3]
description(a,b,c,d)
a value: [1, [2]] : original(a) ,
a id: 140282054999560 , a[0] id: 10914496 , a[1] id: 140282054999752
b value: [1, [2]] : simple(b = a) ,
b id: 140282054999560 , b[0] id: 10914496 , b[1] id: 140282054999752
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282054848712 , c[0] id: 10914496 , c[1] id: 140282054999752
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054999688 , d[0] id: 10914496 , d[1] id: 140282054848776
a value: [1, [2]] : original(a) ,
a id: 140282054999560 , a[0] id: 10914496 , a[1] id: 140282054999752
b value: [1, [2]] : simple(b = a) ,
b id: 140282054999560 , b[0] id: 10914496 , b[1] id: 140282054999752
c value: [2, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282054848712 , c[0] id: 10914528 , c[1] id: 140282054999752
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054999688 , d[0] id: 10914496 , d[1] id: 140282054848776
a value: [1, [2]] : original(a) ,
a id: 140282054999560 , a[0] id: 10914496 , a[1] id: 140282054999752
b value: [1, [2]] : simple(b = a) ,
b id: 140282054999560 , b[0] id: 10914496 , b[1] id: 140282054999752
c value: [2, [3]] : shallow(c = copy.copy(a)) ,
c id: 140282054848712 , c[0] id: 10914528 , c[1] id: 140282054848648
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054999688 , d[0] id: 10914496 , d[1] id: 140282054848776
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]),', a[1] id:',id(a[1]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]),', b[1] id:',id(b[1]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]),', c[1] id:',id(c[1]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]),', d[1] id:',id(d[1]))
print()
a = [1, [2]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
c[0] = 2
description(a,b,c,d)
c[1][0] = 3
description(a,b,c,d)
a value: [1, [2]] : original(a) ,
a id: 140282054945672 , a[0] id: 10914496 , a[1] id: 140282054944136
b value: [1, [2]] : simple(b = a) ,
b id: 140282054945672 , b[0] id: 10914496 , b[1] id: 140282054944136
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282054944904 , c[0] id: 10914496 , c[1] id: 140282054944136
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054943752 , d[0] id: 10914496 , d[1] id: 140282054945928
a value: [1, [2]] : original(a) ,
a id: 140282054945672 , a[0] id: 10914496 , a[1] id: 140282054944136
b value: [1, [2]] : simple(b = a) ,
b id: 140282054945672 , b[0] id: 10914496 , b[1] id: 140282054944136
c value: [2, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282054944904 , c[0] id: 10914528 , c[1] id: 140282054944136
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054943752 , d[0] id: 10914496 , d[1] id: 140282054945928
a value: [1, [3]] : original(a) ,
a id: 140282054945672 , a[0] id: 10914496 , a[1] id: 140282054944136
b value: [1, [3]] : simple(b = a) ,
b id: 140282054945672 , b[0] id: 10914496 , b[1] id: 140282054944136
c value: [2, [3]] : shallow(c = copy.copy(a)) ,
c id: 140282054944904 , c[0] id: 10914528 , c[1] id: 140282054944136
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054943752 , d[0] id: 10914496 , d[1] id: 140282054945928
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]),', a[1] id:',id(a[1]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]),', b[1] id:',id(b[1]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]),', c[1] id:',id(c[1]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]),', d[1] id:',id(d[1]))
print()
a = [1, [2]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
c[0] = 2
description(a,b,c,d)
c[1].append(4)
description(a,b,c,d)
a value: [1, [2]] : original(a) ,
a id: 140282055726856 , a[0] id: 10914496 , a[1] id: 140282054999048
b value: [1, [2]] : simple(b = a) ,
b id: 140282055726856 , b[0] id: 10914496 , b[1] id: 140282054999048
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282055728712 , c[0] id: 10914496 , c[1] id: 140282054999048
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054991560 , d[0] id: 10914496 , d[1] id: 140282050117832
a value: [1, [2, 4]] : original(a) ,
a id: 140282055726856 , a[0] id: 10914496 , a[1] id: 140282054999048
b value: [1, [2, 4]] : simple(b = a) ,
b id: 140282055726856 , b[0] id: 10914496 , b[1] id: 140282054999048
c value: [1, [2, 4]] : shallow(c = copy.copy(a)) ,
c id: 140282055728712 , c[0] id: 10914496 , c[1] id: 140282054999048
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054991560 , d[0] id: 10914496 , d[1] id: 140282050117832
deep copy
a | b=a | c=copy.copy(a) | d=copy.deepcopy(a) | |
---|---|---|---|---|
origin | [1,[2]] | [1,[2]] | [1,[2]] | [1,[2]] |
deep(d[0]=2) | [1,[2]] | [1,[2]] | [1,[2]] | [2,[2]] |
deep(d[1]=[3]) | [1,[2]] | [1,[2]] | [1,[2]] | [1,[3]] |
deep(d[1][0]=3) | [1,[2]] | [1,[2]] | [1,[2]] | [1,[3]] |
deep(d[1].append(4)) | [1,[2]] | [1,[2]] | [1,[2]] | [1,[2,4]] |
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]),', a[1] id:',id(a[1]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]),', b[1] id:',id(b[1]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]),', c[1] id:',id(c[1]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]),', d[1] id:',id(d[1]))
print()
a = [1, [2]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
d[0] = 2
description(a,b,c,d)
d[1] = [3]
description(a,b,c,d)
a value: [1, [2]] : original(a) ,
a id: 140282055725768 , a[0] id: 10914496 , a[1] id: 140282055726920
b value: [1, [2]] : simple(b = a) ,
b id: 140282055725768 , b[0] id: 10914496 , b[1] id: 140282055726920
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282055725640 , c[0] id: 10914496 , c[1] id: 140282055726920
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054999560 , d[0] id: 10914496 , d[1] id: 140282054848648
a value: [1, [2]] : original(a) ,
a id: 140282055725768 , a[0] id: 10914496 , a[1] id: 140282055726920
b value: [1, [2]] : simple(b = a) ,
b id: 140282055725768 , b[0] id: 10914496 , b[1] id: 140282055726920
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282055725640 , c[0] id: 10914496 , c[1] id: 140282055726920
d value: [2, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054999560 , d[0] id: 10914528 , d[1] id: 140282054848648
a value: [1, [2]] : original(a) ,
a id: 140282055725768 , a[0] id: 10914496 , a[1] id: 140282055726920
b value: [1, [2]] : simple(b = a) ,
b id: 140282055725768 , b[0] id: 10914496 , b[1] id: 140282055726920
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282055725640 , c[0] id: 10914496 , c[1] id: 140282055726920
d value: [2, [3]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054999560 , d[0] id: 10914528 , d[1] id: 140282054999688
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]),', a[1] id:',id(a[1]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]),', b[1] id:',id(b[1]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]),', c[1] id:',id(c[1]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]),', d[1] id:',id(d[1]))
print()
a = [1, [2]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
d[0] = 2
description(a,b,c,d)
d[1][0] = 3
description(a,b,c,d)
a value: [1, [2]] : original(a) ,
a id: 140282057630280 , a[0] id: 10914496 , a[1] id: 140282054944712
b value: [1, [2]] : simple(b = a) ,
b id: 140282057630280 , b[0] id: 10914496 , b[1] id: 140282054944712
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282057630856 , c[0] id: 10914496 , c[1] id: 140282054944712
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282057630728 , d[0] id: 10914496 , d[1] id: 140282057630472
a value: [1, [2]] : original(a) ,
a id: 140282057630280 , a[0] id: 10914496 , a[1] id: 140282054944712
b value: [1, [2]] : simple(b = a) ,
b id: 140282057630280 , b[0] id: 10914496 , b[1] id: 140282054944712
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282057630856 , c[0] id: 10914496 , c[1] id: 140282054944712
d value: [2, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282057630728 , d[0] id: 10914528 , d[1] id: 140282057630472
a value: [1, [2]] : original(a) ,
a id: 140282057630280 , a[0] id: 10914496 , a[1] id: 140282054944712
b value: [1, [2]] : simple(b = a) ,
b id: 140282057630280 , b[0] id: 10914496 , b[1] id: 140282054944712
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282057630856 , c[0] id: 10914496 , c[1] id: 140282054944712
d value: [2, [3]] : deep(d = copy.deepcopy(d)) ,
d id: 140282057630728 , d[0] id: 10914528 , d[1] id: 140282057630472
import copy
def description(a,b,c,d):
print('a value:',a,': original(a)',
',\n a id:',id(a),', a[0] id:',id(a[0]),', a[1] id:',id(a[1]))
print('b value:',b,': simple(b = a)',
',\n b id:',id(b),', b[0] id:',id(b[0]),', b[1] id:',id(b[1]))
print('c value:',c,': shallow(c = copy.copy(a)) ',
',\n c id:',id(c),', c[0] id:',id(c[0]),', c[1] id:',id(c[1]))
print('d value:',d,': deep(d = copy.deepcopy(d))',
',\n d id:',id(d),', d[0] id:',id(d[0]),', d[1] id:',id(d[1]))
print()
a = [1, [2]]
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
description(a,b,c,d)
d[0] = 2
description(a,b,c,d)
d[1].append(4)
description(a,b,c,d)
a value: [1, [2]] : original(a) ,
a id: 140282057630728 , a[0] id: 10914496 , a[1] id: 140282057630472
b value: [1, [2]] : simple(b = a) ,
b id: 140282057630728 , b[0] id: 10914496 , b[1] id: 140282057630472
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282057631304 , c[0] id: 10914496 , c[1] id: 140282057630472
d value: [1, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054944840 , d[0] id: 10914496 , d[1] id: 140282055630280
a value: [1, [2]] : original(a) ,
a id: 140282057630728 , a[0] id: 10914496 , a[1] id: 140282057630472
b value: [1, [2]] : simple(b = a) ,
b id: 140282057630728 , b[0] id: 10914496 , b[1] id: 140282057630472
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282057631304 , c[0] id: 10914496 , c[1] id: 140282057630472
d value: [2, [2]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054944840 , d[0] id: 10914528 , d[1] id: 140282055630280
a value: [1, [2]] : original(a) ,
a id: 140282057630728 , a[0] id: 10914496 , a[1] id: 140282057630472
b value: [1, [2]] : simple(b = a) ,
b id: 140282057630728 , b[0] id: 10914496 , b[1] id: 140282057630472
c value: [1, [2]] : shallow(c = copy.copy(a)) ,
c id: 140282057631304 , c[0] id: 10914496 , c[1] id: 140282057630472
d value: [2, [2, 4]] : deep(d = copy.deepcopy(d)) ,
d id: 140282054944840 , d[0] id: 10914528 , d[1] id: 140282055630280
summary
a | b=a | c=copy.copy(a) | d=copy.deepcopy(a) | |
---|---|---|---|---|
origin | 1 | 1 | 1 | 1 |
b=100 | 1 | 100 | 1 | 1 |
c=100 | 1 | 1 | 100 | 1 |
d=100 | 1 | 1 | 1 | 100 |
a | b=a | c=copy.copy(a) | d=copy.deepcopy(a) | |
---|---|---|---|---|
origin | [1] | [1] | [1] | [1] |
b[0]=100 | [100] | [100] | [1] | [1] |
b=[100] | [1] | [100] | [1] | [1] |
c[0]=100 | [1] | [1] | [100] | [1] |
c=[100] | [1] | [1] | [100] | [1] |
d[0]=100 | [1] | [1] | [1] | [100] |
d=[100] | [1] | [1] | [1] | [100] |
a | b=a | c=copy.copy(a) | d=copy.deepcopy(a) | |
---|---|---|---|---|
origin | [1,[2]] | [1,[2]] | [1,[2]] | [1,[2]] |
b[0]=2 | [2,[2]] | [2,[2]] | [1,[2]] | [1,[2]] |
b[1]=[3] | [1,[3]] | [1,[3]] | [1,[2]] | [1,[2]] |
b[1][0]=3 | [1,[3]] | [1,[3]] | [1,[3]] | [1,[2]] |
b[1].append(4) | [1,[2,4]] | [1,[2,4]] | [1,[2,4]] | [1,[2]] |
a | b=a | c=copy.copy(a) | d=copy.deepcopy(a) | |
---|---|---|---|---|
origin | [1,[2]] | [1,[2]] | [1,[2]] | [1,[2]] |
c[0]=2 | [1,[2]] | [1,[2]] | [2,[2]] | [1,[2]] |
c[1]=[3] | [1,[2]] | [1,[2]] | [1,[3]] | [1,[2]] |
c[1][0]=3 | [1,[3]] | [1,[3]] | [1,[3]] | [1,[2]] |
c[1].append(4) | [1,[2,4]] | [1,[2,4]] | [1,[2,4]] | [1,[2]] |
a | b=a | c=copy.copy(a) | d=copy.deepcopy(a) | |
---|---|---|---|---|
origin | [1,[2]] | [1,[2]] | [1,[2]] | [1,[2]] |
d[0]=2 | [1,[2]] | [1,[2]] | [1,[2]] | [2,[2]] |
d[1]=[3] | [1,[2]] | [1,[2]] | [1,[2]] | [1,[3]] |
d[1][0]=3 | [1,[2]] | [1,[2]] | [1,[2]] | [1,[3]] |
d[1].append(4) | [1,[2]] | [1,[2]] | [1,[2]] | [1,[2,4]] |
Closure : func of func
global vs nonlocal
a = 3
def calc():
a = 1
b = 5
total = 0
def mul_add(x):
global a
nonlocal total
total = total + a*x + b
print(total)
return mul_add
c = calc()
print(c(1))
8
lambda closure
def calc():
a = 3
b = 5
return lambda x : a*x + b
c = calc()
print(c(1))
8
decorator
function decorator
def trace(func):
def wrapper():
return func()
return wrapper
@trace
def function():
pass
function()
def trace(func):
def wrapper(*agrs,**kwagrs):
return func(*agrs,**kwagrs)
return wrapper
@trace
def function(*args, **kwargs):
pass
function()
def trace(x):
def decorator(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
return decorator
@trace(x=3)
def function(*args, **kwargs):
pass
print(function())
class decorator
class trace:
def __init__(self, func):
self.func = func
def __call__(self):
return self.func()
@trace
def function():
pass
function()
class trace:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
@trace
def function(*args, **kwargs):
pass
function()
Decorator
Function Decorator
def hello():
print('hello start')
print('hello')
print('hello end')
def world():
print('world start')
print('world')
print('world end')
hello()
world()
hello start
hello
hello end
world start
world
world end
def trace(func):
def wrapper():
print(func.__name__, 'start')
func()
print(func.__name__, 'end')
return wrapper
def hello():
print('hello')
def world():
print('world')
trace_hello = trace(hello)
trace_hello()
trace_world = trace(world)
trace_world()
hello start
hello
hello end
world start
world
world end
def trace(func):
def wrapper():
print(func.__name__, 'start')
func()
print(func.__name__, 'end')
return wrapper
@trace
def hello():
print('hello')
@trace
def world():
print('world')
hello()
world()
hello start
hello
hello end
world start
world
world end
Decorator with arguments
def trace(func):
def wrapper(*args, **kwargs):
r = func(*args, **kwargs)
print('{0}(args={1}, kwargs={2}) -> {3}'.format(func.__name__, args, kwargs, r))
return r
return wrapper
@trace
def get_max(*args):
return max(args)
@trace
def get_min(**kwargs):
return min(kwargs.values())
print(get_max(10,20))
print(get_min(x=10, y=20, z=30))
get_max(args=(10, 20), kwargs={}) -> 20
20
get_min(args=(), kwargs={'x': 10, 'y': 20, 'z': 30}) -> 10
10
Example
def trace(x):
def decorator(func):
def wrapper(a,b):
r = func(a,b)
if r % x == 0:
print('returned value of {0} is multiple of {1}'.format(func.__name__, x))
else:
print('returned value of {0} is not multiple of {1}'.format(func.__name__, x))
return r
return wrapper
return decorator
@trace(3)
def add(a,b):
return a + b
print(add(10,20))
print(add(2,5))
returned value of add is multiple of 3
30
returned value of add is not multiple of 3
7
Class Decorator
class trace:
def __init__(self, func):
self.func = func
def __call__(self):
print(self.func.__name__, 'start')
self.func()
print(self.func.__name__, 'end')
def hello():
print('hello')
@trace
def world():
print('world')
trace_hello = trace(hello)
trace_hello()
world()
hello start
hello
hello end
world start
world
world end
Decorator with arguments
class trace:
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
r = self.func(*args, **kwargs)
print('{0}(args={1}, kwargs={2}) -> {3}'.format(self.func.__name__, args, kwargs, r))
return r
@trace
def add(a, b):
return a + b
print(add(10,20))
print(add(a=10, b=20))
add(args=(10, 20), kwargs={}) -> 30
30
add(args=(), kwargs={'a': 10, 'b': 20}) -> 30
30
Example
class trace:
def __init__(self, x):
self.x = x
def __call__(self, func):
def wrapper(a,b):
r = func(a,b)
if r % self.x == 0:
print('returned value of {0} is mutiple of {1}'.format(func.__name__, self.x))
else:
print('returned value of {0} is not mutiple of {1}'.format(func.__name__, self.x))
return r
return wrapper
@trace(3)
def add(a, b):
return a + b
print(add(10,20))
print(add(2, 5))
returned value of add is mutiple of 3
30
returned value of add is not mutiple of 3
7
Iterator : next!
class Counter:
def __init__(self, stop):
self.current = 0
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.current < self.stop:
r = self.current
self.current += 1
return r
else:
raise StopIteration
for i in Counter(3): print(i)
0
1
2
class Counter:
def __init__(self, stop):
self.stop = stop
def __getitem__(self, index):
if index < self.stop :
return index
else:
raise IndexError
#print(Counter(3)[0],Counter(3)[1],Counter(3)[2])
for i in Counter(3): print(i)
0
1
2
iter(iterable_object)
a = iter(range(3))
next(a)
next(a)
next(a)
2
iter(callable_object, sentinel)
import random
for i in iter(lambda : random.randint(0,5), 2):
print(i)
3
1
4
4
3
5
3
3
1
5
4
next(iterable_object, default_value)
a = iter(range(3))
next(a,10)
next(a,10)
next(a,10)
next(a,10)
10
Generator : yield!
Yield
# 'yield(co)' is different 'return(sub)'
def number_generator():
yield 0
yield 1
yield 2
for i in number_generator():
print(i)
0
1
2
g = number_generator()
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
0
1
2
3 print(g.__next__())
4 print(g.__next__())
----> 5 print(g.__next__())
StopIteration:
def number_generator(stop):
n = 0
while n < stop :
yield n
n += 1
for i in number_generator(3):
print(i)
for i in range(3):
print(i)
0
1
2
0
1
2
g = number_generator(3)
print(next(g))
print(next(g))
print(next(g))
0
1
2
def upper_generator(x):
for i in x:
yield i.upper()
fruits = ['apple', 'pear', 'grape']
for i in upper_generator(fruits):
print(i)
for i in fruits:
print(i.upper())
0
1
2
Yield from
def number_generator1():
x = [1,2,3]
for i in x:
yield i
for i in number_generator1():
print(i)
def number_generator2():
x = [1,2,3]
yield from x
for i in number_generator2():
print(i)
0
1
2
0
1
2
def number_generator(stop):
n = 0
while n < stop:
yield n
n += 1
def three_generator():
yield from number_generator(3)
for i in three_generator():
print(i)
0
1
2
generator expression
for list
import time
def sleep_func(x):
print("sleep...")
time.sleep(1)
return x
start = time.time()
l = [sleep_func(x) for x in range(5)]
for j,i in enumerate(l):print('step = %d, '%j,i)
end = time.time()
end-start
sleep...
sleep...
sleep...
sleep...
sleep...
step = 0, 0
step = 1, 1
step = 2, 2
step = 3, 3
step = 4, 4
5.009469032287598
for generator
import time
def sleep_func(x):
print("sleep...")
time.sleep(1)
return x
start = time.time()
g = (sleep_func(x) for x in range(5))
for j,i in enumerate(g): print('step = %d, '%j,i)
end = time.time()
end-start
sleep...
step = 0, 0
sleep...
step = 1, 1
sleep...
step = 2, 2
sleep...
step = 3, 3
sleep...
step = 4, 4
5.008758068084717
memory size
import sys
# for list
print(sys.getsizeof( [i for i in range(100) if i % 2]),' for list, iter_num:100')
print(sys.getsizeof( [i for i in range(1000) if i % 2]),' for list, iter_num:1000')
# for generator
print(sys.getsizeof( (i for i in range(100) if i % 2)),' for generator, iter_num:100')
print(sys.getsizeof( (i for i in range(1000) if i % 2)),' for generator, iter_num:1000')
528 for list, iter_num:100
4272 for list, iter_num:1000
88 for generator, iter_num:100
88 for generator, iter_num:1000
Coroutine : send!
Main routine and Sub routine
def sub_add(a,b):
c = a + b
print(c)
print('sub add func')
def main_calc():
sub_add(1,2)
print('main calc func')
main_calc()
3
sub add func
main calc func
put signal
(yield)
def number_coroutine():
while True:
x = (yield)
print(x)
co = number_coroutine()
next(co)
co.send(1)
co.send(2)
co.send(3)
1
2
3
get signal
(yield + variable)
def sum_coroutine():
total = 0
while True:
x = (yield total)
total += x
co = sum_coroutine()
print(next(co))
print(co.send(1))
print(co.send(2))
print(co.send(3))
0
1
3
6
exit
close
def number_coroutine():
while True:
x = (yield)
print(x, end=' ')
co = number_coroutine()
next(co)
for i in range(20):
co.send(i)
co.close()
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
error handling
close
def number_coroutine():
try:
while True:
x = (yield)
print(x, end=' ')
except GeneratorExit:
print()
print('coroutine exit')
co = number_coroutine()
next(co)
for i in range(20):
co.send(i)
co.close()
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
coroutine exit
throw
def sum_coroutine():
try:
total = 0
while True:
x = (yield)
total += x
except RuntimeError as e:
print(e)
yield total
co = sum_coroutine()
next(co)
for i in range(20):
co.send(i)
print(co.throw(RuntimeError,'exit through error'))
exit through error
190
get return
def accumulate():
total = 0
while True:
x = (yield)
if x is None:
return total
total += x
def sum_coroutine():
while True:
total = yield from accumulate()
print(total)
co = sum_coroutine()
next(co)
for i in range(1,11):
co.send(i)
co.send(None)
for i in range(1,101):
co.send(i)
co.send(None)
55
5050
StopIteration
python - V : 3.6
def accumulate():
total = 0
while True:
x = (yield)
if x is None:
raise StopIteration(total)
total += x
def sum_coroutine():
while True:
total = yield from accumulate()
print(total)
co = sum_coroutine()
next(co)
for i in range(1,11):
co.send(i)
co.send(None)
for i in range(1,101):
co.send(i)
co.send(None)
55
5050
python - V : 3.7
def accumulate():
total = 0
while True:
x = (yield)
if x is None:
return total
total += x
def sum_coroutine():
while True:
total = yield from accumulate()
print(total)
co = sum_coroutine()
next(co)
for i in range(1,11):
co.send(i)
co.send(None)
for i in range(1,101):
co.send(i)
co.send(None)
55
5050
Collections
ChainMap
from collections import ChainMap
from pprint import pprint
# dict > chainmap
Parent = {'music':'bach', 'art':'rembrandt'}
Me = {'art':'van gogh', 'opera':'carmen'}
cm = ChainMap(Me, Parent)
# chainmap > chainmap
chainmap_parent_generation = cm.parents
chainmap_me_generation = cm
chainmap_me_generation['me'] = 'ME'
chainmap_me_generation['sibling1'] = 'SIBLING1'
chainmap_me_generation['sibling2'] = 'SIBLING2'
del chainmap_me_generation['sibling2']
chainmap_child_generation = cm.new_child()
# chainmap viewer
chainmap_family_viewer = chainmap_child_generation.items()
# chainmap > list
chainmap_family_list = chainmap_child_generation.maps
OUTPUT
# [common keys] : chainmap > list
chainmapkey_family = list(chainmap_child_generation)
# [items of the common keys] : chainmap > dict
chainmapdict_family = dict(chainmap_child_generation)
OUTPUT
Counter
from collections import Counter
l = ['red', 'blue', 'red', 'green', 'blue', 'blue']
cnt = Counter(l)
# count
cnt
# elements
sorted(cnt)
OUTPUT
deque
defaultdict
Regular expression
Explore regular expressions
re module
Raw string
print(r'abcd/n')
abcd/n
Search method
import re
re.search(r'abc','abcdef')
<_sre.SRE_Match object; span=(0, 3), match='abc'>
SUPPLEMENT
m = re.search(r'abc','abcdef')
print(m.start())
print(m.end())
print(m.group())
0
3
abc
Examples
import re
re.search(r'\d\d\d\w','efw2342efwefwef')
<_sre.SRE_Match object; span=(3, 7), match='2342'>
re.search(r'..\w\w','efw@#$23$@')
<_sre.SRE_Match object; span=(4, 8), match='#$23'>
Metacharacter
Meta(1) | Expr |
---|---|
[abck] | a,b,c,k |
[abc.^] | a,b,c,.,^ |
[a-d] | range |
[0-9] | range |
[a-z] | range |
[A-Z] | range |
[a-zA-Z0-9] | range |
[^0-9] | not |
. | all of things |
import re
re.search(r'[cbm]at','cat')
<_sre.SRE_Match object; span=(0, 3), match='cat'>
re.search(r'[0-9]haha','1hahah')
<_sre.SRE_Match object; span=(0, 5), match='1haha'>
re.search(r'[abc.^]aron','caron')
<_sre.SRE_Match object; span=(0, 5), match='caron'>
re.search(r'[^abc]aron','#aron')
<_sre.SRE_Match object; span=(0, 5), match='#aron'>
re.search(r'p.g','pig')
<_sre.SRE_Match object; span=(0, 3), match='pig'>
Meta(2) | Expr |
---|---|
\d | [0-9] |
\D | [^0-9] |
\s | space word |
\S | non-space word |
\w | [0-9a-zA-Z] |
\W | [^0-9a-zA-Z] |
import re
re.search(r'\sand','apple and banana')
<_sre.SRE_Match object; span=(5, 9), match=' and'>
re.search(r'\Sand','apple and banana')
re.search(r'.and','pand')
<_sre.SRE_Match object; span=(0, 4), match='pand'>
re.search(r'\.and','.and')
<_sre.SRE_Match object; span=(0, 4), match='.and'>
Recurrence pattern
+ | more than 1 |
* | more than 0 |
{n} | n |
? | regardless |
import re
re.search(r'a[bcd]*b','abcbcbcbccb')
<_sre.SRE_Match object; span=(0, 11), match='abcbcbcbccb'>
re.search(r'b\w+a','banana')
<_sre.SRE_Match object; span=(0, 6), match='banana'>
re.search(r'i+','piigiii')
<_sre.SRE_Match object; span=(1, 3), match='ii'>
re.search(r'pi+g','pig')
<_sre.SRE_Match object; span=(0, 3), match='pig'>
re.search(r'pi*g','pig')
<_sre.SRE_Match object; span=(0, 3), match='pig'>
re.search(r'pi+g','pg')
re.search(r'pi*g','pg')
<_sre.SRE_Match object; span=(0, 2), match='pg'>
re.search(r'pi{3}g','piiig')
<_sre.SRE_Match object; span=(0, 5), match='piiig'>
re.search(r'pi{3,5}g','piiiig')
<_sre.SRE_Match object; span=(0, 6), match='piiiig'>
re.search(r'pi{3,5}g','piiiiiig')
re.search(r'httpf?','https://www.naver.com')
<_sre.SRE_Match object; span=(0, 4), match='http'>
Condition
^ | start |
$ | end |
import re
re.search(r'b\w+a','cabana')
<_sre.SRE_Match object; span=(2, 6), match='bana'>
re.search(r'^b\w+a','cabana')
re.search(r'^b\w+a','babana')
<_sre.SRE_Match object; span=(0, 6), match='babana'>
re.search(r'b\w+a$','cabana')
<_sre.SRE_Match object; span=(2, 6), match='bana'>
re.search(r'b\w+a$','cabanap')
Grouping
import re
m = re.search(r'(\w+)@(.+)','test@gmail.com')
print(m.group(1))
print(m.group(2))
print(m.group(0))
test
gmail.com
test@gmail.com
Get started with regular expressions
Into a world of powerful regular expression
Debugging
unittest
workspace
class Calculator:
def add(self, a, b):
return a + b
def mul(self, a, b):
return a * b
def Matmul(a, b):
return a * b
unittest
import unittest, time
from workspace import Calculator, Matmul
class test_class(unittest.TestCase):
def test_module_add(self):
self.calculator = Calculator()
self.assertEqual(self.calculator.add(3, 4), 7)
def test_module_mul(self):
time.sleep(1)
self.fail()
class test_function(unittest.TestCase):
def test_module_matmul(self):
time.sleep(1)
self.assertEqual(Matmul(3,5), 15)
unittest.main()
List of posts followed by this article
Reference
- thread
- sololearn - python
- fun coding
- dojang
- Jump to Python
- deepwelloper(python memory)
- python document
- python lectures
- Implementation with python2 on web
- Implementation with python3 on web
- TheAlgorithms
- suwoni codelab