Tuesday, May 1, 2018

Случки и смешки с Йони


2018-07-16
Оставих Йони вкъщи докато изтичам да й взема кроксовете от Ани, а тя се заключила да не влезе някой да й разхвърля играчките.


2018-07-08
Обяснявам на Йони че ще ходим на гръцки фестивал. Казвам й: "Ще има музика, танци, мама ще играе сиртаки ето така..." - правя някакви комично-засукани стъпки. Тя се замисля и отговаря: "Сладолед ще има ли? Аз искам сладолед."

2018-07-07
Прекарваме деня в парка край реката, на рожден ден на Браян. Има маса с хапване, детска площадка, водни пръскалки... изобщо идилия. Йони естествено пропуска следобедния сън и към пет вечерта няма никакви сили. Заспива в колата и се събужда чак сутринта на следващия ден с думите: "Ние защо спим!? Искам на рождения ден! "

2018-06-02
Йони си играе с едно старо дървено нунчаку. Слага пръчките така / \ и ми казва "Виж тате, това са крачета. А това \ / са ръчички, а това – – е коланче.

2018-06-01
Йоана стана малко след теб и отидохме първи на градината. Докато бяхме вкъщи й обяснявах че днес е празник и я питах я дали иска да й надуя един балон. Тя каза "Да, аз ще се скрия" 🙂 И така - тя в хола, аз в кухнята надувам, хахаха! После балона се спука в коридора... и тя се уплаши, но много малко и обясняваше, че "Няма страшно" 😉 После търси балони при Ани, ама тя пък не беше надула заради нея...

2018-05-18
Пазарджик, жега, Йони тича гола из апартамента и гризе домат. Аз съм на работа в Монреал облечен с тънко поларче. Обаждам й се по скайпа и тя още като ме вижда пита - "А ти защо си с яке!?"

2018-05-15
Днес изяде един плесник по дупето, един час я гоних да я облека и накрая ми хвърли телефона...на пода... После вика - "Защо ми пляскаш дупето? Сега ще ми стане червено!"

2018-05-12
За разлика от Монреал, на хоризонта в София се извисява планина. Йони пита баба си:
 - Какво е това?
 - Това е планина.
 - Коя е тая планина?
 - Витоша.
 - Аз там не съм ходила досега.

2018-05-01
Стуринта я питам Йони: "Харесва ли ти в автобуса?" и тя - "Да, амаааа...мирише" :)

2018-04-30
- Спинка ли ?
- Не иска :( Извади си пеещата звездичка от биновете, докато й търсих зеленото шише, и й обяснявам че няма батерии и затова не иска да пее - и тя ми вика - "Аз имам стотинки!!!" Умрях от смях.... щото нали количките на магазина ги пускате със стотинки ;) Даже отиде да ми носи стотинки ;)

2018-04-30
Йоана си поиска и старата зелена чаша с дръжките, търси я в шкафа с лекарствата, много добре си спомня и обяснява... Като видя термометъра вика "Аааа, пате за дупето на Йонииии!" (Термометърът е жълт, гумиран, с патешка глава в единия край. С него й мерихме температурата когато беше бебе).

2018-04-26
Гери се подстригала късо и отишла да вземе Йони от детската градина. Йони е много наблюдателна и веднага забелязва и най-малките промени и новости. Още щом я видяла и попитала „Ти защо си така?“. А Гери отговорила че си е подстригала косичката и я попитала дали и тя иска така. Отговорът бил категорично „Не!“. Ден след това аз също се подстригах. Няколко дни по-късно, Йони се събудила и помолила Гери да я подстриже и нея „така с ножичката“.

2018-04-21
В събота и неделя обикновено се обаждаме на Баба и бъбрим с нея докато закусваме. Йони я очаква с нетърпение и пита за нея още щом се събуди. Веднъж обаче, Баба ни каза че няма да се чуем в неделя, защото е на масаж. Няколко седмици по-късно, Йони искаше да се обадим на Баба в понеделник и ние й  обяснихме че сега не може, защото баба е още на работа. А тя отговори „Не е на работа, а е на масаж. И аз искам на масаж!“ Впрочем, Баба е важна фигура и утвърден модел за подражание. Ние с Гери носим раници и обикновено носим прозрачни очила. А Йони държи да излиза с дамска чанта и с тъмни очила, защото така правеше Баба, когато ни беше на гости.

