x

Einloggen

Hast du noch keinen Account? Jetzt registrieren!

Імгненны хакінг

Гэта кароткае уводзіны ў мастацтва праграмавання, прыклады напісаны на мове праграмавання Python. (Калі вы ўжо ведаеце, як праграмаваць, але жадаю кароткія ўводзіны ў Python, вы можаце праверыць мой артыкул Імгненны Python.) Гэты артыкул быў перакладзена на італьянскі, польскі, японскі, сербскі, партугальскі, галандскі, і чэшская.

Гэта старонка не пра пранікненне чужыя сістэмы і г.д. кампутара я не прыхільнік такога роду рэчы, так што, калі ласка, не пішыце мне пра гэта.

Нататка: Каб атрымаць прыклады працуе належным чынам, пісаць праграмы ў тэкставы файл і затым запусціць, што з перакладнікам, не спрабуйце запусціць іх непасрэдна ў інтэрактыўным перакладніка - не ўсё з іх будуць працаваць. (Калі ласка, не пытайце мяне пра падрабязнасці па гэтым пытанні. Праверце дакументацыю ці адправіць па электроннай пошце help@python.org).

Навакольнае асяроддзе


Для праграмавання ў Python, вы павінны мець перакладніка ўсталяваны. Яна існуе для большасці платформаў (у тым ліку Macintosh, Unix і Windows). Падрабязней пра гэта можна знайсці на вэб-сайце Python. Вы таксама павінны мець у тэкставым рэдактары (напрыклад, Emacs, нататнік ці нешта падобнае).

Што такое праграмаванне?


Праграмаванне кампутарных сродкаў надаючы яму набор інструкцый, кажу ёй, што рабіць. Кампутарная праграма шмат у чым нагадвае рэцэпты, накшталт тых, якую мы выкарыстоўваем для падрыхтоўкі ежы. Напрыклад, [1]:

Fiesta SPAM Salad
Ingredients:
Marinade:
1/4 cup lime juice
1/4 cup low-sodium soy sauce
1/4 cup water
1 tablespoon vegetable oil
3/4 teaspoon cumin
1/2 teaspoon oregano
1/4 teaspoon hot pepper sauce
2 cloves garlic, minced
Salad:
1 (12-ounce) can SPAM Less Sodium luncheon meat,
cut into strips
1 onion, sliced
1 bell pepper, cut in strips
Lettuce
12 cherry tomatoes, halved
Instructions:
In jar with tight-fitting lid, combine all marinade ingredients;
shake well. Place SPAM strips in plastic bag. Pour marinade
over SPAM. Seal bag; marinate 30 minutes in refrigerator.
Remove SPAM from bag; reserve 2 tablespoons marinade. Heat
reserved marinade in large skillet. Add SPAM, onion, and
green pepper. Cook 3 to 4 minutes or until SPAM is heated.
Line 4 individual salad plates with lettuce. Spoon hot salad
mixture over lettuce. Garnish with tomato halves. Serves 4.

Вядома, ніводны кампутар не зразумее гэтага ... І самае кампутары не змогуць зрабіць салату, нават калі яны і не зразумела рэцэпт. Так што ж нам трэба зрабіць, каб зрабіць гэта больш кампутарнага асяроддзя? Ну - галоўным чынам дзве рэчы. У нас (1), казаць так, што кампутар можа зразумець, і (2) казаць пра тое, што ён можа рабіць штосьці.

Першая кропка азначае, што мы павінны выкарыстоўваць мова - гэта мова праграмавання, што ў нас ёсць перакладнік праграмы, а другой кропцы азначае, што мы не можам чакаць, што кампутар, каб салата - але мы можам чакаць ад яе дадаць нумары пісаць рэчы на экране т.д.

Hello ...


Там у традыцыю праграмавання навучалыя праграмы, каб заўсёды пачынаць з праграмы, якая друкуе "Hello, World!" На экране. У мове Python, гэта вельмі проста:

 print "Hello, world!"

Гэта, галоўным чынам, як рэцэпт вышэй (хоць яна нашмат карацей!). Ён кажа кампутару, што рабіць: Для друку "Прывітанне, свет!". Кавалак торта. Што рабіць, калі мы жадаем, каб рабіць больш рэчаў?

 print "Hello, world!" print "Goodbye, world!"

Не нашмат складаней, праўда? І не вельмі цікава ... Мы жадаем, каб мець магчымасць зрабіць штосьці з інгрэдыентамі, як і ў спам-салата. Ну - што інгрэдыенты ў нас ёсць? Па-першае, у нас ёсць радкі тэксту, як "Hello, world!" , але ў нас ёсць лічбы. Скажам, мы жадалі, каб кампутар для вылічэння пляца прастакутніка для нас. Тады мы маглі б даць яму трохі наступныя рэцэпты:

