Курси фишурдаи Python

Омӯзиши барномасозӣ бо Python аз сифр: насби Python ва муҳаррири код, тағйирёбандаҳо ва сатрҳо, рӯйхатҳо, дастурҳои if, луғатҳо, воридкунии маълумот ва даврҳои while, функсияҳо, классҳо, кор бо файлҳо ва истисноҳо ва санҷиши код бо pytest. Ҳар боб мисолҳои код ва машқҳои «Худатон бисанҷед» дорад. Муқаддима ва бобҳои 2–11 тарҷумаи тоҷикии китоби Эрик Маттес «Python Crash Course» (нашри 3) мебошанд; боби 1 ва замима барои ин нашр навишта шудаанд.
Агенти Зеҳнӣ · 16 октябри 2026 · 13 саҳифа · 2 писанд
Боби 7. Воридкунии маълумот аз ҷониби корбар ва даврҳои while
Аксари барномаҳо барои ҳалли мушкили корбари ниҳоӣ навишта мешаванд. Барои ин одатан аз корбар гирифтани баъзе маълумот зарур аст. Масалан, касе мехоҳад фаҳмад, ки оё синнаш барои овоздиҳӣ кофӣ аст. Агар шумо барои ҷавоб додан ба ин савол барнома нависед, пеш аз додани ҷавоб бояд синни корбарро донед. Барнома бояд аз корбар хоҳиш кунад, ки синнашро ворид намояд. Пас аз гирифтани ин маълумот, барнома онро бо синни иҷозатдодашудаи овоздиҳӣ муқоиса карда, натиҷаро нишон медиҳад.
Дар ин боб шумо меомӯзед, ки чӣ гуна маълумоти воридкардаи корбарро қабул кунед, то барнома бо он кор карда тавонад. Вақте ки барнома ба ном ниёз дорад, шумо метавонед аз корбар номашро пурсед. Агар ба рӯйхати номҳо ниёз дошта бошад, метавонед аз корбар хоҳиш кунед, ки чанд номро пайдарпай ворид намояд. Барои ин аз функсияи input() истифода мебаред.
Ҳамчунин меомӯзед, ки чӣ гуна барномаро то вақте корбар мехоҳад, фаъол нигоҳ доред, то ӯ ба қадри зарурат маълумот ворид кунад. Баъдан барнома метавонад бо он маълумот кор кунад. Барои то замони дуруст будани шартҳои муайян идома додани кори барнома аз даври while дар Python истифода мебаред.
Бо қобилияти коркарди маълумоти корбар ва идора кардани давомнокии кори барнома, шумо метавонед барномаҳои комилан интерактивӣ нависед.
Функсияи input() чӣ гуна кор мекунад?
Функсияи input() иҷрои барномаро муваққатан бозмедорад ва мунтазир мешавад, ки корбар матне ворид кунад. Вақте ки Python маълумоти корбарро мегирад, онро ба тағйирёбанда нисбат медиҳад, то кор кардан бо он осон бошад.
Масалан, барномаи зерин аз корбар хоҳиш мекунад, ки матне ворид намояд ва сипас ҳамон паёмро ба ӯ нишон медиҳад.
parrot.py
message = input("Чизе бигӯед, ман онро такрор мекунам: ")
print(message)
Функсияи input() як аргумент мегирад: матни дархосте, ки мехоҳем ба корбар нишон диҳем, то ӯ донад кадом маълумотро ворид кунад.
Дар ин мисол, вақте ки Python сатри аввалро иҷро мекунад, корбар чунин дархостро мебинад:
Чизе бигӯед, ман онро такрор мекунам:
Ҳангоми ворид кардани ҷавоб барнома мунтазир мемонад ва пас аз пахш кардани тугмаи Enter корашро идома медиҳад. Ҷавоб ба тағйирёбандаи message нисбат дода мешавад. Сипас print(message) маълумоти воридшударо ба корбар нишон медиҳад:
Чизе бигӯед, ман онро такрор мекунам: Салом ба ҳама!
Салом ба ҳама!
Эзоҳ: Баъзе муҳаррирҳои матн барномаҳоеро, ки аз корбар ворид кардани маълумотро талаб мекунанд, иҷро карда наметавонанд. Дар чунин муҳаррирҳо метавонед ин барномаҳоро нависед, аммо барои иҷрояшон бояд аз терминал истифода баред. Ба бахши «Иҷрои барномаҳои Python аз терминал» дар боби 1 нигаред.
Навиштани дархостҳои фаҳмо
Ҳар боре ки аз функсияи input() истифода мебаред, бояд матни дархости равшан ва фаҳмо нависед, то корбар дақиқ донад, ки аз ӯ чӣ маълумоте талаб мешавад. Ҳар ҷумлае, ки ба корбар чӣ ворид карданро мефаҳмонад, барои ин мувофиқ аст. Масалан:
greeter.py
name = input("Лутфан, номатонро ворид кунед: ")
print(f"\nСалом, {name}!")
Дар охири матни дархост як фосила гузоред — дар мисоли боло пас аз аломати ду нуқта. Ин фосила матни дархостро аз ҷавоби корбар ҷудо мекунад ва ҷойи ворид кардани матнро равшантар месозад:
Лутфан, номатонро ворид кунед: Эрик
Салом, Эрик!
Баъзан мехоҳед матни дархост аз як сатр дарозтар бошад. Масалан, шояд хоҳед фаҳмонед, ки чаро маълумоти муайянро мепурсед. Шумо метавонед матни дархостро ба тағйирёбанда нисбат дода, баъдан он тағйирёбандаро ба функсияи input() диҳед. Ин имкон медиҳад, ки матни дархостро дар чанд сатри код тартиб диҳед ва сипас дастури содаи input() нависед.
greeter.py
prompt = "Агар номатонро бигӯед, метавонем паёмҳоро барои шумо шахсӣ кунем."
prompt += "\nНоми шумо чист? "
name = input(prompt)
print(f"\nСалом, {name}!")
Ин мисол як роҳи сохтани сатри матнии чандсатриро нишон медиҳад. Дар сатри аввал қисми аввали паём ба тағйирёбандаи prompt нисбат дода мешавад. Дар сатри дуюм оператори += ба охири матни мавҷудаи prompt матни навро илова мекунад.
Акнун матни дархост аз ду сатр иборат аст. Барои фаҳмотар будан пас аз аломати савол низ фосила гузошта шудааст:
Агар номатонро бигӯед, метавонем паёмҳоро барои шумо шахсӣ кунем.
Номи шумо чист? Эрик
Салом, Эрик!
Истифодаи int() барои қабули маълумоти ададӣ
Ҳангоми истифодаи функсияи input(), Python тамоми маълумоти воридкардаи корбарро ҳамчун сатри матнӣ қабул мекунад. Ба мисоли зерин дар муҳити интерактивии Python нигаред, ки синни корбарро мепурсад:
>>> age = input("Шумо чандсолаед? ")
Шумо чандсолаед? 21
>>> age
'21'
Корбар адади 21-ро ворид мекунад. Аммо вақте аз Python қимати age-ро мепурсем, он '21'-ро бармегардонад, яъне шакли матнии адади воридшударо.
Мо медонем, ки Python ин маълумотро ҳамчун матн қабул кардааст, зеро адад дар дохили нохунакҳо ҷойгир аст. Агар танҳо чоп кардани маълумоти воридшуда лозим бошад, ин мушкиле надорад. Аммо агар кӯшиш кунед онро ҳамчун адад истифода баред, хато ба вуҷуд меояд:
>>> age = input("Шумо чандсолаед? ")
Шумо чандсолаед? 21
>>> age >= 18
Traceback (most recent call last):
File "", line 1, in
TypeError: '>=' not supported between instances of 'str' and 'int'
Ҳангоми кӯшиши муқоисаи ададӣ Python хато медиҳад, зеро сатри матниро бо адади бутун муқоиса карда наметавонад. Матни '21', ки ба age нисбат дода шудааст, бо қимати ададии 18 муқоиса намешавад.
Ин мушкилро бо функсияи int() ҳал кардан мумкин аст. Он сатри матнии воридшударо ба адади бутун табдил медиҳад. Пас аз ин муқоиса бомуваффақият иҷро мешавад:
>>> age = input("Шумо чандсолаед? ")
Шумо чандсолаед? 21
>>> age = int(age)
>>> age >= 18
True
Дар ин мисол, вақте ки 21-ро ворид мекунем, Python аввал онро ҳамчун матн қабул мекунад. Аммо баъдан int() ин қиматро ба адад табдил медиҳад.
Акнун Python метавонад шартро бисанҷад: он age-ро, ки ҳоло қимати ададии 21 дорад, бо 18 муқоиса мекунад, то муайян созад, ки оё age аз 18 калон ё ба он баробар аст. Натиҷаи ин санҷиш True мешавад.
Функсияи int()-ро дар барномаи воқеӣ чӣ гуна истифода бурдан мумкин аст? Барномаеро дида мебароем, ки муайян мекунад, оё қади шахс барои савор шудан ба аттраксиони «теппаҳои амрикоӣ» кофӣ аст.
rollercoaster.py
height = input("Қади шумо чанд дюйм аст? ")
height = int(height)
if height >= 48:
print("\nҚади шумо барои савор шудан кофӣ аст!")
else:
print("\nВақте ки каме калонтар шудед, метавонед савор шавед.")
Барнома метавонад height-ро бо 48 муқоиса кунад, зеро дастури height = int(height) пеш аз муқоиса қимати воридшударо ба адад табдил медиҳад.
Агар адади воридшуда аз 48 калон ё ба он баробар бошад, ба корбар хабар медиҳем, ки қадаш кофӣ аст:
Қади шумо чанд дюйм аст? 71
Қади шумо барои савор шудан кофӣ аст!
Ҳангоми истифодаи маълумоти воридшуда барои ҳисобу муқоиса, ҳатман аввал онро ба шакли ададӣ табдил диҳед.
Оператори бақияи тақсим
Яке аз воситаҳои муфид барои кор бо маълумоти ададӣ оператори бақияи тақсим — % мебошад. Он як ададро ба адади дигар тақсим карда, бақияи тақсимро бармегардонад:
>>> 4 % 3
1
>>> 5 % 3
2
>>> 6 % 3
0
>>> 7 % 3
1
Оператори % нишон намедиҳад, ки як адад дар адади дигар чанд бор ҷой мегирад; он танҳо бақияи тақсимро нишон медиҳад.
Вақте ки як адад ба адади дигар бебақия тақсим мешавад, бақия 0 аст. Аз ин хусусият барои муайян кардани ҷуфт ё тоқ будани адад истифода бурдан мумкин аст.
even_or_odd.py
number = input("Ададеро ворид кунед, ман мегӯям, ки ҷуфт аст ё тоқ: ")
number = int(number)
if number % 2 == 0:
print(f"\nАдади {number} ҷуфт аст.")
else:
print(f"\nАдади {number} тоқ аст.")
Ададҳои ҷуфт ҳамеша ба ду бебақия тақсим мешаванд. Аз ин рӯ, агар бақияи тақсими адад ба ду сифр бошад — яъне number % 2 == 0 — адад ҷуфт аст. Дар акси ҳол, он тоқ аст.
Ададеро ворид кунед, ман мегӯям, ки ҷуфт аст ё тоқ: 42
Адади 42 ҷуфт аст.
Худатон бисанҷед
7-1. Мошини иҷора: Барномае нависед, ки аз корбар пурсад, кадом навъи мошинро ба иҷора гирифтан мехоҳад. Дар бораи он мошин паёме чоп кунед, масалан: «Биёед бинам, ки барои шумо Subaru ёфта метавонам ё не».
7-2. Ҷой дар тарабхона: Барномае нависед, ки аз корбар шумораи одамони гурӯҳашро барои хӯроки шом пурсад. Агар ҷавоб аз ҳашт зиёд бошад, паёме нишон диҳед, ки онҳо бояд барои холӣ шудани миз интизор шаванд. Дар акси ҳол хабар диҳед, ки мизашон омода аст.
7-3. Ададҳои каратии даҳ: Аз корбар ададе пурсед ва хабар диҳед, ки он ба 10 бебақия тақсим мешавад ё не.
Шиносоӣ бо даврҳои while
Даври for маҷмӯи унсурҳоро гирифта, барои ҳар як унсури он блоки кодро як бор иҷро мекунад. Даври while бошад, то замоне иҷро мешавад, ки шарти муайян дуруст бошад.
Даври while дар амал
Аз даври while барои шумориши пайдарпайи ададҳо истифода бурдан мумкин аст. Масалан, даври зерин аз 1 то 5 мешуморад.
counting.py
current_number = 1
while current_number <= 5:
print(current_number)
current_number += 1
Дар сатри аввал ба current_number қимати 1 медиҳем ва шуморишро аз як оғоз мекунем.
Баъдан даври while тавре танзим шудааст, ки то вақте қимати current_number аз 5 хурд ё ба он баробар аст, иҷро шавад. Коди дохили давр қимати current_number-ро чоп мекунад ва сипас бо дастури current_number += 1 ба он як воҳид илова менамояд.
Оператори += шакли кӯтоҳи дастури зерин аст:
current_number = current_number + 1
Python даврро то замоне такрор мекунад, ки шарти current_number <= 5 дуруст бошад. Азбаски 1 аз 5 хурд аст, Python 1-ро чоп мекунад ва баъдан ба он як воҳид илова мекунад. Ҳамин тавр, адади ҷорӣ 2 мешавад.
Азбаски 2 низ аз 5 хурд аст, Python онро чоп карда, боз як воҳид илова мекунад. Адади ҷорӣ 3 мешавад ва ин раванд идома меёбад.
Вақте ки қимати current_number аз 5 зиёд мешавад, давр қатъ мегардад ва барнома ба охир мерасад:
1
2
3
4
5
Барномаҳое, ки ҳар рӯз истифода мебаред, эҳтимол даврҳои while доранд. Масалан, бозӣ ба чунин давр ниёз дорад, то вақте ки мехоҳед бозӣ кунед, корашро идома диҳад ва баробари дархости баромадан қатъ шавад.
Агар барномаҳо пеш аз хоҳиши мо қатъ мешуданд ё баъд аз хоҳиши баромадан ҳам корашонро идома медоданд, истифодаашон хушоянд намебуд. Аз ин рӯ, даврҳои while хеле муфиданд.
Ба корбар додани имкони интихоби вақти баромадан
Мо метавонем қисми асосии барномаи parrot.py-ро дар дохили даври while ҷой диҳем, то он то вақте корбар мехоҳад, кор кунад.
Барои баромадан қимати махсусеро муайян мекунем ва барнома то замоне корашро идома медиҳад, ки корбар он қиматро ворид накардааст.
parrot.py
prompt = "\nЧизе бигӯед, ман онро такрор мекунам:"
prompt += "\nБарои анҷом додани барнома 'quit'-ро ворид кунед. "
message = ""
while message != 'quit':
message = input(prompt)
print(message)
Аввал матни дархостеро муайян мекунем, ки ду имкони корбарро мефаҳмонад: ворид кардани паём ё ворид кардани қимати баромадан — дар ин ҷо 'quit'.
Сипас тағйирёбандаи message-ро месозем, то қимати воридкардаи корбарро нигоҳ дорад. Ба message сатри холии "" медиҳем, то Python ҳангоми бори аввал расидан ба сатри while қимате барои санҷидан дошта бошад.
Ҳангоми оғози барнома Python бояд қимати message-ро бо 'quit' муқоиса кунад, аммо корбар ҳанӯз чизе ворид накардааст. Агар тағйирёбанда қимати муайян надошта бошад, барнома корашро идома дода наметавонад.
Барои ҳалли ин мушкил ба message қимати ибтидоӣ медиҳем. Гарчанде он танҳо сатри холӣ аст, Python метавонад онро муқоиса кунад ва даври while-ро оғоз намояд.
Ин давр то замоне иҷро мешавад, ки қимати message ба 'quit' баробар набошад.
Дар гузариши аввал message сатри холӣ аст, бинобар ин Python ба дохили давр медарояд. Дар сатри message = input(prompt) матни дархост нишон дода мешавад ва Python мунтазири маълумоти корбар мемонад.
Ҳар чизе, ки корбар ворид мекунад, ба message нисбат дода шуда, чоп мешавад. Баъдан Python шарти while-ро дубора месанҷад.
То вақте корбар калимаи 'quit'-ро ворид накардааст, дархост боз нишон дода мешавад ва Python маълумоти навро интизор мешавад. Вақте корбар 'quit'-ро ворид мекунад, Python иҷрои даврро қатъ менамояд ва барнома ба охир мерасад:
Чизе бигӯед, ман онро такрор мекунам:
Барои анҷом додани барнома 'quit'-ро ворид кунед. Салом ба ҳама!
Салом ба ҳама!
Чизе бигӯед, ман онро такрор мекунам:
Барои анҷом додани барнома 'quit'-ро ворид кунед. Боз салом.
Боз салом.
Чизе бигӯед, ман онро такрор мекунам:
Барои анҷом додани барнома 'quit'-ро ворид кунед. quit
quit
Барнома хуб кор мекунад, аммо калимаи 'quit'-ро ҳам мисли паёми одӣ чоп мекунад. Инро бо як санҷиши содаи if ислоҳ кардан мумкин аст:
prompt = "\nЧизе бигӯед, ман онро такрор мекунам:"
prompt += "\nБарои анҷом додани барнома 'quit'-ро ворид кунед. "
message = ""
while message != 'quit':
message = input(prompt)
if message != 'quit':
print(message)
Акнун барнома пеш аз нишон додани паём онро месанҷад ва танҳо вақте чоп мекунад, ки ба қимати баромадан баробар набошад:
Чизе бигӯед, ман онро такрор мекунам:
Барои анҷом додани барнома 'quit'-ро ворид кунед. Салом ба ҳама!
Салом ба ҳама!
Чизе бигӯед, ман онро такрор мекунам:
Барои анҷом додани барнома 'quit'-ро ворид кунед. Боз салом.
Боз салом.
Чизе бигӯед, ман онро такрор мекунам:
Барои анҷом додани барнома 'quit'-ро ворид кунед. quit
Истифодаи парчам — flag
Дар мисоли пешина барнома то вақте шарти муайян дуруст буд, вазифаҳояшро иҷро мекард. Аммо дар барномаҳои мураккабтар, ки ҳодисаҳои гуногун метавонанд сабаби қатъ шудани кор гарданд, чӣ бояд кард?
Масалан, дар бозӣ якчанд ҳодиса метавонад онро ба охир расонад: киштиҳои бозигар тамом мешаванд, вақт ба охир мерасад ё ҳамаи шаҳрҳое, ки бояд муҳофизат мешуданд, нобуд мегарданд.
Бозӣ бояд ҳангоми рӯй додани ҳар яке аз ин ҳодисаҳо қатъ шавад. Агар сабабҳои эҳтимолии қатъ шудани барнома зиёд бошанд, санҷидани ҳамаи онҳо дар як дастури while мураккаб ва душвор мегардад.
Барои барномае, ки идома ёфтани кораш ба чанд шарт вобаста аст, метавонед як тағйирёбанда муайян кунед, ки фаъол ё ғайрифаъол будани тамоми барномаро нишон диҳад.
Ин тағйирёбандаро парчам ё flag меноманд. Он барои барнома ҳамчун аломат хизмат мекунад.
Барномаро метавон тавре навишт, ки то вақте парчам True аст, кор кунад ва ҳангоми ба False табдил ёфтани он аз сабаби яке аз ҳодисаҳо қатъ шавад.
Дар натиҷа, дастури асосии while танҳо як шартро месанҷад: оё қимати ҷории парчам True аст? Санҷишҳои дигарро, ки муайян мекунанд кай парчам бояд False шавад, метавон дар қисмҳои дигари барнома ҷой дод.
Биёед ба барномаи parrot.py парчам илова кунем. Мо онро active меномем, ҳарчанд шумо метавонед номи дигар интихоб кунед. Ин парчам муайян мекунад, ки барнома корашро идома диҳад ё не.
prompt = "\nЧизе бигӯед, ман онро такрор мекунам:"
prompt += "\nБарои анҷом додани барнома 'quit'-ро ворид кунед. "
active = True
while active:
message = input(prompt)
if message == 'quit':
active = False
else:
print(message)
Ба тағйирёбандаи active қимати True медиҳем, то барнома дар ҳолати фаъол оғоз шавад. Ин дастури while-ро сода мекунад, зеро дар худи он дигар муқоисаи ҷудогона навишта намешавад; мантиқи муайян кардани ҳолати фаъол дар қисмҳои дигари барнома ҷойгир аст.
То вақте active қимати True дорад, давр иҷро мешавад.
Дар дастури if, ки дохили даври while ҷойгир аст, қимати message-ро пас аз ворид кардани маълумот месанҷем.
Агар корбар 'quit'-ро ворид кунад, ба active қимати False медиҳем ва даври while қатъ мешавад. Агар корбар чизи дигаре ворид кунад, онро ҳамчун паём чоп мекунем.
Натиҷаи ин барнома бо мисоли пешина, ки шарт мустақиман дар while навишта шуда буд, яксон аст. Аммо акнун парчаме дорем, ки ҳолати умумии барномаро нишон медиҳад. Аз ин рӯ, илова кардани санҷишҳои дигар, масалан дастурҳои elif, барои ҳодисаҳое, ки бояд active-ро False кунанд, осон мешавад.
Ин дар барномаҳои мураккаб, монанди бозиҳо, муфид аст. Дар онҳо ҳодисаҳои гуногун метавонанд сабаби анҷоми барнома шаванд.
Вақте яке аз ин ҳодисаҳо парчами active-ро False мекунад, даври асосии бозӣ қатъ мешавад. Баъд метавон паёми «Бозӣ ба охир расид»-ро нишон дод ва ба бозигар имкони аз нав оғоз карданро пешниҳод намуд.
Истифодаи break барои баромадан аз давр
Барои фавран баромадан аз даври while, бе иҷро кардани қисми боқимондаи коди дохили он ва новобаста аз натиҷаи санҷишҳои шартӣ, аз дастури break истифода баред.
Дастури break ҷараёни иҷрои барномаро идора мекунад. Бо он метавонед муайян кунед, ки кадом сатрҳои код иҷро шаванд ва кадомашон иҷро нашаванд.
Масалан, барномаеро дида мебароем, ки аз корбар дар бораи шаҳрҳои диданкардааш мепурсад. Дар ин барнома метавон баробари ворид шудани 'quit' бо истифодаи break даври while-ро қатъ кард.
cities.py
prompt = "\nЛутфан, номи шаҳреро, ки дидан кардаед, ворид кунед:"
prompt += "\n(Вақте ки анҷом додед, 'quit'-ро ворид кунед.) "
while True:
city = input(prompt)
if city == 'quit':
break
else:
print(f"Ман ҳам мехоҳам ба {city.title()} равам!")
Давре, ки бо while True оғоз мешавад, то расидан ба дастури break беохир иҷро мешавад.
Даври ин барнома пайваста аз корбар номи шаҳрҳои диданкардаашро мепурсад, то он даме ки ӯ 'quit'-ро ворид кунад. Ҳангоми ворид шудани 'quit' дастури break иҷро мешавад ва Python аз давр мебарояд:
Лутфан, номи шаҳреро, ки дидан кардаед, ворид кунед:
(Вақте ки анҷом додед, 'quit'-ро ворид кунед.) Ню-Йорк
Ман ҳам мехоҳам ба Ню-Йорк равам!
Лутфан, номи шаҳреро, ки дидан кардаед, ворид кунед:
(Вақте ки анҷом додед, 'quit'-ро ворид кунед.) Сан-Франсиско
Ман ҳам мехоҳам ба Сан-Франсиско равам!
Лутфан, номи шаҳреро, ки дидан кардаед, ворид кунед:
(Вақте ки анҷом додед, 'quit'-ро ворид кунед.) quit
Эзоҳ: Дастури break-ро дар ҳар гуна даври Python истифода бурдан мумкин аст. Масалан, метавонед бо он аз даври for, ки унсурҳои рӯйхат ё луғатро мегузарад, бароед.
Истифодаи continue дар давр
Агар нахоҳед пурра аз давр бароед, балки хоҳед вобаста ба натиҷаи санҷиши шартӣ қисми боқимондаи гузариши ҷориро гузаронида, ба оғози давр баргардед, аз дастури continue истифода баред.
Масалан, даври зерин аз 1 то 10 мешуморад, аммо танҳо ададҳои тоқро чоп мекунад.
counting.py
current_number = 0
while current_number < 10:
current_number += 1
if current_number % 2 == 0:
continue
print(current_number)
Аввал ба current_number қимати 0 медиҳем. Азбаски он аз 10 хурд аст, Python ба даври while медарояд.
Дар дохили давр ба қимати ҷорӣ як воҳид илова мекунем ва current_number ба 1 баробар мешавад.
Сипас дастури if бақияи тақсими current_number-ро ба 2 месанҷад. Агар бақия 0 бошад, яъне адад ба 2 бебақия тақсим шавад, дастури continue ба Python мегӯяд, ки қисми боқимондаи ин гузаришро иҷро накарда, ба оғози давр баргардад.
Агар адади ҷорӣ ба 2 бебақия тақсим нашавад, қисми боқимондаи давр иҷро мешавад ва Python онро чоп мекунад:
1
3
5
7
9
Пешгирии даврҳои беохир
Ҳар даври while бояд роҳи қатъ шудан дошта бошад, то беохир идома наёбад. Масалан, даври зерин бояд аз 1 то 5 шуморад.
counting.py
x = 1
while x <= 5:
print(x)
x += 1
Аммо агар тасодуфан сатри x += 1-ро фаромӯш кунед, давр беохир иҷро мешавад:
# Ин давр беохир иҷро мешавад!
x = 1
while x <= 5:
print(x)
Акнун қимати x аз 1 оғоз мешавад, аммо ҳеҷ гоҳ тағйир намеёбад. Дар натиҷа, шарти x <= 5 ҳамеша True мешавад ва даври while беохир рақами 1-ро чоп мекунад:
1
1
1
1
...
Ҳар барномасоз гоҳ-гоҳ тасодуфан даври беохири while менависад, махсусан вақте шартҳои баромадан аз давр нозук ё мураккабанд.
Агар барномаатон дар даври беохир дармонад, Ctrl+C-ро пахш кунед ё равзанаи терминалеро, ки натиҷаи барномаро нишон медиҳад, пӯшед.
Барои пешгирии даврҳои беохир ҳар даври while-ро санҷед ва боварӣ ҳосил кунед, ки он дар вақти пешбинишуда қатъ мешавад.
Агар хоҳед, ки барнома ҳангоми ворид кардани қимати муайян ба охир расад, онро иҷро карда, ҳамон қиматро ворид кунед. Агар барнома қатъ нашавад, тарзи коркарди қимати баромаданро бодиққат санҷед.
Боварӣ ҳосил кунед, ки ҳадди ақал як қисми барнома метавонад шарти даврро False кунад ё ба иҷрои дастури break расонад.
Эзоҳ: VS Code, мисли бисёр муҳаррирҳои дигар, натиҷаро дар терминали дохилии худ нишон медиҳад. Барои қатъ кардани даври беохир пеш аз пахш кардани Ctrl+C аввал дар дохили майдони терминал клик кунед.
Худатон бисанҷед
7-4. Иловаҳои питса: Давре нависед, ки аз корбар пайдарпай номҳои иловаҳои питсаро пурсад ва то ворид шудани 'quit' идома ёбад. Ҳангоми ворид кардани ҳар илова паёме чоп кунед, ки онро ба питсаи корбар илова мекунед.
7-5. Чиптаҳои кино: Нархи чиптаи кино вобаста ба синни шахс фарқ мекунад:
- Барои кӯдакони то 3-сола чипта ройгон аст.
- Барои шахсони аз 3 то 12-сола чипта 10 доллар аст.
- Барои шахсони аз 12-сола боло чипта 15 доллар аст.
Давре нависед, ки синни корбаронро пурсад ва сипас нархи чиптаашонро хабар диҳад.
7-6. Се роҳи баромадан: Барои яке аз машқҳои 7-4 ё 7-5 чанд нусхаи барнома нависед, то ҳар яке аз усулҳои зеринро ҳадди ақал як бор истифода баред:
- Истифодаи санҷиши шартӣ дар дастури
whileбарои қатъ кардани давр. - Истифодаи тағйирёбандаи
activeбарои идора кардани давомнокии давр. - Истифодаи дастури
breakбарои баромадан аз давр ҳангоми ворид шудани'quit'.
7-7. Беохирӣ: Давре нависед, ки ҳеҷ гоҳ қатъ намешавад ва онро иҷро кунед. Барои қатъ кардани давр Ctrl+C-ро пахш кунед ё равзанаи нишондиҳандаи натиҷаро пӯшед.
Истифодаи даври while бо рӯйхатҳо ва луғатҳо
То ин ҷо мо ҳар дафъа танҳо бо як маълумоти корбар кор мекардем. Маълумотро мегирифтем ва сипас худи он ё ҷавоби мувофиқро чоп мекардем.
Дар гузариши навбатии даври while қимати дигареро гирифта, ба он ҷавоб медодем. Аммо барои нигоҳ доштани маълумоти корбарони зиёд ва чандин қимат бояд рӯйхатҳо ва луғатҳоро бо даврҳои while истифода барем.
Даври for барои гузаштан аз рӯйхат самаранок аст, аммо ҳангоми гузаштан аз рӯйхат бо ин давр набояд таркиби онро тағйир диҳед, зеро пайгирии унсурҳо метавонад халалдор шавад.
Барои тағйир додани рӯйхат ҳангоми кор бо унсурҳои он аз даври while истифода баред.
Истифодаи даврҳои while бо рӯйхатҳо ва луғатҳо имкон медиҳад, ки маълумоти зиёдеро ҷамъоварӣ, нигоҳдорӣ ва тартиб диҳед, то баъдтар онро таҳлил карда, натиҷаашро нишон диҳед.
Гузаронидани унсурҳо аз як рӯйхат ба рӯйхати дигар
Рӯйхати корбарони навсабтиномшудаи вебсайтеро тасаввур кунед, ки ҳанӯз тасдиқ нашудаанд. Пас аз тасдиқи онҳо чӣ гуна метавонем номҳояшонро ба рӯйхати ҷудогонаи корбарони тасдиқшуда гузаронем?
Яке аз роҳҳо истифодаи даври while мебошад: ҳангоми тасдиқи ҳар корбар ӯро аз рӯйхати корбарони тасдиқнашуда мегирем ва ба рӯйхати корбарони тасдиқшуда илова мекунем.
Коди чунин барнома метавонад ин гуна бошад.
confirmed_users.py
# Аз рӯйхати корбарони ниёзманд ба тасдиқ оғоз мекунем.
# Барои корбарони тасдиқшуда рӯйхати холӣ месозем.
unconfirmed_users = ['alice', 'brian', 'candace']
confirmed_users = []
# То боқӣ намондани корбарони тасдиқнашуда ҳар корбарро месанҷем.
# Ҳар корбари тасдиқшударо ба рӯйхати мувофиқ мегузаронем.
while unconfirmed_users:
current_user = unconfirmed_users.pop()
print(f"Тасдиқи корбар: {current_user.title()}")
confirmed_users.append(current_user)
# Ҳамаи корбарони тасдиқшударо нишон медиҳем.
print("\nКорбарони зерин тасдиқ шуданд:")
for confirmed_user in confirmed_users:
print(confirmed_user.title())
Мо аз рӯйхати корбарони тасдиқнашуда — Alice, Brian ва Candace — ва рӯйхати холӣ барои корбарони тасдиқшуда оғоз мекунем.
Даври while то замоне иҷро мешавад, ки рӯйхати unconfirmed_users холӣ набошад.
Дар дохили давр методи pop() корбарони тасдиқнашударо як-як аз охири рӯйхати unconfirmed_users хориҷ мекунад.
Азбаски Candace унсури охирини рӯйхат аст, номи ӯ аввал хориҷ шуда, ба current_user нисбат дода мешавад ва сипас ба рӯйхати confirmed_users илова мегардад. Баъд навбати Brian ва сипас Alice мерасад.
Мо раванди тасдиқи ҳар корбарро бо чоп кардани паёми тасдиқ ва илова кардани ӯ ба рӯйхати корбарони тасдиқшуда тақлид мекунем.
Ҳар қадар рӯйхати корбарони тасдиқнашуда кӯтоҳ шавад, рӯйхати корбарони тасдиқшуда дарозтар мегардад.
Вақте рӯйхати корбарони тасдиқнашуда холӣ мешавад, давр қатъ мегардад ва рӯйхати корбарони тасдиқшуда чоп мешавад:
Тасдиқи корбар: Candace
Тасдиқи корбар: Brian
Тасдиқи корбар: Alice
Корбарони зерин тасдиқ шуданд:
Candace
Brian
Alice
Нест кардани ҳамаи такрорҳои қимати муайян аз рӯйхат
Дар боби 3 мо барои нест кардани қимати муайян аз рӯйхат аз remove() истифода бурдем. Ин метод вазифаи моро иҷро мекард, зеро қимати мавриди назар дар рӯйхат танҳо як бор мавҷуд буд.
Аммо агар хоҳед ҳамаи такрорҳои як қиматро аз рӯйхат нест кунед, чӣ бояд кард?
Фарз мекунем, рӯйхати ҳайвоноти хонагӣ доред, ки қимати 'cat' дар он чанд бор такрор шудааст. Барои нест кардани ҳамаи такрорҳои ин қимат метавонед даври while-ро то замоне иҷро кунед, ки 'cat' дигар дар рӯйхат набошад.
pets.py
pets = ['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
print(pets)
while 'cat' in pets:
pets.remove('cat')
print(pets)
Мо аз рӯйхате оғоз мекунем, ки дар он 'cat' чанд бор мавҷуд аст.
Пас аз чоп кардани рӯйхат Python ба даври while медарояд, зеро қимати 'cat' ҳадди ақал як бор дар рӯйхат мавҷуд аст.
Дар дохили давр Python аввалин қимати 'cat'-ро нест мекунад ва ба сатри while бармегардад. Агар 'cat' ҳанӯз дар рӯйхат бошад, боз ба давр медарояд.
Ин раванд то замоне идома меёбад, ки ҳамаи такрорҳои 'cat' нест шаванд. Сипас Python аз давр баромада, рӯйхатро дубора чоп мекунад:
['dog', 'cat', 'dog', 'goldfish', 'cat', 'rabbit', 'cat']
['dog', 'dog', 'goldfish', 'rabbit']
Пур кардани луғат бо маълумоти воридкардаи корбар
Дар ҳар гузариши даври while метавонед ба қадри зарурат аз корбар маълумот пурсед.
Биёед барномаи пурсишнома созем, ки дар ҳар гузариши давр ном ва ҷавоби иштирокчиро мепурсад.
Маълумоти ҷамъоваришударо дар луғат нигоҳ медорем, зеро мехоҳем ҳар ҷавобро бо корбари муайян пайваст кунем.
mountain_poll.py
responses = {}
# Парчамеро муайян мекунем, ки фаъол будани пурсишро нишон медиҳад.
polling_active = True
while polling_active:
# Ном ва ҷавоби иштирокчиро мепурсем.
name = input("\nНоми шумо чист? ")
response = input("Мехоҳед рӯзе ба кадом кӯҳ бароед? ")
# Ҷавобро дар луғат нигоҳ медорем.
responses[name] = response
# Мепурсем, ки оё шахси дигар ҳам дар пурсиш иштирок мекунад.
repeat = input(
"Мехоҳед шахси дигар ҳам ҷавоб диҳад? (yes/no) "
)
if repeat == 'no':
polling_active = False
# Пурсиш ба охир расид. Натиҷаҳоро нишон медиҳем.
print("\n--- Натиҷаҳои пурсиш ---")
for name, response in responses.items():
print(f"{name} мехоҳад ба кӯҳи {response} барояд.")
Барнома аввал луғати холии responses-ро месозад ва ба парчами polling_active қимат медиҳад, то фаъол будани пурсишро нишон диҳад.
То вақте polling_active қимати True дорад, Python коди дохили даври while-ро иҷро мекунад.
Дар дохили давр аз корбар номаш ва кӯҳеро мепурсем, ки мехоҳад ба он барояд. Ин маълумот дар луғати responses нигоҳ дошта мешавад. Баъдан аз корбар пурсида мешавад, ки пурсиш идома ёбад ё не.
Агар ӯ yes ворид кунад, барнома боз ба даври while медарояд.
Агар no ворид кунад, парчами polling_active ба False табдил меёбад, даври while қатъ мешавад ва блоки охирини код натиҷаҳои пурсишро нишон медиҳад.
Агар барномаро иҷро карда, ҷавобҳои намунавӣ ворид кунед, натиҷа тақрибан чунин мешавад:
Номи шумо чист? Эрик
Мехоҳед рӯзе ба кадом кӯҳ бароед? Деналӣ
Мехоҳед шахси дигар ҳам ҷавоб диҳад? (yes/no) yes
Номи шумо чист? Линн
Мехоҳед рӯзе ба кадом кӯҳ бароед? Девилс-Тамб
Мехоҳед шахси дигар ҳам ҷавоб диҳад? (yes/no) no
--- Натиҷаҳои пурсиш ---
Эрик мехоҳад ба кӯҳи Деналӣ барояд.
Линн мехоҳад ба кӯҳи Девилс-Тамб барояд.
Худатон бисанҷед
7-8. Дӯкони сандвич: Рӯйхате бо номи sandwich_orders созед ва онро бо номҳои сандвичҳои гуногун пур кунед. Сипас рӯйхати холие бо номи finished_sandwiches созед.
Аз рӯйхати фармоишҳо гузаред ва барои ҳар фармоиш паёме чоп кунед, масалан: «Ман сандвичи шуморо бо моҳии тунец омода кардам».
Ҳангоми омода шудани ҳар сандвич онро ба рӯйхати сандвичҳои тайёр гузаронед. Пас аз омода шудани ҳамаи онҳо паёме чоп кунед, ки номи ҳар сандвичи тайёршударо нишон диҳад.
7-9. Пастрами нест: Аз рӯйхати sandwich_orders-и машқи 7-8 истифода баред ва боварӣ ҳосил кунед, ки сандвичи 'pastrami' дар он ҳадди ақал се бор мавҷуд аст.
Дар наздикии оғози барнома коде илова кунед, ки паёми «Дар дӯкон пастрами тамом шудааст»-ро чоп кунад. Сипас бо даври while ҳамаи такрорҳои 'pastrami'-ро аз sandwich_orders нест кунед.
Боварӣ ҳосил кунед, ки ягон сандвичи пастрами ба рӯйхати finished_sandwiches намеафтад.
7-10. Таътили орзуӣ: Барномае нависед, ки аз корбарон дар бораи таътили орзуиашон пурсиш гузаронад.
Матни дархост метавонад чунин бошад: «Агар метавонистед ба як ҷойи дилхоҳи ҷаҳон сафар кунед, ба куҷо мерафтед?»
Блоки кодеро низ илова кунед, ки натиҷаҳои пурсишро чоп кунад.
Хулоса
Дар ин боб шумо омӯхтед, ки чӣ гуна бо истифодаи input() ба корбарон имкони ворид кардани маълумоти худро ба барнома диҳед.
Шумо кор бо маълумоти матнӣ ва ададиро омӯхтед ва фаҳмидед, ки чӣ гуна бо даврҳои while барномаро то вақте корбар мехоҳад, фаъол нигоҳ доред.
Ҳамчунин чанд роҳи идора кардани ҷараёни даври while-ро дидед: истифодаи парчами фаъолият, дастури break ва дастури continue.
Шумо омӯхтед, ки чӣ гуна бо даври while унсурҳоро аз як рӯйхат ба рӯйхати дигар гузаронед ва ҳамаи такрорҳои қимати муайянро аз рӯйхат нест кунед. Ҳамчунин фаҳмидед, ки даврҳои while-ро бо луғатҳо чӣ гуна истифода бурдан мумкин аст.
Дар боби 8 шумо бо функсияҳо шинос мешавед. Функсияҳо имкон медиҳанд, ки барномаро ба қисмҳои хурд тақсим кунед ва ҳар қисм як вазифаи муайянро иҷро намояд.
Шумо метавонед функсияро ҳар қадар хоҳед, даъват кунед ва функсияҳоятонро дар файлҳои ҷудогона нигоҳ доред.
Бо истифодаи функсияҳо метавонед коди самараноктаре нависед, ки ёфтани хатоҳояш ва нигоҳдориаш осонтар бошад ва онро дар барномаҳои гуногун дубора истифода баред.

Барномасозӣ
Олами Афсонаҳо
Ахбор
Саломатӣ
Дунё