Friday, February 23, 2018

Мотивация


Извадки по памет и интерпретации на книгата
Proactive Guide to the Psychology of Motivation
(Roman Gelperin)

Човек винаги се стреми да избегне неприятните усещания или поне да ги намали. Ако го боли гърло – пие хапче, ако е гладен – търси храна. Ако сме се погрижили за всички неприятни усещания, изпитваме скука и започваме да търсим приятни усещания. Освен да получим приятни усещания, ние се стараем да ги увеличим. Посоката на нашите стремежи винаги е от най-неприятно, към по малко неприятно и от приятно към по-приятно. Това е принципът на увеличаване на удоволствието и намаляване на неудоволствието.

Опитът да вървим по обратния път би бил посрещнат със силна съпротива. Трудно може да убедим някой да премине към неприятно усещане – например, да си свали шапката и ръкавиците в студен зимен ден. По същият начин е трудно да се премине от една приятна дейност към по-малко приятна дейност. Четенето на лек роман или работата върху интересен проект са приятни, ако нямаме какво друго да правим. Но ако сме по средата на много увлекателен филм, трудно бихме го изоставили за да се върнем към романа или към работата.

Започването на една дейност винаги е съпроводено с изоставянето на друга. За да се случи това, трябва ефектът от втората да е по-силен от първата. Ученик който е прекалено срамежлив за да поиска разрешение от учителя, е готов да стиска когато му се ходи до тоалетна. Но когато нуждата от уриниране се засили достатъчно, той събира смелост да попита. Също така, започването на една дейност често пъти е свързано с определен праг, който трябва да бъде преминат. Ако един младеж обича да играе баскетбол, но игрището е далече и трябва да хване рейс за да стигне до там, той може да предпочете да остане вкъщи и да гледа телевизия. Започването винаги е възпиращ фактор – да се започне нещо винаги е по-трудно, отколкото да не не прави нищо.

Лесно достъпните удоволствия имат голяма притегателна сила – пиенето на алкохол, яденето на шоколад, мастурбацията, гледането на телевизия, видеоигрите. Както видяхме по-горе обаче, ако човек има по-приятни неща за правене, не би бил склонен да ги замени с удоволствия от по-нисък клас. Ако има възможност за секс с партньор, няма да предпочете да мастурбира. Ако е част от футболен отбор и може да участва в играта, няма да я гледа по телевизора с бира в ръка. Ако животът му е изпълнен с ярки преживявания и големи победи, няма да има нужда от малките вредни удоволствия.

Самата дейност и резултатът от нея нерядко носят различни усещания. Яденето на шоколад е приятно, но напълняването не е желано. Ученето на уроци често пъти е неприятно, но резултатът – получаването на диплома е приятен. Често пъти резултатът е това, което разумната част от съзнанието ни желае, а удоволствието от самото действие определят дали ще започнем или ще се откажем. Често пъти, резултатът от една дейност е далеч на хоризонта, докато самото извършване на дейността се случва в момента. От желаното получаване на диплома ни делят години, докато неприятното писане на домашни е много по близко и познато усещане с голяма възпираща сила. Когато крайният срок за предаване на проект е далече, притесненията от наближаването му са слаби. Когато останат само няколко дин, страхът че няма да успеем става много по-силен и склонността ни да протакаме намалява.

Усещанията могат да бъдат физически и мисловни. Ако нямаме достъп до приятни физически стимули, започваме да създаваме такива във въображението си. Например, по време на скучна лекция сме склонни да се отплесваме и да мислим за неща, които са ни по-приятни или по-интересни. Особено трудно е човек да се концертира върху нещо, което не увеличава удоволствието и не намалява неудоволствието. Филми за тъжни и неприятни събития не са особено популярни и е лесно да бъдат игнорирани, дори ако касаят важни теми като екология или здравеопазване.