# The Area of a Rectangle
# Ingredients:
width = 20
height = 30
# Instructions:
area = width*height
print area

Вы, верагодна, убачыць падабенства (хоць і малаважны), каб рэцэпт салаты са спамам. Але як гэта працуе? Па-першае, радкі, якія пачынаюцца з # завуцца каментары і фактычна ігнаруецца на кампутары. Аднак, уставіўшы невялікі тлумачэнні, як гэта можа быць важна пры прыняцці сваіх праграм больш чытэльным для чалавека.

Зараз, ліній, якія выглядаюць як foo = bar завецца заданняў. У выпадку width = 20 мы распавядзем кампутар, шырыня павінна быць 20 з гэтага моманту. Што гэта значыць, што "шырыня 20"? Гэта азначае, што зменнай пад назвай "шырыні" ствараецца (ці, калі яно ўжо існуе, то ён паўторна) і прысвойваецца значэнне 20. Такім чынам, калі мы выкарыстоўваны зменную праз кампутар ведае яе кошт. Такім чынам,

width*height

галоўным чынам жа, як і

20*30

які разлічваецца як 600, які затым прысвойваецца зменнай пад назвай "раёна". У заключнай заяве праграма выводзіць на экран значэнне зменнай "пляц", так што вы бачыце, калі вы запусціце гэту праграму проста

600

Нататка: У некаторых Мовы трэба сказаць кампутару, якія зменныя трэба напачатку праграмы (напрыклад, інгрэдыенты салаты) - Python досыць разумны, каб зразумець гэта па ходзе.

Зваротная сувязь


OK. Зараз вы можаце выконваць простыя, і нават даволі складаных вылічэнняў. Напрыклад, вам можа спатрэбіцца, каб зрабіць праграму для вылічэння пляца круга, а не прастакутніка:

radius = 30
print radius*radius*3.14

Тым не менш, гэта не істотна цікавейшае, чым прастакутнік праграмы. Прынамсі, на мой погляд. Гэта даволі нягнуткімі. Што рабіць, калі круг мы глядзім мелі радыус 31? Як бы ведаць кампутар? Гэта трохі падобна на частку салата рэцэпт, які кажа: "Кухар 3 да 4 мінуць, ці пакуль не СПАМ награваецца." Каб ведаць, калі ён рыхтуецца, мы павінны праверыць. Нам патрэбна зваротная сувязь, ці уводу. Як ведаць кампутар ад нашага круга? Яна таксама мае патрэбу ва ўваходных ... Што мы можам зрабіць, гэта сказаць яму, каб праверыць радыус:

radius = input("What is the radius?")
print radius*radius*3.14