Силата на волята ни прави способни да изтърпим нещо неприятно, за да прескочим прага към по-приятна цел.  Така например, човек може да се насили да слуша скучна лекция, защото знае че това ще му помогне да си вземе изпита. За съжаление, това неестествено състояние може да бъде поддържано само ограничен период от време. Колкото и силна да е волята, не можем да разчитаме само на нея да се пребори с всички пориви на нашите чувства и инстинкти.

Силата на усещанията често пъти играят голяма роля при взимането на решения. Въздържането от изневяра може да бъде много по-трудно за едни, отколкото за други. Хора, които изпитват по-силен страх от перспективата да бъдат разкрити и засрамени, биха се въздържали много по-лесно от хора, които изпитват по-слаб страх и по-силно сексуално влечение. Страхът и срамът могат лесно да бъдат разпалвани използвани за постигането на определени цели, въпреки че това едва ли е най-приятният метод за засилване на мотивацията. Засилването на приятните усещания и очаквания е друга опция. Вярващият човек не е мотивиран само от страх да не попадне в ада. Често пъти движещата му сила е удовлетворението и радостта от това че е постъпил правилно и е надвил изкушението. Тази радост може да бъде поощрявана и засилвана от обкръжението му и процесът би бил по-приятен от това свещеникът непрекъснато да го плаши с кръговете на ада.

Вниманието ни може да бъде разделяно, за да реагираме на няколко стимула едновременно. Човек може да играе шах и да гледа телевизия едновременно. Така обаче рискът да загуби партията се увеличава значително. Често пъти на човек му е нужно много малко за да задоволи глада за удоволствия. Например, ако има да върши монотонна и скучна работа, може да си пусне приятна музика. По този начин няма да бъде 100% концентриран в работата, но поне ще може да я продължи и завърши, вместо да се отегчи и да я отложи за друг път. Това, естествено работи, само ако работата не изисква голяма концентрация и ако внимаваме дребното удоволствие да не узурпира изцяло вниманието ни. Ако четем материали за важен изпит и спираме от време на време да погледнем какво става във Фейсбук, рискуваме лесно да изпуснем юздите на тандема приятно – неприятно.

Интересно е, че винаги се стремим да запълним вниманието си изцяло. Например, ако противникът е слаб, играта на шах не успява да ангажира изцяло вниманието ни и включваме телевизора за да запълним празнотата. Стимулите които успяват лесно да запълнят изцяло вниманието ни имат по-голяма сила от стимулите които го запълват само частично.

Разделянето и запълването на вниманието могат да бъдат комбинирани. Студент, който работи над проект и използва част от вниманието си за да слуша музика изпитва умерено удоволствие от целия процес. Удоволствието би било много по-голямо, ако вместо това играе видеоигра, но въпреки това той не е склонен да го направи. Едната причина е че той вече изпитва някакво удоволствие, а другата е че вниманието му е изцяло погълнато и той не разполага със свободен ресурс, който да бъде привлечен към започването на дейност с по-приятен ефект. Ако обаче бъде прекъснат, например от телефонно обаждане, шансовете да спре работата и да я замени с друга, по-приятна дейност се увеличават значително.


Вниманието може да бъде насочвано. Лекият сърбеж става много по-силен, когато мислим непрекъснато за него. Използвайки същия принцип, можем съзнателно да насочим мислите ни към едно или друго усещане, за да увеличим неговата сила и да го използваме за да ни подтикне към желано от нас действие.

В реалния живот един стимул не е само приятен или само неприятен. Например, работата върху един проект е поредица от неприятни трудности и търсене на решения, следвани от задоволство при преодоляването и разрешаването им. Ако удовлетворението от постиженията е по-голямо от неудоволствието на трудностите, то проектът е приятен. Същият този проект може да стане неприятен в края на деня, когато силите ни намаляват и ни отнема все по-голямо усилие да намерим правилните решения. Тончо затова видео-игрите имат голяма притегателна сила – при тях всяко следващо ниво носи радост. Тези малки радости са разпределени равномерно, така че да ни държат в приятно очакване на следващата награда.  Трудностите са премерени така че и уморен или не особено умен човек може да ги играе без това да е особено натоварващо. А в допълнение сценарият е така измислен, че максимално да поглъща вниманието ни.

Всичко разгледано дотук е от гледна точка на човек подложен на стимули без намесата на други хора. Влиянието на околните може да бъде много силен активатор. Задача, която е скучна и безинтересна, може да се превърне в желана цел, ако разрешаването й ще ни позволи да зарадваме любим човек, да получим социално признание, да бъдем приети в желана от нас група. Ако целта ни е да отслабнем, е много по-лесно да отидем да тичаме с приятел, отколкото да се насилим да го правим сами. Състезанията и съперничеството са много, много силен източник на мотивация. Срамът и страхът от критика са мощен възпиращ фактор. Оставен сам със себе си, човек е способен на много по-малко, отколкото ако е част от обществото.

Чувствата са особена група стимулатори. Тяхната продължителност ни позволява дълго време да извличаме полза от действието им преди да отшумят. Също така, те могат да бъдат изпитвани без това да отнемат процент от концентрацията ни. Ако на човек се е случило нещо радостно, той изпитва наслада, която му дава сили да извърши скучна и неприятна. Това, естествено, важи и с обратен знак. Неприятните емоции демотивират и нуждата от компенсиране с други приятни стимули нараства.

Има поговорка за алкохолици, която казва „Без едно питие мога, само с едно не мога“. Ако вече сме започнали да извършваме определена дейност, изпитваме с пълна сила нейният ефект, бил той положителен или отрицателен. В това време, крайният резултат е все още е напред в бъдещето, ефектът от него ще бъде изпитан по-късно. Не е чудно че при тези обстоятелства мотивиращият ефект на резултата е много по-слаб от мотивиращият ефект на самото действие.

Ако обаче претеглим плюсовете и минусите преди да започнем определена дейност, ефектът от нейното извършване също ще бъде само проекция в бъдещето. Това може значително да изравни силите на ефекта от резултата и ефекта от извършването. По този начин рационалната ни част ще е по-свободна да взима решения трезво и независимо. Когато моментът за действие настъпи, можем просто да се придържаме към вече взетото решение. Само по себе си това не е лесно, но комбинирано с други техники може да се окаже достатъчно.

Съществува израз на английски „Keep your eyes on the prise“ – Не изпускай от поглед наградата. Можем да извикаме в съзнанието си визуален образ, свързан с резултата от нашето действие. С малко тренировка, този образ може бързо и лесно да бъде извикван, за да направи по-ярка картината на това към което се стремим, да увеличи неговата притегателна сила. Основното предимство на тази техника е че не изисква почти никакво усилие и може да бъде приложена бързо в който и да е момент.

Друга много мощна техника е промяната на средата. Малки, контролирани от нас промени, могат да ни помогнат да наклоним везните в правилната посока. Ако обувките ни са неудобни, то едва ли ще сме особено мотивирани да излезем с тях на разходка. По същия начин, човек може да си купува не особено вкусна храна, ако целта му е да яде по-малко. Ако желаем да прекарваме повече време навън, може да се преместим в по-хубав квартал или близо до голям парк, като в същото време се отървем от хубавия телевизор и комфортния фотьойл, които ни задържат вкъщи. Понякога не е необходимо да страним вредните неща, а само да увеличим времето, необходимо за достигането им. Много е по-лесно да посегнем към шоколада, ако седи в чекмеджето на бюрото ни. Желанията и емоциите са променливи. Ако решим да четем повече книги, вместо да гледаме телевизор, може да успеем да го правим в началото. Но ще има дни, когато това ще е по-трудно. Друг път ще включим телевизора инстинктивно, без дори и да се замислим за книгите. Предимството на околната среда е нейната постоянност – ако изхвърлим телевизора и си купим книги, седмица по късно телевизорът ще си остане изхвърлен, а книгата ще е все още на наше разположение.

... това са първите 30% от книгата, следва продължение когато събера мотивация да я допрочета :)

Citations from Betty Youngs

Help your child learn to communicate assertively. He’ll need to learn to say “No” without an apology, argument or excuse.

“My dad is always telling me what he does for me” he said in a tone riddled with sarcasm. “I wish he’d do less for me and more with me.”