Зараз усё становіцца шыкоўны ... input -тое завецца функцыяй. (Вы пазнаяце, як стварыць свой уласны праз некаторы час. input з'яўляецца функцыяй, якая ўбудавана ў мову Python.) Проста пісьмовай

input

будзе не занадта шмат ... Вы павінны пакласці пару дужках у канцы яго. Так input() будзе працаваць - гэта было б проста пачакаць, пакуль карыстачу ўвесці радыус. Версія вышэй, магчыма, трохі зручнейшым для карыстачоў, але, паколькі яна выводзіць пытанне першым. Калі мы штосьці накшталт пытанне-струны "Які радыус?" У дужках выкліку функцыі яна завецца мінанні параметру функцыі. Рэч (ці рэчы), у дужках (ці) параметру (ов). У гэтым выпадку мы перадаём пытанне ў якасці параметру, з тым каб input ведае, што трэба раздрукаваць да атрымання адказу ад карыстача.

Але як атрымаць адказ на radius зменнай? Функцыі input , пры выкліку, вяртае значэнне (як і шматлікія іншыя функцыі). Вы не павінны выкарыстоўваць гэта значэнне, але ў нашым выпадку, мы жадаем. Такім чынам, наступныя два аператара маюць розныя значэнні:

foo = input
bar = input()

foo зараз утрымоўвае функцыі ўводу сама па сабе (так што сапраўды можа быць скарыстаны як foo("What is your age?") , гэта завецца дынамічны выклік функцыі), а bar утрымоўвае ўсё, што набрана карыстачом.

Flow


Зараз мы можам пісаць праграмы, якія выконваюць простыя дзеянні (арыфметыка і друк) і якія могуць атрымліваць дадзеныя, якія ўводзяцца карыстачом. Гэта карысна, але мы ўсё яшчэ абмежаваны ў так званых паслядоўнага выканання каманд, гэта значыць - яны павінны быць выкананы ва ўсталяваным парадку. Большасць рэцэпт салаты спам паслядоўнага ці лінейнага падобнае. Але што, калі мы жадаем распавесці кампутара, як праверыць на прыгатаваныя спам? Калі яна награваецца, то яна павінна быць выдалена з печы - у адваротным выпадку, яна павінна рыхтаваць яшчэ хвіліну ці каля таго. Як мы можам выказаць гэта?

Тое, што мы жадаем зрабіць, гэта каб кантраляваць струмень праграмы. Яна можа пайсці па двух кірунках - або браць спам, ці пакінуць яго ў духоўцы. Мы можам выбіраць, і умова ці няма, што ён правільна падагрэвам. Гэта завецца умоўным выкананні. Мы можам зрабіць гэта наступным чынам:

temperature = input("What is the temperature of the spam?")
if temperature > 50:
print "The salad is properly cooked."
else:
print "Cook the salad some more."

Сэнс гэтага павінна быць відавочна: калі тэмпература вышэй 50 (градусах па Цэльсіі), а затым раздрукаваць паведамленне, якое тлумачыць карыстачу, што яна правільна прыгатавана, у адваротным выпадку, сказаць карыстачу прыгатаваць салату яшчэ.

Нататка: водступы мае важнае значэнне для Python. Блокі ва ўмоўных аператарах (і завесы і функцыі вызначэння - гл. ніжэй) павінен мець водступ (водступ і тым жа колькасцю прабелаў; укладцы лічыцца 8 прастор), так што перакладнік можа сказаць, дзе яны пачынаюцца і сканчаюцца. Яна таксама робіць праграму больш чытаным для чалавека.

Давайце вернемся да нашых разлікаў вобласці. Вы бачыце, што гэта праграма?

# Area calculation program
print "Welcome to the Area calculation program"
print "---------------------------------------"
print
# Print out the menu:
print "Please select a shape:"
print "1 Rectangle"
print "2 Circle"
# Get the user's choice:
shape = input("> ")
# Calculate the area:
if shape == 1:
height = input("Please enter the height: ")
width = input("Please enter the width: ")
area = height*width
print "The area is", area
else:
radius = input("Please enter the radius: ")
area = 3.14*(radius**2)
print "The area is", area

Новыя рэчы у гэтым прыкладзе:

  1. print выкарыстоўвалі ўсяго iself выводзіць пусты радок
  2. == правярае дзве рэчы роўныя, у адрозненне ад = , які прысвойвае значэнне справа зменнай злева. Гэта важнае адрозненне!
  3. ** гэта улада аператара мовы Python - такім чынам, квадрат радыусу напісана radius**2 .
  4. print можа надрукаваць больш чым адну рэч. Проста падзеліце іх коскамі. (Яны будуць падзелены адзінкавымі прабеламі ў аб'ёме вытворчасці).

Праграма даволі простая: яна просіць нумар, які паведамляе яму, што карыстач жадае, каб вылічыць пляц прастакутніка ці круга. Затым ён выкарыстоўвае if -заява (умоўнае выкананне), каб вырашыць, які блок варта выкарыстоўваць для вылічэння пляца. Гэтыя два блока па істоце тыя ж, што выкарыстоўваліся ў папярэдніх прыкладах вобласці. Звернеце ўвагу, што каментары зрабіць код больш чытэльным. Кажуць, што першая запаведзь праграмавання: "Ты будзеш каментар!" У любым выпадку - гэта добрая звычка набываць.


Практыкаванне 1



Пашырэнне праграмы вышэй, уключыць вобласці разлікаў на пляцах, дзе карыстачу досыць увесці даўжыню адной з бакоў. Існуе адна рэч, якую вы павінны ведаць, каб зрабіць гэта: Калі ў вас ёсць больш за два выбару, вы можаце напісаць штосьці накшталт:

if foo == 1:
# Do something...
elif foo == 2:
# Do something else...
elif foo == 3:
# Do something completely different...
else:
# If all else fails...

Тут elif таямнічая код, які азначае "яшчэ, калі" :) . Так, калі foo з'яўляецца адзін, то штосьці зрабіць, у адваротным выпадку, калі foo два, потым што-небудзь іншае, і г.д. Вы можаце дадаць іншыя варыянты праграм таксама - як трыкутнікі ці адвольных шматкутнікаў. Гэта залежыць ад вас.

Цыклы


Паслядоўнае выкананне і ўмовамі з'яўляюцца толькі дзвюма з трох асноўных блокаў праграмавання. Трэці цыкл. У папярэдняй частцы я прапанаваў рашэнне для праверкі, калі спам быў з падагрэвам, але гэта было зусім відавочна недастаткова. Што рабіць, калі спам не быў скончаны ў наступны раз, мы праверылі, як? Як мы можам ведаць, колькі разоў нам трэба праверыць? Праўда, мы не маглі. І мы не павінны. Мы павінны мець магчымасць звяртацца да кампутара сочыце, пакуль не было зроблена. Як мы гэта які робіцца? Вы ўжо здагадаліся - мы выкарыстоўваем цыкл, ці паўторнага выканання.

Python мае два цыклу тыпу: а-завес і завес. Для завес, мабыць, самы просты. Напрыклад:

for food in "spam", "eggs", "tomatoes":
print "I love", food

Гэта азначае наступнае: Для кожнага элемента ў спісе "spam", "eggs", "tomatoes" , друк, што ты кахаеш яе. Блок усярэдзіне цыклу выконваецца адзін раз для кожнага элемента, і кожны раз, бягучага элемента прысвойваецца зменнай food (у дадзеным выпадку). Іншы прыклад:

for number in range(1,100):
print "Hello, world!"
print "Just", 100 - number, "more to go..."
print "Hello, world"
print "That was the last one... Phew!"

Функцыя range вяртае спіс лікаў у дыяпазоне дадзеных (у тым ліку першага, за выключэннем апошняга ... У гэтым выпадку [1 .. 99]). Такім чынам, перафразоўваючы гэта:


Утрыманне цыкл выконваецца для кожнага лікі ў дыяпазоне лікаў ад (улучна) да 1 (выключаючы) 100. (Што цела цыклу і пасля выступаў насамрэч рабіць гэта ў якасці практыкавання.)


Але гэта не рэальна дапамагчы нам з нашай праблемай падрыхтоўкі ежы. Калі мы жадаем праверыць спам 100 раз, тое было б вельмі прыгожае рашэнне, але мы не ведаем, калі гэта мала - ці, калі гэта занадта шмат. Мы проста жадаем, каб трымаць кантроль, хоць у ім не досыць гарачыя (ці, пакуль ён не будзе досыць гарачым - пытанне кропка-ў-выгляд). Такім чынам, мы выкарыстоўваем while :

# Spam-cooking program
# Fetch the function *sleep*
from time import sleep
print "Please start cooking the spam. (I'll be back in 3 minutes.)"
# Wait for 3 minutes (that is, 3*60 seconds)...
sleep(180)
print "I'm baaack :)"
# How hot is hot enough?
hot_enough = 50
temperature = input("How hot is the spam? ")
while temperature < hot_enough:
print "Not hot enough... Cook it a bit more..."
sleep(30)
temperature = input("OK. How hot is it now? ")
print "It's hot enough - You're done!"

Новыя рэчы у гэтым прыкладзе ...

  1. Некаторыя карысныя функцыі захоўваюцца ў модулях і могуць быць імпартаваны. У гэтым выпадку мы імпартуем функцыю sleep (які спіць на зададзены лік секунд) з модуля time , якое пастаўляецца з Python. (Гэта можна зрабіць свае ўласныя модулі таксама ...)

Практыкаванне 2



Напішыце праграму, якая ўвесь час чытае ў колькасці ад карыстача, і дадае іх разам, пакуль сума дасягае 100. Стварыць іншую праграму, якая счытвае нумары 100 ад карыстача і выводзіць суму.

Вялікія праграмы - Абстрактныя


Калі вы жадаеце агляд утрымання кнігі, вы не аруць усіх старонак - вы пагледзіце на ўтрыманне, ці не так? Ён проста пералічаны асноўныя тэмы гэтай кнігі. Зараз - прадставіць пісьмовы паваранай кнігі. Шматлікія рэцэпты, напрыклад, "Сметанковае спаму і макароны" і "Спам швейцарскіх Pie" могуць утрымоўваць падобныя рэчы, як спам, у дадзеным выпадку - пакуль вы не жадалі б паўтарыць, як зрабіць спам у кожным рэцэпце. (OK ... Значыць, вы насамрэч не робяць спам ... Але мядзведзь са мной, дзеля прыкладу :) ). Вы б паставіць рэцэпт для спаму ў асобную частку, а проста высылацца на яго ў іншых рэцэптах. Такім чынам - замест таго каб пісаць увесь рэцэпт кожных разоў, вы толькі павінны былі выкарыстоўваць імя часткі. У праграмаванні гэта завецца абстракцыяй.