And remember, punishment has impact because of its certainty, not because of its severity.

Don’t praise the child, but do praise what the child is doing. Say, “It’s good you’re sitting quietly” rather than “You are a good boy for sitting quietly.”

“Remember, we say only positive things about ourselves”

... the most important factor was unconditional love. High-self-esteem children came from backgrounds that provided the kind of love that expresses respect, concern and acceptance. Children were accepted for their strengths and weaknesses. It was clearly love with no strings attached.

What you believe about your child’s worth becomes a self-fulfilling prophecy. In other words, children become what you believe they will become.

What children hear, they believe. The messages are later played back and become a reference for what a child believes about himself. This tape makes up a child’s inner language. For better or for worse, that child has been programmed.

Focus your praise not on the way the task was done, but on the fact that it was attempted or completed. If you want him to improve the way he does a particular task, show him, as opposed to telling him.

from the book 
How to Develop Self-Esteem in Your Child 
(Betty Youngs)

Thursday, January 18, 2018

Python 3 fundamentals

#!/usr/bin/env python3

""" GENERAL """

#Python is case-sensitive !!!
#indentations instead of curly braces
#use 4 empty spaces OR tab
#do not mix tabs and spaces

#run python files from CommandPrompt or PowerShell:
#C:\>python filename.py arguments

type(a)           #returns the type of a
sys.argv[0]       #returns the name of the file
sys.argv[1]       #returns the command line argument

print('things inside braces ',
      'can be spread over multiple '+
      'lines')


""" DOCUMENTING """

def myFunc(a):
    """This is a demo function
    Arguments:
        a: string entered by the user
    Returns:
        The same string appended by "bee"
    """
    print(a+' + bee is')
    return a + 'bee'



help(myFunc)      #returns the description of the function


""" SCALAR TYPES """

#integer or float
6/3               #results float 2.0
6//3              #results integer 3

#convert to integer
int(3.5)          #3
int(-3.5)         #-3 (rounds toward zero)
int("300")        #300

#None type
a = None

#Bool
bool(0)           #false; only 0 is false, any other number is true
bool(0.0)         #false
bool(1)           #true
bool(-1.25)       #true

bool([])          #false; any empty collection (string, list, etc..) is false
bool("")          #false
bool([])          #true; any non-empty collection is true
bool([1,6])       #true
bool("0")         #true
bool("False")     #true


""" CONTITIONAL STATEMENTS """

if a < 5:
   print("is smaller than five")
elif a < 3:
   print("is smaller than 3")
else:
   print("is equal or bigger than 5")

  
""" WHILE LOOP """

#will print 5,4,3,2,1
c = 5
while c != 0:
      print (c)
      c -= 1            #decrement by one


#will break the loop if
c = 5
while c != 0:
      print (c)
      if c == 3:
            print("let's break here, no need to go down to 0")
            break
      c -= 1            #decrement by one
     
     
#will wait for the correct response :)
while True:
      response = input("How many musketeers? ")
      if response == "3" or response == "three":
            print("That is correct !")
            break
      print("Wrong answer.")
     

""" STRING """

#using escape characters
path = "c:\\\\Users\d\'Artagnan"
print(path)

#using raw string instead
path = r"c:\\Users\d'Artagnan"
print(path)

#encode and decode strings with special characters
francais = "réponse"
data = francais.encode("utf-8")
print(data)
french = data.decode("utf-8")
print(french)

#string and parts of a string
a = 'montreal'
print(a[0])             #m
print(a[1])             #o
print(a[-1])            #l
print(a[0:5])           #montr
print(a[2:5])           #ntr
print(a[2:-2])          #ntre
print(a[:])             #montreal

#join and split
colors = '-'.join(['red','green','blue'])
print(colors)                             #red-green-blue
print(colors.split('-'))                  #['red', 'green', 'blue']

#concatenate with join or with +
print(''.join(['uga','buga']))            #ugabuga
print('uga'+'buga')                       #ugabuga

#partition
left, middle, right = 'Jack and Jill'.partition(' and ')
print(left)                               #Jack
print(middle)                             # and
print(right)                              #Jill


#more methods
print('hello'.capitalize())               #Hello
print('hello'.replace('e','a'))           #Hallo
print('hello'.isalpha())                  #True
print('hello'.isdigit())                  #False
print(len('green'))                       #5

#format method
a = "Jack"
b = "Jill"
print('Hello, {0} and {1} !'.format(a,'Jimmy'))       #Hello, Jack and Jimmy !
print(f'Hello, {a} and {b} !')                        #Hello, Jack and Jill !

#another format exemple
a=3.14159
print(f'pi = {a} ')           #3.14159
print(f'pi = {a:.2f} ')       #3.14


""" RANGE """

print(list(range(10)))        #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9
print(list(range(5,10)))      #[5, 6, 7, 8, 9]
print(list(range(0,10,2)))    #[0, 2, 4, 6, 8]

for i in range (10):          # will output 0,1,2,3,4,5,6,7,8,9
      print(i)

for i in range (5,10):        # will output 5,6,7,8,9
      print(i)
     
for i in range (0,10,2):      # will output 0,2,4,6,8
      print(i)
     
     
""" LIST """

a = []                        #declare empry list
a.append('X')                 #add values in a list
print(a)                      #['X']

b = [1,33,66]                 #declare list with values
b[0] = 'F'                    #modify value
print(b)                      #['F', 33, 66]


mylist = "m o n t r e a l".split()

print(mylist)                 #['m', 'o', 'n', 't', 'r', 'e', 'a', 'l']
print(mylist[0])              #m
print(mylist[1])              #o
print(mylist[-1])             #l
print(mylist[0:5])            #['m', 'o', 'n', 't', 'r']
print(mylist[2:5])            #['n', 't', 'r']
print(mylist[2:-2])           #['n', 't', 'r', 'e']
print(mylist[:])              #['m', 'o', 'n', 't', 'r', 'e', 'a', 'l']


#copying lists - creates shallow copies
seq = [1,2,3]
seq2 = seq[:]                 #creates shallow copy
seq3 = seq.copy()             #creates shallow copy
seq4 = list(seq)              #creates shallow copy
seq5 = seq                    #creates a reference !!!

seq[0] = 100                  #modifying original list
print(seq)                    #[100, 2, 3]
print(seq2)                   #[1, 2, 3]
print(seq3)                   #[1, 2, 3]
print(seq4)                   #[1, 2, 3]
print(seq5)                   #[100, 2, 3]


#find value in a list, count value instances
mylist = ['heads','shoulders','knees','and','toes','knees','and','toes']
i = mylist.index('heads')
print(i)                                  #0
print(mylist[i])                          #heads
print('knees' in mylist)                  #True; 'in' and 'not in' are supported
print(mylist.count('knees'))              #2

#remove elements by index or by value
mylist = ['heads','shoulders','knees','and','toes']
del mylist[0]
print(mylist)                             #['shoulders', 'knees', 'and', 'toes']
mylist.remove('shoulders')
print(mylist)                             #['knees', 'and', 'toes']
mylist.insert(0,'head')
print(mylist)                             #['head', 'knees', 'and', 'toes']

#convert string to a list
mylist = ['heads','shoulders','knees','and','toes']
str = ' '.join(mylist)
print(str)                                #heads shoulders knees and toes

#growing lists
m = [1,2,3]
k = m + [4]
k += [5]
k.extend([6,7])
print(k)                                  #[1, 2, 3, 4, 5, 6, 7]

#sort and inverse
m = [4,2,1,3]
m.sort()
print(m)                                  #[1, 2, 3, 4]
m.reverse()                               #same as m.sort(reverse=True)
print(m)                                  #[4, 3, 2, 1]

#sort by length
m = ['Melbourn','Oz','Paris']
m.sort(key=len)
print(m)                                  #['Oz', 'Paris', 'Melbourn']

m = ['Melbourn','Oz','Paris']
m.sort(key=len,reverse=True)
print(m)                                  #['Melbourn', 'Paris', 'Oz']


""" DICTIONNARY """

#can be multi-line, thanks to the {}
d = { 'Yahoo':    'http://yahoo.com',
            'Google':   'http://google.com'}
           