Ці ёсць у нас запусціць у нешта падобнае ўжо? Yup. Замест таго, каб кампутар сапраўды, як атрымаць адказ ад карыстача (OK - таму мы не маглі гэта зрабіць ... Але мы не маглі зрабіць спам-або, так што ... :) ), мы проста выкарыстоўвалі input - функцыю. Мы можам рэальна зрабіць нашы ўласныя функцыі, для выкарыстання такога роду абстракцыі.

Скажам, мы жадаем, каб знайсці найвялікі цэлы лік, гэта значыць менш, чым зададзены дадатны лік. Напрыклад, з улікам ліку 2,7, гэта будзе 2. Гэта часта завецца "падлога" у зададзены лік. (Гэта сапраўды можа быць зроблена з убудаванай функцыяй Python int , але зноў жа, мядзведзь са мной ...) Як бы мы гэта зрабілі? Простае рашэнне было б паспрабаваць усе магчымасці ад нуля:

number = input("What is the number? ")
floor = 0
while floor <= number:
floor = floor+1
floor = floor-1
print "The floor of", number, "is", floor

Звернеце ўвагу, што цыкл сканчаецца, калі floor больш не менш (ці роўна) лікі, мы дадаць занадта шмат да яго. Таму мы павінны адняць адзін пасля. Што рабіць, калі мы жадаем выкарыстоўваць гэта "слова" рэч у складаныя матэматычныя выразы? Нам прыйшлося б напісаць цэлы цыкл за кожны нумар, які неабходна "падлога"-Ing. Не вельмі прыемна ... Вы, напэўна, здагадаліся, што мы будзем рабіць, замест: Пакладзяце ўсё гэта ў функцыі нашага назвай "слова":

def floor(number):
result = 0
while result <= number:
result = result+1
result = result-1
return result

Новыя рэчы у гэтым прыкладзе ...

  1. Функцыі вызначаюцца з дапамогай ключавога слова def , а затым сваё імя і чаканых параметраў у дужках.
  2. Калі функцыя вяртае значэнне, гэта робіцца з ключавымі return (якая таксама аўтаматычна спыняецца функцыі.

Зараз, калі мы вызначылі, мы можам выкарыстоўваць яго так:

x = 2.7
y = floor(2.7)

Пасля гэтага y павінен мець значэнне 2. Гэта таксама можна зрабіць функцыі з больш за адным параметрам:

def sum(x,y):
return x+y

Практыкаванне 3



Напішыце функцыю, якая рэалізуе метад Еўкліда для знаходжання агульнага ў два разу ліку. Вось як гэта працуе:

  1. У вас ёсць два нумары, а, б, дзе больш, чым Ь
  2. Вы паўтараеце да наступных бы звяртаецца ў нуль:
  3. змяняецца на значэнне Ь
  4. б змяняецца на рэштку, калі (да змен) падзяляецца на Ь (да змены)
  5. Затым вяртанне апошняга значэння

Рады:

  1. Выкарыстанне і б у якасці параметраў функцыі
  2. Проста выкажам здагадку, што больш, чым b
  3. Астатнія, калі x падзяляецца z разлічваецца шляхам выраза x % z
  4. Дзве зменныя могуць быць прызначаны адначасова наступным чынам: x, y = y, y+1 . Тут x даецца значэнне y (гэта значыць, значэнне y меў у сваім распараджэнні саступкі), а y павялічваецца на 1

Падрабязней пра функцыі


Як ажыццяўляць ісці? Цяжка было? Яшчэ трохі збянтэжыўся пра функцыі? Не перажывайце - у мяне не застаецца тэма зусім яшчэ.

Роды абстракцыі мы выкарыстоўвалі пры пабудове функцыі часта завуць працэдурнай абстракцыі, і шматлікія Мовы выкарыстоўваць слова працэдуры нароўні са словам функцыі. Насамрэч, гэтыя два паняцці розныя, але абодва яны завуць функцый у Python (бо яны вызначаюцца і выкарыстоўваюцца сапраўды гэтак жа, больш ці менш.)

Якая розніца (у іншых Мовы) паміж функцыямі і працэдурамі? Ну - як вы бачылі ў папярэдняй частцы, функцыі могуць вяртаць значэнне. Розніца складаецца ў тым, што працэдуры do not вяртае такое значэнне. У шматлікіх выпадках такі спосаб падзелу функцый на два тыпу - тыя, хто і тых, хто не вяртаюць значэнняў - могуць быць вельмі карысныя.

Функцыя, якая не вяртае значэнне ("парадак") выкарыстоўваецца ў якасці "падпраграмы" ці падпраграмы. Мы завём функцыю, а праграма робіць некаторыя рэчы, як зрабіць узбітымі сліўкамі ці любы іншы. Мы можам выкарыстоўваць гэту функцыю, у шматлікіх месцах без перапісвання кода. (Гэта завецца паўторнага выкарыстання кода - падрабязней пра гэта пазней.)

Карыснасць такой функцыі (ці працэдуры), ляжыць у яго пабочных эфектаў - ён змяняе сваё навакольнае асяроддзе (шляхам змешвання Шугер са смятанай і цвічэнні гэта, напрыклад ...) Давайце паглядзім на прыклад:

def hello(who):
print "Hello,", who
hello("world")
# Prints out "Hello, world"

Раздрукоўка матэрыял лічыцца пабочным эфектам, і так, што ўсё гэта робіць функцыя, яна цалкам тыповая для так званай працэдуры. Але ... Гэта не змяняе яго асяроддзе ці не так? Як гэта зрабіць? Давайце паспрабуем:

# The *wrong* way of doing it
age = 0
def setAge(a):
age = a
setAge(100)
print age
# Prints "0"

Што тут не так? Праблема ў тым, што функцыя setAge стварае свае ўласныя лакальныя зменныя, таксама названы як age якіх бачны толькі ўсярэдзіне setAge . Як мы можам пазбегнуць гэтага? Мы можам выкарыстоўваць нешта, званае global variables .

Нататка: Глабальныя зменныя не выкарыстоўваць шмат Python. Яны лёгка прывесці да дрэннай структуры, ці тое, што завецца spaghetti code . Я выкарыстоўваю іх тут, каб прывесці да больш складаных метадаў - калі ласка, пазбягаць іх, калі можна.

Распавядаючы перакладніка, што зменная з'яўляецца глабальнай (зроблена з заявай, як global age ), мы эфектыўна распавесці ім карыстацца зменнай па-за функцыі, замест стварэння новай лакальнай 1. (Такім чынам, яна носіць глабальны характар, у адрозненне ад мясцовых.) Праграма можа быць перапісана так:

# The correct, but not-so-good way of doing it
age = 0
def setAge(a):
global age
age = a
setAge(100)
print age
# Prints "100"

Калі вы пазнаяце пра аб'екты (гл. ніжэй), вы ўбачыце, што больш падыходным спосабам для гэтага будзе выкарыстанне аб'екта з age уласнасці і setAge метаду. У частцы, прысвечаным структур дадзеных, вы ўбачыце некаторыя лепш прыклады функцый, якія змяняюць іх асяроддзі.

Ну - што о рэальнай функцыі, ці што? Што такое функцыя, насамрэч? Матэматычных функцый, як свайго роду "машына", якая атрымлівае доступ да ўводу і вылічае вынік. Ён верне той жа вынік кожных разоў, калі прадстаўлены з такой жа ўваход. Напрыклад:

def square(x):
return x*x

Гэта гэтак жа, як матэматычныя функцыі / (х) = х 2. Ён паводзіць сябе як добры функцыі, у тым, што гэта толькі абапіраецца на ўваход, і яно не зменіць сваё асяроддзе, у любым выпадку.

Такім чынам - я выказаў два шляхі забеспячэння функцый: Одзін тып больш падобны на працэдуры, і не вяртае вынік, а другі больш падобны на матэматычную функцыю і не рабіць нічога, акрамя вяртанні ў выніку (амаль). Вядома, гэта можна зрабіць нешта сярэдняе паміж дзвюма крайнасцямі, хоць, калі функцыі змены рэчаў, гэта павінна быць ясна, што ён робіць. Вы маглі б сігнал гэта праз сваю назву, напрыклад, выкарыстоўваючы толькі імя назоўнік для "чыстай" функцыі, такія як square і неабходна для працэдуры тыпу функцыі, такія як setAge .

Падрабязней Інгрэдыенты - структуры дадзеных


Ну - вы ведаеце, шмат ужо: Як атрымаць уваходны і выходны падаць, як структуры складаных алгарытмаў (праграм) і для выканання арыфметычных і яшчэ лепшае яшчэ наперадзе.

Якія інгрэдыенты мы выкарыстоўвалі ў нашых праграмах, дагэтуль? Лікі і радкі. Правільна? Kinda сумна ... Не давайце пазнаёмімся пара іншых інгрэдыентаў, каб зрабіць рэчы трохі цікавейшай.

Дадзеныя структуры кампанентаў гэтай структуры дадзеных. (Неспадзеўка, неспадзеўка ...) адзін лік насамрэч не шмат структура, ці не так? Але, дапушчальны, мы жадаем больш нумары разам, каб адзін інгрэдыент - гэта было б вызначаную структуру. Напрыклад, мы маглі б спіс лікаў. Гэта проста:

[3,6,78,93]

Я згадаў спісы ў частцы, прысвечаным завесы, але насамрэч не казаць шмат пра іх. Ну - гэта, як вы іх прыняць. Проста спіс элементаў, падзеленых коскамі і складзены ў дужкі.

Давайце скакаць у прыклад, які вылічае простых лікаў (лікаў падзяляецца толькі на сябе ці 1):

# Calculate all the primes below 1000
# (Not the best way to do it, but...)
result = [1]
candidates = range(3,1000)
base = 2
product = base
while candidates:
while product < 1000:
if product in candidates:
candidates.remove(product)
product = product+base
result.append(base)
base = candidates[0]
product = base
del candidates[0]
result.append(base)
print result

Новыя рэчы у гэтым прыкладзе ...

  1. Убудаваная функцыя range насамрэч вяртае спіс, які можна выкарыстоўваць, як і ўсе іншыя спісы. (Яна складаецца з першы індэкс, але не апошні.)
  2. Спіс можа быць скарыстаны ў якасці логікі зменнай. Калі гэта не пусты, то праўда - калі яно пустое, тое яно з'яўляецца ілжывым. Такім чынам, while candidates сродкаў ", а спіс кандыдатаў імя не з'яўляецца пустым" ці проста "Хоць Ёсць яшчэ кандыдатаў".
  3. Вы можаце напісаць if someElement in someList праверыць, калі які-небудзь элемент у спісе.
  4. Вы можаце напісаць someList.remove(someElement) , каб выдаліць someElement ад someList .
  5. Вы можаце дадаць элемент у спіс з дапамогай someList.append(something) . Насамрэч, вы можаце выкарыстоўваць + таксама (як і ў someList = someList+[something] ), але гэта не так эфектыўна.
  6. Вы можаце атрымаць на элемент спісу, падаўшы свае пазіцыі ў якасці ліку (там, дзе першы элемент ні дзіўна, з'яўляецца элементам 0 ) у дужках пасля імя ў спісе. Такім чынам someList[3] з'яўляецца чацвёртым элементам спісу someList . (Падрабязней пра гэта ніжэй).
  7. Вы можаце выдаліць зменных з дапамогай ключавога слова del . Яна таксама можа быць скарыстаны (як тут), каб выдаліць элементы са спісу. Такім чынам del someList[0] выдаляе першы элемент someList . Калі спіс [1,2,3] да выдалення, тое было б [2,3] пасля.

Перш чым перайсці да тлумачэння таямніц элементаў індэксавання спісу, я дам кароткае тлумачэнне прыкладам.

Гэта версія старажытней алгарытм, які атрымаў назва "Рэшата Erastothenes" (ці штосьці блізкае да гэтага). Ён лічыць, набор (ці ў дадзеным выпадку, спіс) кандыдата нумара, а затым сістэматычна выдаляе нумары як вядома, не будзе простых лікаў. Адкуль мы ведаем? Таму што яны з'яўляюцца прадуктамі дзве іншыя лічбы.

Пачнём са спісам кандыдатаў, якія змяшчаюць лічбы [2 .. 999] - мы ведаем, што адзін з'яўляецца галоўным (насамрэч, гэта можа быць ці не быць, у залежнасці ад таго, хто вы спытаеце), і мы жадалі, каб усе простыя лікі да 1000. (Насамрэч, наш спіс кандыдатаў [3 .. 999], а таксама 2 кандыдата, паколькі гэта наша першая base ). У нас таксама ёсць спіс пад назвай result якога ва ўсе часы ўтрымоўвае абноўленыя вынікі дагэтуль. Па-першае, гэты спіс утрымоўвае толькі нумар 1. У нас таксама ёсць зменная base . Для кожнай ітэрацыі ("круглы") алгарытму, мы выдаляем усе нумары, якія з'яўляюцца аднымі шматдыскавы гэтай базы нумар (а гэта заўсёды самы маленькі з кандыдатаў). Пасля кожнай ітэрацыі мы ведаем, што найменшы лік злева прэм'ер (бо ўсе лікі, якія з'яўляюцца прадуктамі дробныя выдаляюцца - атрымаць яго?). Такім чынам, мы дадамо яго ў выніку ўсталёўкі новай базы па гэтым нумары, і выдаліць яго са спісу кандыдатаў (так мы не будзем апрацоўваць яго зноў.) Калі кандыдат спіс пусты, то вынік будзе ўтрымоўваць спіс усіх простых лікаў . Разумны, так?

Інфармацыя для разважання: Што асаблівага ў першую ітэрацыю? Тут база 2, але гэта таксама здымаецца ў "прасейванні"? Чаму? Чаму не адбылося, што ў іншых базах? Ці можам мы быць упэўнены, што product заўсёды знаходзіцца ў спісе кандыдатаў, калі мы жадаем, каб выдаліць яго? Чаму?

Зараз - што далей? Ах, так ... індэксаванні. І нарэзкі. Гэтыя шляхі, каб дабрацца да асобных элементаў спісу Python. Вы ўжо бачылі звычайнай індэксацыі ў дзеянні. Гэта вельмі проста. Насамрэч, я сказаў вам усё, што трэба ведаць пра яго, за выключэннем адной рэчы: Адмоўныя індэксы ў канцы спісу. Такім чынам, someList[-1] з'яўляецца апошнім элементам someList , someList[-2] з'яўляецца элементам раней, і гэтак далей.

Нарэзкі, аднак, павінны быць новым для вас. Гэта падобна на індэксаванне, акрамя як з нарэзкі можна арыентаваць увесь кавалак спіс, а не толькі аднаго элемента. Як гэта робіцца? Напрыклад, так:

food = ["spam","spam","eggs","sausages","spam"]
print food[2:4]
# Prints "['eggs', 'sausages']"

Падрабязней Абстракцыя - аб'ектаў і аб'ектна-арыентаванае праграмаванне


Зараз ёсць самалёт-слова, калі калі-небудзь была адна: "Аб'ектна-арыентаванае праграмаванне".

Як частка назвы, аб'ектна-арыентаванага праграмавання з'яўляецца проста яшчэ адзін спосаб абстрагуючыся ад дэталяў. Працэдуры абстрактнай простай заявы ў больш складаныя аперацыі, даўшы ім імя. У ООП, мы не проста лячыць аперацыі такім чынам, але аб'екты. (Зараз, што павінна было вялікай нечаканасцю, а?) Напрыклад, калі мы павінны былі зрабіць спам падрыхтоўкі-праграмы, замест таго каб пісаць шмат працэдур, якія дакранаюцца тэмпературы, чакай, інгрэдыенты і г.д., мы можа адначасова разам у спам-аб'ект. Ці, можа быць, мы маглі б абсалютна аб'екта і гадзіны-аб'ект таксама ... Такім чынам, рэчы, як тэмпература будзе проста атрыбуты спам-аб'ект, а час можа быць прачытана з гадзін-аб'ект. І каб наша праграма-тое зрабіць, мы можам навучыць наш аб'ект некаторыя метады: напрыклад, печ можа ведаць, як рыхтаваць спам т.д.

Так - як мы робім гэта ў Python? Ну, мы не можам проста стварыць аб'ект непасрэдна. Замест таго каб проста зрабіць пячы, мы робім рэцэпт апісвальны як печы. Гэты рэцэпт затым апісвае клас аб'ектаў, які мы завём печы. Вельмі простая печ класа могуць быць:

class Oven:
def insertSpam(self, spam):
self.spam = spam
def getSpam(self):
return self.spam

Зараз, выглядае гэта дзіўна, ці што?

Новыя рэчы у гэтым прыкладзе ...

  1. Класы аб'ектаў вызначаюцца з дапамогай ключавога слова class .
  2. Імёны класаў звычайна пачынаюцца з вялікай літары, у той час як функцыі і зменныя (а таксама метады і атрыбуты) пачынаюць з малой літары.
  3. Метады (т. е. функцый ці аперацый, якія аб'ектаў ведаю, як гэта зрабіць), вызначаюцца ў звычайным парадку, але усярэдзіне блока класа.
  4. Усе метады аб'екта павінны мець першага параметру завецца self (ці нешта падобнае ...) розум (спадзяюся) стала ясна, у адно імгненне.
  5. Атрыбуты і метады аб'екта даступныя так: mySpam.temperature = 2 , ці dilbert.be_nice() .

Я думаю, што сёе-тое яшчэ трохі невыразна прыклад. Напрыклад, што гэта self справа? І зараз, калі мы рэцэпт аб'екта (напрыклад, класа), як мы насамрэч зрабіць аб'ект?

Давайце вырашаць апошняя кропка ў першую чаргу. Аб'ект ствараецца з дапамогай выкліку імя класа, як калі б яна была функцыя:

 myOven = Oven() 

myOven зараз утрымоўвае Oven аб'екта, як правіла, завецца асобнікам класа Oven . Давайце выкажам здагадку, што мы зрабілі клас Spam , а таксама, тады мы маглі б зрабіць штосьці накшталт:

 mySpam = Spam() myOven.insertSpam(mySpam) 

myOven.spam зараз утрымоўваюць mySpam . Як жа так? Таму што, калі мы завём адзін з метадаў аб'екта, першы параметр, як правіла, звалі self , заўсёды ўтрымоўвае сам аб'ект. (Разумны, так?) Такім чынам, лінія self.spam = spam усталёўвае атрыбут spam бягучага Oven аб'екта значэнне параметру spam . Заўважым, што гэта дзве розныя рэчы, хоць яны абодва званыя spam у дадзеным прыкладзе.


Адказ да задачы 3



Вось вельмі кароткі варыянт алгарытму:

def euclid(a,b):
while b:
a,b = b,a % b
return a

Спасылкі


[1] Рэцэпт Салата Fiesta Спам узяты з Hormel Foods лічбавая кніга рэцэптаў

Creative Commons License

Імгненнае Хакінг у Магнус Лі Хетленд пад ліцэнзіяй Creative Commons Attribution 3.0 Unported License.

Дазволу выходзіць за рамкі дадзенай ліцэнзіі можа быць даступная на http://hetland.org/contact.