d['Google'] = 'www.google.com'                  #modify the value of 'Google'
d['Redmine'] = 'www.redmine.com'                #add new values
print(d)                                        #{'Yahoo': 'http://yahoo.com', 'Google': 'www.google.com', 'Redmine': 'www.redmine.com'}

#keys must be immutable
#values can be mutable
#order is arbitrary !!!!


#copy dictionnaries
e = d.copy()
f = dict(d)

#update from another dictionnary
f = {'red':'rouge', 'green':'verde'}
g = {'yellow':'jaune', 'green':'vert'}
f.update(g)                                     #add and update (f to g)
print(f)                                        #{'red': 'rouge', 'green': 'vert', 'yellow': 'jaune'}

#list keys and values
colors = {'red': '#ff0000', 'blue': '#0000ff'}
for key,value in colors.items():
    print(key + ' is ' +  value)
     
#verify membership and remove items
colors = {'red': '#ff0000', 'blue': '#0000ff'}
print('red' in colors                           #True; 'in' and 'not in' are supported
del colors['red']
print('red' in colors)                          #True


""" SET """

e = set()                                       #creates an empty set
s = {1,2,'a','b'}                               #creates set with values
print(s)                                        #{1, 2, 'b', 'a'}

#use set() to remove duplocates from a list

t = [1,2,2,3,3,3,4,4,5,5,5,5]
s = set(t)
print(s)                                        #{1, 2, 3, 4, 5}

#in and not in are supported
#add(element) to add elements; existing elements are ignored
#remove(element) to remove elements (error if the element )
#discard(element) to remove elements
#update() to update elements

#copy sets
d = {1,2,'a','b'}
e = d.copy()
f = set(d)

#used to compute unions, intersections, differences, subsets


""" FOR LOOP """

#with range
for i in range (10):                      # will output 0,1,2,3,4,5,6,7,8,9
      print(i)
     
#with list
cities = ['London', 'Paris', 'Oslo']
for a in cities:
    print(a)

#with dictionnary
colors = {'red': '#ff0000', 'blue': '#0000ff'}

for a in colors:
      print(a)                            #will return the key

for a in colors:
      print(colors[a])                    #will return the value

#break and continue
for i in range (5):                       # will stop and only output 0,1,2
    if i == 3:
        break
    print(i)

for i in range (5):                       # will skip 3 and output 0,1,2,4
    if i == 3:
        continue
    print(i)           

     
""" FUNCTION """

def myFunc(a):                           
    print(a+' + bee is')
    return a + 'bee'

a = input('Type something : ')
print(myFunc(a))                          #using the result returned by the function


""" FUNCTION ARGUMENTS """

def f(a,b="bananas"):                     #b argument has a default value
    print(+ ' and ' + b)

f('apples')                               #apples and bananas
f('apples', 'strawberries')               #apples and strawberries
f(b="dogs", a="cats")                     #cats and dogs

#passing additional arguments
def function (argument, *args)            # *args is a list
def function (argument, **kwargs)         # **kwargs is a dictionnary


""" ARGUMENT PASSING """

#k and m are the same thing
m = [1,2]
def modify(k):
    k.append(3)
    print('k value is ' + str(k))         #k value is [1, 2, 3]
    print('k id is ' + str(id(k)))        #k id is 58376960

modify(m)
print('m value is '+str(m))               #m value is [1, 2, 3]
print('m id is ' + str(id(m)))            #m id is 58376960

#k and m are no loger the same thing
m = [1,2]
def modify(k):
    k = [1,2]                             #here is when k gets redirected to another object in the memory
    k.append(3)
    print('k value is ' + str(k))         #k value is [1, 2, 3]
    print('k id is ' + str(id(k))         #k id is 49463088

modify(m)
print('m value is '+str(m))               #m value is [1, 2]
print('m id is ' + str(id(m)))            #m id is 49595136


""" VARIABLE SCOPING """

#access variable within a function
count = 6
laps  = 6

def increase(a,b):
    count = a
    count += 1                #count becomes local variable

    global laps               #gives access to the global variable
    laps = b
    laps += 1                 #modifies the global variable

increase(count,laps)

print(count)                  #6
print(laps)                   #7


""" EXCEPTION HANDLING """

try:
    x = int('sdf')
    print('Conversion succeeded! x = ', x)
except ValueError:                              #error message for a specific error
    print('Value error')
except IndentationError:                        #error message for another error
    pass                                        #do nothing
except (TypeError, NameError):                  #regroup errors
    print('Conversion failed')
except Exception:                               #will catch any error
    print('Unknown error')

#get error details
try:
    x = int('sdf')
except Exception as error:
    print('Unknown error - ', error )
     
     
""" CLASS """

class Student():

    shcool = 'Ahuntsic'                         #class attribute - the same for every instance

    def __init__(self, name):                   #'self' refers to the instance;
        print (name + ' created')
        self._name = name                       #creating instance attribute

    def __str__(self):
        return 'Student ' + self._name          #will be returned when the instance is printed

    def name_format(self):                      #functions inside classes = methods
        return self._name.capitalize()          #calitalizes the instance attribute 'name'


mark = Student('mark')                          #'mark' is an instance of the class 'Student'
john = Student('john')                          #another instance of the class 'Student'
print(mark.name_format())                       #Mark
print(john.name_format())                       #John
print(mark)                                     #Student mark
print(john)                                     #Student john
print(Student.shcool)                           #Ahuntsic
print(mark.shcool)                              #Ahuntsic
print(john.shcool)                              #Ahuntsic

class HighSchoolStudent(Student):               #HighSchoolStudent class is derived from Student class

    shcool = 'ETS'                              #overwrites the parent class attribute

    def name_format(self):                      #overwrites the parent method
        a = super().name_format()               #the parent method is still accessible via super()
        return ' '.join(a)                      #adds spaces


maria = HighSchoolStudent('maria')              #maria created
print(maria.shcool)                             #ETS
print(maria.name_format())                      #M a r i a


""" IMPORT """

# --- tools.py ----                             #a simple exemple of python module
def format_names(a):
    return a.capitalize()
#------------------

# --- main.py ----
import tools                                    #import tools.py; note that .py is omitted
print(            format_names('maria'))        #rises an error
print(tools.format_names('maria'))              #works fine
#------------------

# --- main.py ----
from tools import *                             #import all from tools.py
print(            format_names('maria'))        #works fine
print(tools.format_names('maria'))              #rises an error
#------------------

# --- main.py ----
from tools import format_names                  #import specific function from tools.py
print(            format_names('maria'))        #works fine
print(tools.format_names('maria'))              #rises an error
#------------------

# --- main.py ----
from tools import format_names as fnam          #import with an alias
print(            format_names('maria'))        #rises an error
print(fnam('maria'))                            #works fine
#------------------


#Module code is executed once, on first import

#this helps tell if the file is imported or executed directly
if __name__ == '__main__':
    print('the file is executed alone')
else:
    print('the file is imported')
     
#Some definitions :
#Python module - convenient import
#Python script - convenient execution from command line
#Python program - perhaps composed of many modules


""" WORKING WITH FILES """

#write
f = open('test.txt', mode='at', encoding='utf-8')   #'at' is append text
f.write('just testing ')
f.write('new things\n')                             #both 'write' and 'writelines' require \n to end a line
f.writelines(['more tests',
              ' comming soon\n',   
              'farewell ',
              'my friend'])
f.close()

#readline
g = open('test.txt', mode='rt', encoding='utf-8')   #'rt' is read text
print(g.readline())                                 #will read the first line
print(g.readline())                                 #will read the next line
g.close()

g = open('test.txt', mode='rt', encoding='utf-8')
list = g.readlines()                                #will read all lines into a list
g.close()
print(list)

#filename passed as argument and reads all the lines from a file
import sys
def main(filename):
    f = open(filename, mode='rt', encoding='utf-8')
    for line in f:
        print(line)
    f.close()

main(sys.argv[1])


""" EXECUTABLE FILE """

#to install the exe generator, type in PowerShell :
#>pip install pyinstaller

#to create an exe from somefile.py :
#>pyinstaller --onefile somefile.py